Форум программистов, компьютерный форум, киберфорум
Наши страницы
DirectX
Войти
Регистрация
Восстановить пароль
 
Rainmaker93
4 / 4 / 2
Регистрация: 12.09.2013
Сообщений: 69
1

Спрайтовая анимация DirectX10

01.11.2013, 18:28. Просмотров 490. Ответов 0
Метки нет (Все метки)

Доброго времени суток!
хочу написать спрайтовую анимацию на C++ с помощью DirectX10
у меня есть код, выводящий один спрайтовый объект.
Помогите пожалуйста переделать его так, чтобы он выводил поочередно каждый элемент массива типа спрайт

вот собственно код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
//--------------------------------------------------------------------------------------
//  Первая программа в DirectX 10
//--------------------------------------------------------------------------------------
 
#include <windows.h>
#include <d3d10.h>
#include <d3dx10.h>
#include <mmsystem.h>
 
// Ширина и высота окна
#define WINDOW_WIDTH  640
#define WINDOW_HEIGHT 480
 
 
//--------------------------------------------------------------------------------------
// Глобальные переменные
//--------------------------------------------------------------------------------------
HWND        g_hWnd = NULL;
D3D10_DRIVER_TYPE         g_driverType = D3D10_DRIVER_TYPE_NULL;
ID3D10Device*             g_pd3dDevice = NULL;
IDXGISwapChain*           g_pSwapChain = NULL;
ID3D10RenderTargetView*   g_pRenderTargetView = NULL;
 
ID3D10ShaderResourceView* g_pShaderResource = NULL;
 
ID3DX10Sprite *           g_pSprite = NULL;
 
//--------------------------------------------------------------------------------------
// Прототипы функций
//--------------------------------------------------------------------------------------
HRESULT             InitWindow( HINSTANCE hInstance, int nCmdShow );
HRESULT             InitDirect3D10();
LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
void                Cleanup();
void                RenderScene();
 
//--------------------------------------------------------------------------------------
// С этой функции начинается выполнение программы
//--------------------------------------------------------------------------------------
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
    // Создаем окно приложения
    if( FAILED( InitWindow( hInstance, nCmdShow ) ) )
        return 0;
    // Инициализируем Direct3D
    if( FAILED( InitDirect3D10() ) )
    {
        Cleanup();
        return 0;
    }
 
    // Цикл обработки сообщений
    MSG msg = {0};
    while( WM_QUIT != msg.message  )
    {
        if( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) )
        {
            TranslateMessage( &msg );
            DispatchMessage( &msg );
        }
        else
        {
            RenderScene();
        }
 
    }
 
    return (int) msg.wParam;
}
 
//--------------------------------------------------------------------------------------
// Регистрация класса и создание окна
//--------------------------------------------------------------------------------------
HRESULT InitWindow( HINSTANCE hInstance, int nCmdShow )
{
    // Регистрируем класс окна
    WNDCLASSEX wc;
    wc.cbSize = sizeof(WNDCLASSEX); 
    wc.style          = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc    = WndProc;
    wc.cbClsExtra     = 0;
    wc.cbWndExtra     = 0;
    wc.hInstance      = hInstance;
    wc.hIcon          = NULL;
    wc.hCursor        = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
    wc.lpszMenuName   = NULL;
    wc.lpszClassName  = L"SimpleWindowClass";
    wc.hIconSm        = LoadIcon(NULL, IDI_APPLICATION);
    if( !RegisterClassEx(&wc) )
        return E_FAIL;
 
    // Создаем окно
    g_hWnd = CreateWindow(
        L"SimpleWindowClass", 
        L"DirectX 10: Выводим картинку", 
        WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, 
        CW_USEDEFAULT, 
        WINDOW_WIDTH,
        WINDOW_HEIGHT,
        NULL,
        NULL,
        hInstance,
        NULL);
 
    // Если не удалось создать окно - выходим из функции
    if( !g_hWnd )
        return E_FAIL;
    // Отображаем окно на экране
    ShowWindow( g_hWnd, nCmdShow );
    UpdateWindow(g_hWnd);
 
    return S_OK;
}
 
//--------------------------------------------------------------------------------------
// Инициализация Direct3D
//--------------------------------------------------------------------------------------
HRESULT InitDirect3D10()
{
    HRESULT hr = S_OK;
 
    // Размеры клиентской области окна
    RECT rc;
    GetClientRect( g_hWnd, &rc );
    UINT width = rc.right - rc.left;
    UINT height = rc.bottom - rc.top;
 
    // Список возможных типов устройства
    D3D10_DRIVER_TYPE driverTypes[] = 
    {
        D3D10_DRIVER_TYPE_HARDWARE,
        D3D10_DRIVER_TYPE_REFERENCE,
    };
    UINT numDriverTypes = sizeof(driverTypes) / sizeof(driverTypes[0]);
 
    // Заполняем структуру 
    DXGI_SWAP_CHAIN_DESC sd;
    ZeroMemory( &sd, sizeof(sd) );
    sd.BufferCount = 1;
    sd.BufferDesc.Width = width;
    sd.BufferDesc.Height = height;
    sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
    sd.BufferDesc.RefreshRate.Numerator = 60;
    sd.BufferDesc.RefreshRate.Denominator = 1;
    sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
    sd.OutputWindow = g_hWnd;
    sd.SampleDesc.Count = 1;
    sd.SampleDesc.Quality = 0;
    sd.Windowed = TRUE;
 
    // Пытаемся создать устройство, проходя по списку
    // как только получилось - выходим из цикла
    for( UINT driverTypeIndex = 0; driverTypeIndex < numDriverTypes; driverTypeIndex++ )
    {
        g_driverType = driverTypes[driverTypeIndex];
        hr = D3D10CreateDeviceAndSwapChain( NULL, g_driverType, NULL, 0, 
            D3D10_SDK_VERSION, &sd, &g_pSwapChain, &g_pd3dDevice );
        if( SUCCEEDED( hr ) )
            break;
    }
    if( FAILED(hr) )
        return hr;
 
    // Представление данных для
    // буфера визуализации
    ID3D10Texture2D *pBackBuffer;
    hr = g_pSwapChain->GetBuffer( 0, __uuidof( ID3D10Texture2D ), (LPVOID*)&pBackBuffer );
    if( FAILED(hr) )
        return hr;
   // Создадим представление данных
    hr = g_pd3dDevice->CreateRenderTargetView( pBackBuffer, NULL, &g_pRenderTargetView );
    pBackBuffer->Release();
    if( FAILED(hr) )
        return hr;
   // Свяжем буфер визуализации с графическим конвейером
    g_pd3dDevice->OMSetRenderTargets( 1, &g_pRenderTargetView, NULL );
 
    // Настроим область отображения
    D3D10_VIEWPORT vp;
    vp.Width = width;
    vp.Height = height;
    vp.MinDepth = 0.0f;
    vp.MaxDepth = 1.0f;
    vp.TopLeftX = 0;
    vp.TopLeftY = 0;
    g_pd3dDevice->RSSetViewports( 1, &vp );
 
    D3DX10_IMAGE_INFO InfoFromFile;
    D3DX10_IMAGE_LOAD_INFO LoadImageInfo;
 
    // Читаем информацию об изображении из файла
    hr = D3DX10GetImageInfoFromFile(L"DirectX10.bmp", NULL, &InfoFromFile, NULL);
 
    LoadImageInfo.Width = InfoFromFile.Width;
    LoadImageInfo.Height = InfoFromFile.Height;
    LoadImageInfo.Depth = InfoFromFile.Depth;
    LoadImageInfo.FirstMipLevel = 0;
    LoadImageInfo.MipLevels = 1;
    LoadImageInfo.Usage = D3D10_USAGE_DEFAULT;
    LoadImageInfo.BindFlags = D3D10_BIND_SHADER_RESOURCE ;
    LoadImageInfo.CpuAccessFlags = 0;
    LoadImageInfo.MiscFlags = 0;
    LoadImageInfo.Format = InfoFromFile.Format;
    LoadImageInfo.Filter = D3DX10_FILTER_NONE;
    LoadImageInfo.MipFilter = D3DX10_FILTER_NONE;
    LoadImageInfo.pSrcInfo = &InfoFromFile;
 
    // Создаем представление данных как ресурса шейдера
    hr = D3DX10CreateShaderResourceViewFromFile(g_pd3dDevice, L"DirectX10.bmp", &LoadImageInfo, NULL, &g_pShaderResource, NULL);
    if( FAILED(hr) )
        return hr;
    // Создаем спрайтовый объект
    hr = D3DX10CreateSprite(g_pd3dDevice, 1, &g_pSprite);
    if( FAILED(hr) )
        return hr;
 
    return S_OK;
}
 
//--------------------------------------------------------------------------------------
// Прорисовка трехмерной сцены
//--------------------------------------------------------------------------------------
void RenderScene()
{
    HRESULT hr;
    // Очищаем вторичный буфер
    //(компоненты красного, зеленого, синего, прозрачность)
    float ClearColor[4] = { 0.1f, 0.5f, 0.1f, 1.0f }; 
    g_pd3dDevice->ClearRenderTargetView( g_pRenderTargetView, ClearColor );
 
    D3DXMATRIX mWorld;
    D3DXMATRIX mView;
    D3DXMATRIX mProjection;
 
    D3DXMatrixTranslation(&mWorld, 0.0f, 0.0f, 0.0f);
    D3DXMatrixPerspectiveFovLH( &mProjection, (float)D3DX_PI/4, 1.333f, 0.0f, 1.0f );
 
    g_pSprite->SetProjectionTransform(&mProjection);
 
    D3DXVECTOR3 vEyePt   ( 0.0f, 0.0f,-3.0f );
    D3DXVECTOR3 vLookatPt( 0.0f, 0.0f, 0.0f );
    D3DXVECTOR3 vUpVec   ( 0.0f, 1.0f, 0.0f );
    D3DXMatrixLookAtLH( &mView, &vEyePt, &vLookatPt, &vUpVec );
 
    g_pSprite->SetViewTransform(&mView);
 
    g_pSprite->Begin( D3DX10_SPRITE_SORT_TEXTURE ); 
 
    D3DX10_SPRITE SpriteToDraw;
 
    SpriteToDraw.matWorld = mWorld;
    
    SpriteToDraw.TexCoord.x = 0.0f;
    SpriteToDraw.TexCoord.y = 0.0f;
 
    SpriteToDraw.TexSize.x = 1.0f;
    SpriteToDraw.TexSize.y = 1.0f;
    SpriteToDraw.ColorModulate = D3DXCOLOR(1.0f,1.0f,1.0f,1.0f);
    SpriteToDraw.pTexture = g_pShaderResource;
    SpriteToDraw.TextureIndex = 0;
 
    hr=g_pSprite->DrawSpritesBuffered(&SpriteToDraw, 1);
    if (FAILED (hr) )
        MessageBox (NULL,L"Ошибка при выводе спрайта",L"ОШИБКА",0);
 
    g_pSprite->Flush();
    g_pSprite->End();
 
    g_pSwapChain->Present( 0, 0 );
}
//--------------------------------------------------------------------------------------
// Обработка сообщений
//--------------------------------------------------------------------------------------
LRESULT CALLBACK WndProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam )
{    
    switch (message) 
    {
 
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
 
    case WM_KEYDOWN:
        {
            if (wParam== VK_ESCAPE)
                PostQuitMessage(0);
            return 0;
        };
        break;
 
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
 
    return 0;
}
 
//--------------------------------------------------------------------------------------
// Очистка памяти
//--------------------------------------------------------------------------------------
void Cleanup()
{
    if( g_pd3dDevice ) g_pd3dDevice->ClearState();
 
    if( g_pRenderTargetView ) g_pRenderTargetView->Release();
    if( g_pSwapChain ) g_pSwapChain->Release();
    if( g_pd3dDevice ) g_pd3dDevice->Release();
 
    if ( g_pSprite ) g_pSprite->Release();
    if ( g_pShaderResource ) g_pShaderResource->Release();
 
 
}


З.Ы
код взят из мною изученной книги автора Алексея Попова "DirectX10 - это просто"
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.11.2013, 18:28
Ответы с готовыми решениями:

Не компирилуется проект на DirectX10
Какая ситуация, купил книгу А.Попов &quot;Directx10&quot;, там он использовал в книге...

DirectX10 для Windows XP пойдет?
DirectX10 для Windows XP пойдет? А то у меня книга DirectX 10 это просто.

спрайтовая анимация
рисую так: void Sprite(HDC hdc, LPCWSTR Path, int x, int y, int Width, int...

Спрайтовая анимация
Может кто реализовывал такое ?? написал клас спрайт который унаследует Thread....

спрайтовая анимация
помогите никак не работает написанная мной функция :( (все по методичке...

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.11.2013, 18:28

Спрайтовая анимация в OpenGL
Здравствуйте. Собственно, вопрос таков: как реализовать спрайтовую...

Спрайтовая анимация с 3 движущимися объектами
Добрый день , есть у кого пример спрайтовой анимации с 3 объектами?можно...

Движки и DirectX10
Моя видеокарта - HDGraphics 2000, не поддерживает DirectX 11, а только -...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru