Форум программистов, компьютерный форум, киберфорум
DirectX
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.61/57: Рейтинг темы: голосов - 57, средняя оценка - 4.61
 Аватар для programina
2062 / 619 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2

Открываю исходники Progamina3DEngine = 39 дней работы с DirectX

19.11.2011, 22:48. Показов 11631. Ответов 67
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Вот решила перейти на Опен ГЛ и поэтому мой проект с Директ Икс выкладываю здесь. Новичкам будет полезно посмотреть, как я пыталась реализовать загрузчик моделей эксортированных при помощи максскрипта в свой формат моделей, с последующей трансформацией в бинарный файл читаемый из движка.

Опен Гльщики я иду к вам
Вложения
Тип файла: zip Programina3DEngineSDK.zip (870.9 Кб, 354 просмотров)
9
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
19.11.2011, 22:48
Ответы с готовыми решениями:

Открываю исходники через блокнот, а там вместо русских букв всякая муть
В IDE корректно отображает русские символы, и при запуске программы все тип топ. А вот когда открываю исходники другими не пробовал, дабы...

Исходники Проектов на DirectX
Здравствуйте программисты! Дай думаю напишу, может реально кто кинет ссылки где можно скачать готовые исходники: минипроекты с...

Открываю текст в мемо, затем открываю другой, но первый остается, как удалить?
Нужно, чтобы при открытии текста в мемо, предыдущий текст удалялся и открывался только текуший.

67
184 / 24 / 4
Регистрация: 18.01.2011
Сообщений: 359
28.11.2011, 09:59
Студворк — интернет-сервис помощи студентам
Наконец-то посмотрел рабочую программу. Ну...по моему очень успешно!
1
 Аватар для programina
2062 / 619 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
28.11.2011, 16:37  [ТС]
Цитата Сообщение от Андрей2011 Посмотреть сообщение
Наконец-то посмотрел рабочую программу. Ну...по моему очень успешно!
Работает? Скажи как сделал, чтобы другие, у кого не получается запустить, тоже смогли.
0
184 / 24 / 4
Регистрация: 18.01.2011
Сообщений: 359
29.11.2011, 11:03
ну я просто 1й раз открывал на рабочем а 2й на домашнем. Дома более мощный ПК. У вас, уважаемая, оч высокие требования к игре))
А код ваш не компилируется у меня. А жаль.
0
 Аватар для programina
2062 / 619 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
29.11.2011, 17:06  [ТС]
Цитата Сообщение от Андрей2011 Посмотреть сообщение
ну я просто 1й раз открывал на рабочем а 2й на домашнем. Дома более мощный ПК. У вас, уважаемая, оч высокие требования к игре))
А код ваш не компилируется у меня. А жаль.
Нет, просто у вас на рабочем не установлен директикс наверно, попробуйте положить рядом с .ехе файл d3dx9_43.dll (если у вас не последняя версия директикса) для проекта VC, или файл d3dx9.dll для проекта DevC++.
Код из проекта VC 100% рабочий(иначе как я его скомпилировала), но скомпилированная программа не запускается из Visual C++, запускается двойным кликом по .ехе
Также проект из VC требует возможно микрософт визуал редистрибютайбле
0
184 / 24 / 4
Регистрация: 18.01.2011
Сообщений: 359
29.11.2011, 20:07
Да. это все объясняет. я пишу на VC++.
0
 Аватар для Klawg
0 / 0 / 0
Регистрация: 08.09.2011
Сообщений: 45
14.12.2011, 09:16
Скажите пожалуйста с помощью какой книги или сайта вы занимались этим?)
0
184 / 24 / 4
Регистрация: 18.01.2011
Сообщений: 359
14.12.2011, 10:44
Думаю выскажу общее мнение, ответив, что ЭТИМ мы занимаемся благодаря порывам души, и стремлению к совершенству. А еще, дабы сделать этот мир лучше!
0
 Аватар для ImAlexSmith
325 / 114 / 7
Регистрация: 01.05.2011
Сообщений: 283
Записей в блоге: 3
06.01.2012, 18:26
programina, можно я тут маленько поматерюсь? Ну кто ж так программы то пишет, а?
Скачиваю, значится, запускаю компилированный экзешник. Все прикольно, побегал, поглядел на банки. Хотел попинать - не получилось. Да ну и фиг с ним, закрываю.
Через какое то время мне что-то понадобилось в диспетчере задач. Ctrl+Alt+Del. И что, думаешь, я там вижу, м? GAME.exe и project(VC)
ps: Закрывал на Alt+F4. На Esc вроде не остается
0
 Аватар для programina
2062 / 619 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
06.01.2012, 18:45  [ТС]
Цитата Сообщение от Alex Smith Посмотреть сообщение
Ну кто ж так программы то пишет, а?
Я пишу программы так.

Цитата Сообщение от Alex Smith Посмотреть сообщение
GAME.exe и project(VC)
project(VC) вы тоже на esc хотели закрыть

Скорее всего, вы свернули программу, вот она и осталась в диспетчере.

PS: и не надо ворчать, я эту программу не для продажи делала, а как свое хобби, не нравится выкладывайте свои программы.
0
 Аватар для ImAlexSmith
325 / 114 / 7
Регистрация: 01.05.2011
Сообщений: 283
Записей в блоге: 3
06.01.2012, 19:04
Цитата Сообщение от programina Посмотреть сообщение
PS: и не надо ворчать, я эту программу не для продажи делала, а как свое хобби, не нравится выкладывайте свои программы.
Загляни в ветку XNA, ага?

Цитата Сообщение от programina Посмотреть сообщение
project(VC) вы тоже на esc хотели закрыть
в смысле project(VC).exe. И таки да, оно закрылось. Но таки не должно было, нэ?

Цитата Сообщение от programina Посмотреть сообщение
Скорее всего, вы свернули программу, вот она и осталась в диспетчере.
Ну точно свернуть от Alt+F4 я не отличу

Не думал, что так в штыки отреагируешь. ИМХО, это были замечания по делу.
2
5 / 5 / 0
Регистрация: 14.10.2010
Сообщений: 104
14.01.2012, 04:47
Открыл второй проект, откомпил, запустил - ЧЁРНЫЙ ЭКРАН. И дело тут не в компе ок да.
Когда запускаешь просто экзешник в Release то всё пашет, до тех пор пока ты не решил нажать Alt+Tab после этого беда - опять чёрный экран
Миниатюры
Открываю исходники Progamina3DEngine = 39 дней работы с DirectX   Открываю исходники Progamina3DEngine = 39 дней работы с DirectX  
0
 Аватар для programina
2062 / 619 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
14.01.2012, 09:51  [ТС]
Для того, чтобы можно было сворачивать 3D программу в directX надо сделать спец. функцию, кот. реиницилизирует все, во время разворачивания окна. То есть, те же действия, что и при начальной инициализации устройства, клавы, мыши и т.п.
0
 Аватар для Adler
80 / 85 / 19
Регистрация: 07.05.2009
Сообщений: 336
Записей в блоге: 1
02.03.2012, 16:27
Немного переделал . Оцените.
Миниатюры
Открываю исходники Progamina3DEngine = 39 дней работы с DirectX  
Вложения
Тип файла: rar VertexLighting(02.03.2012).rar (87.3 Кб, 47 просмотров)
2
 Аватар для Adler
80 / 85 / 19
Регистрация: 07.05.2009
Сообщений: 336
Записей в блоге: 1
02.03.2012, 16:46
1
 Аватар для programina
2062 / 619 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
04.03.2012, 08:07  [ТС]
Цитата Сообщение от Adler Посмотреть сообщение
Немного переделал . Оцените.
Прикольное освещение
0
2 / 3 / 0
Регистрация: 20.09.2009
Сообщений: 101
04.03.2012, 23:33
пасиб большое, всё работает
0
 Аватар для programina
2062 / 619 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
19.04.2012, 10:58  [ТС]
Если получится и если будет свободное время, то добавлю камеру от 3-го лица с управлением персонажем как в Mass Effect
1
 Аватар для programina
2062 / 619 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
23.04.2012, 09:18  [ТС]
Цитата Сообщение от programina Посмотреть сообщение
Если получится и если будет свободное время, то добавлю камеру от 3-го лица с управлением персонажем как в Mass Effect
Сделала прикольную камеру от 3-го лица как в МЕ, но есть один недастаток: когда персонаж бежит в одну сторону, а потом разворачивается на 180° при определенном повороте мышки не срабатывает разворот, сейчас работаю над этой проблемой, если получится сразу выложу код обработки движения перса

Добавлено через 7 минут
Думаю вынести свою камеру в отдельную тему или попросить модераторов переименовать мою тему в "Создание 3d движка" итп
1
 Аватар для programina
2062 / 619 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
25.04.2012, 20:32  [ТС]
Вчера сделала камеру от 3-го лица, вроде все работает, надо немного оформить код, если успею, то вечeром выложу код

Добавлено через 10 часов 24 минуты
Все...
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
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
/**
 
 Copyright (c) 2011-2012, programina.            
 
 Компилируется в CodeBlocks 10.05 с компилятором MinGW
 Программа не работает без d3dx9_43.dll ( directx redist июльской сборки 2010 года  )
 
 Клавиша ESCAPE завершает работу программы
 Клавиши W, S, A, D - перемещение перса
 Мышь - вращение камеры
 
**/
 
#define INITGUID
#define DIRECTINPUT_VERSION 0x800
 
#include <C:\DXSDK\Include\d3d9.h>  //
#include <C:\DXSDK\Include\d3dx9.h> // Подключаемые заголовочные файлы
#include <C:\DXSDK\Include\dinput.h>    // У меня заголовочные файлы лежат в папке 'С:\DXSDK\Include\'
#include <C:\DXSDK\Include\d3dx9mesh.h> // Исправьте пути на свои
#include <C:\DXSDK\Include\d3dx9math.h> //
 
#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
#include <io.h>
 
 
IDirect3D9      *d3d        = 0;
IDirect3DDevice9    *d3ddev     = 0;
IDirectInput8       *di     = 0;
IDirectInputDevice8 *mouse      = 0;
IDirectInputDevice8 *keyboard   = 0;
 
ID3DXMesh       *mesh       = 0;
ID3DXBuffer         *meshBuffer = 0;
IDirect3DTexture9   *meshTexture    = 0;
 
 
HINSTANCE   hinst;
int     nFunsterStil;
HWND        hwnd;
MSG     messages;
WNDCLASSEX  wincl;
 
// ширина и высота экрана
int iWidth  = GetSystemMetrics(SM_CXSCREEN);
int iHeight = GetSystemMetrics(SM_CYSCREEN);
 
// массивы имен модели и текстуры
const char  *modelName[4096];
const char  *textureName[4096];
 
// переменные вращения и движения камеры
float angleYaw      = 0.0;
float anglePitch    = 0.0;
float YawX      = 0.0;
float YawY      = 0.0;
float PitchX        = 0.0;
float PitchD        = 0.0;
float fPosX     = 0.0;
float fPosY     = 1.0;
float fPosZ     = 0.0;
 
// матрицы вида, проекции и объектов
D3DXMATRIX matView;
D3DXMATRIX matProjection;
D3DXMATRIX matWorldR[1024];
D3DXMATRIX matWorldT[1024];
 
// для работы с вводом
DIMOUSESTATE    dims;
char        kbstate[256];
 
float WAccel;           // скорость W
float SAccel;           // скорость S
float AAccel;           // скорость A
float DAccel;           // скорость D
 
float dltAccel;         // коэффициент нивелирующий ускорение и скорорсть при одновременном нажатии двух клавиш движения по разным осям на плоскости
 
float distcam   = 1.5;      // расстояние между камерой и персом
float f         = 1.0;      // Смещение камеры в бок
float angle     = 0.0;      // Разница между углом мыши и углом перса
float d_angle   = 0.0;      // Угол поворота перса
 
#define Pi 3.14159      // Число Пи
 
 
// позиция объекта и угол по 3 осям
float   modelX[8192];
float   modelY[8192];
float   modelZ[8192];
float   modelYaw[8192];
float   modelPitch[8192];
float   modelRoll[8192];
 
DWORD   i = 0;
 
#define MAX_SPEED 0.04
 
float   rot_spd = 0.0;
 
 
 
LRESULT CALLBACK WindowProcedure( HWND, UINT, WPARAM, LPARAM );
void InitWin();
void InitD3D();
void InitInput();
void Mouse();
void Keyboard();
void LoadModel( DWORD, const char*, const char* );
void DrawModel( DWORD, float, float, float, float, float, float );
void Projection( float, float, float );
void CameraTP( float, float, float, float, float, float, float, float );
void RotateAndMove();
void Release();
 
 
 
 
 
 
///===============================================================================================================================
/// Name:
/// Desc: Не знаю для чего еще она нужна, кроме выхода из программы при нажатии клавиши ESCAPE
///===============================================================================================================================
 
LRESULT CALLBACK WindowProcedure( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam )
{
    switch (message)
    {
        case WM_KEYDOWN:
            switch( wParam )
            {
                case VK_ESCAPE:
                    PostQuitMessage(0);
                    break;
            }
            break;
 
        default:
            return DefWindowProc (hwnd, message, wParam, lParam);
            break;
    }
    return 0;
}
 
 
///===============================================================================================================================
/// Name:
/// Desc: Инициализация окна
///===============================================================================================================================
 
void InitWin()
{
    wincl.hInstance     = hinst;
    wincl.lpszClassName = "GAME";
    wincl.lpfnWndProc   = WindowProcedure;
    wincl.style         = CS_DBLCLKS;
    wincl.cbSize        = sizeof (WNDCLASSEX);
    wincl.hIcon         = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hIconSm       = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hCursor       = LoadCursor (NULL, IDC_ARROW);
    wincl.lpszMenuName  = NULL;
    wincl.cbClsExtra    = 0;
    wincl.cbWndExtra    = 0;
    wincl.hbrBackground     = (HBRUSH)GetStockObject(BLACK_BRUSH);
    RegisterClassEx (&wincl);
    hwnd = CreateWindowEx ( 0, "GAME"," ", WS_POPUP, 0, 0, iWidth, iHeight, HWND_DESKTOP, 0,hinst, 0 );
 
    ShowWindow(hwnd, nFunsterStil);
    SetFocus(hwnd);
    UpdateWindow (hwnd);
    SetForegroundWindow(hwnd);
    ShowCursor(false);
}
 
 
///===============================================================================================================================
/// Name:
/// Desc: Инициализация DierctX
///===============================================================================================================================
 
void InitD3D()
{
    d3d = Direct3DCreate9( D3D_SDK_VERSION );
    D3DDISPLAYMODE d3ddm;
    d3d -> GetAdapterDisplayMode( D3DADAPTER_DEFAULT, &d3ddm );
 
    D3DPRESENT_PARAMETERS d3dpp;
    ZeroMemory( &d3dpp, sizeof(d3dpp) );
    d3dpp.BackBufferWidth           = iWidth;
    d3dpp.BackBufferHeight          = iHeight;
    d3dpp.AutoDepthStencilFormat        = D3DFMT_D24S8;
    d3dpp.EnableAutoDepthStencil        = true;
    d3dpp.BackBufferFormat          = D3DFMT_X8R8G8B8;
    d3dpp.SwapEffect            = D3DSWAPEFFECT_FLIP;
    d3dpp.Windowed                  = false;
    d3dpp.FullScreen_RefreshRateInHz    = D3DPRESENT_RATE_DEFAULT;
    d3dpp.PresentationInterval          = D3DPRESENT_INTERVAL_DEFAULT; // 60 Гц
 
    d3d     -> CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd, D3DCREATE_MIXED_VERTEXPROCESSING, &d3dpp, &d3ddev );
 
    d3ddev  -> SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE );
    d3ddev  -> SetRenderState( D3DRS_LIGHTING, false    );
    d3ddev  -> SetRenderState( D3DRS_ZENABLE, true      );
}
 
 
///===============================================================================================================================
/// Name:
/// Desc: Инициализация мыши и клавиатуры
///===============================================================================================================================
 
void InitInput()
{
        DirectInput8Create( GetModuleHandle(NULL),DIRECTINPUT_VERSION,IID_IDirectInput8,(void**)&di,NULL );
 
        di              -> CreateDevice( GUID_SysMouse,&mouse,NULL );
        mouse           -> SetDataFormat( &c_dfDIMouse );
        mouse           -> SetCooperativeLevel( hwnd,DISCL_FOREGROUND | DISCL_NONEXCLUSIVE );
        mouse           -> Acquire();
 
    di              -> CreateDevice( GUID_SysKeyboard,&keyboard,NULL );
        keyboard        -> SetDataFormat( &c_dfDIKeyboard );
        keyboard        -> SetCooperativeLevel( hwnd,DISCL_FOREGROUND | DISCL_NONEXCLUSIVE );
        keyboard        -> Acquire();
}
 
 
///===============================================================================================================================
/// Name:
/// Desc: Подсчет углов обзора камеры
///===============================================================================================================================
 
void Mouse()
{
    mouse -> GetDeviceState( sizeof(DIMOUSESTATE),&dims );
 
    angleYaw    += (dims.lX/125.0f +dims.lX/250.0f +dims.lX/500.0f +dims.lX/1000.0f)/10.0f;
    anglePitch  += (dims.lY/125.0f +dims.lY/250.0f +dims.lY/500.0f +dims.lY/1000.0f)/10.0f;
 
    if ( angleYaw >  2 * 3.1415926 )    { angleYaw = 0.0; }
    if ( angleYaw < -2 * 3.1415926 )    { angleYaw = 0.0; }
 
    YawX    =   cos(angleYaw);
    YawY    =   sin(angleYaw);
    PitchX  =       -sin(anglePitch);
 
    if (PitchX > 0) { PitchD = 1.0 - PitchX; }
    else        { PitchD = 1.0 + PitchX; }
 
    if (anglePitch >  1.0) anglePitch =  1.0;
    if (anglePitch < -1.0) anglePitch = -1.0;
}
 
 
///===============================================================================================================================
/// Name:
/// Desc: Подсчет скорости движения перса по осям X и Z
///===============================================================================================================================
 
void Keyboard()
{
    keyboard -> GetDeviceState( sizeof(kbstate),kbstate );
 
    if  ( (kbstate[DIK_W] & 0x80) && (kbstate[DIK_D] & 0x80) )  { dltAccel = 0.707 * 1.0; }
    else if ( (kbstate[DIK_W] & 0x80) && (kbstate[DIK_A] & 0x80) )  { dltAccel = 0.707 * 1.0; }
    else if ( (kbstate[DIK_S] & 0x80) && (kbstate[DIK_D] & 0x80) )  { dltAccel = 0.707 * 1.0; }
    else if ( (kbstate[DIK_S] & 0x80) && (kbstate[DIK_A] & 0x80) )  { dltAccel = 0.707 * 1.0; }
    else                                { dltAccel = 1.000 * 1.0; }
 
    if ( kbstate[DIK_W] & 0x80 && WAccel < MAX_SPEED )  { WAccel += 0.0005; }
    else                            { WAccel *= 0.90;   }
 
    if ( kbstate[DIK_S] & 0x80 && SAccel < MAX_SPEED )  { SAccel += 0.0005; }
    else                            { SAccel *= 0.90;   }
 
    if ( kbstate[DIK_A] & 0x80 && AAccel < MAX_SPEED )  { AAccel += 0.0005; }
    else                            { AAccel *= 0.90;   }
 
    if ( kbstate[DIK_D] & 0x80 && DAccel < MAX_SPEED )  { DAccel += 0.0005; }
    else                            { DAccel *= 0.90;   }
 
    /// вообщем та еще тригонометрия ... Изменяет скорость в зависимости от угла перса
    fPosX += ( WAccel * YawY );
    fPosZ += ( WAccel * YawX );
 
    fPosX -= ( SAccel * YawY );
    fPosZ -= ( SAccel * YawX );
 
    fPosX -= ( AAccel * YawX );
    fPosZ += ( AAccel * YawY );
 
    fPosX += ( DAccel * YawX );
    fPosZ -= ( DAccel * YawY );
}
 
 
///===============================================================================================================================
/// Name:
/// Desc: Рисует модель с параметрами позиционирования и повернутости по осям X, Y, Z
///===============================================================================================================================
 
void DrawModel( DWORD i, float modelX, float modelY, float modelZ, float modelYaw, float modelPitch, float modelRoll )
{
    D3DXMatrixRotationYawPitchRoll( &matWorldR[i], modelYaw, modelPitch, modelRoll );
    D3DXMatrixTranslation( &matWorldT[i], modelX, modelY, modelZ );
    d3ddev -> SetTransform( D3DTS_WORLD, &matWorldT[i] );
    d3ddev -> MultiplyTransform( D3DTS_WORLD, &matWorldR[i] );
 
    d3ddev -> SetTexture( 0, meshTexture );
    mesh -> DrawSubset( 0 );
}
 
 
///===============================================================================================================================
/// Name:
/// Desc: Загружает модель и текстуру
///===============================================================================================================================
 
void LoadModel( DWORD i, const char *modelName, const char *textureName )
{   
    D3DXLoadMeshFromX       ( modelName, D3DXMESH_SYSTEMMEM, d3ddev, NULL, &meshBuffer, NULL, &i, &mesh );
    D3DXCreateTextureFromFile   ( d3ddev, textureName, &meshTexture );
    meshBuffer -> Release();
}
 
 
///===============================================================================================================================
/// Name:
/// Desc: Проекция вида
///===============================================================================================================================
 
void Projection( float fAngleProjection, float fNear, float fFar )
{
    D3DXMatrixPerspectiveFovLH  ( &matProjection, fAngleProjection, (float)iWidth / (float)iHeight, fNear, fFar );
    d3ddev -> SetTransform      ( D3DTS_PROJECTION, &matProjection );
}
 
 
///===============================================================================================================================
/// Name:
/// Desc: Камера от 3-го лица, принимает параметры позиционирования, повернутости из предыдущих функций
///===============================================================================================================================
 
void CameraTP( float fPosX, float fPosY, float fPosZ, float YawY, float anglePitch, float YawX, float PitchD, float distcam )
{
    D3DXVECTOR3 vEyePt  ( fPosX-YawY*1.0, fPosY+anglePitch*1.0, fPosZ-YawX*1.0  );
    D3DXVECTOR3 vLookatPt   ( fPosX, fPosY, fPosZ                   );
    D3DXVECTOR3 vUpVec  ( 0.0f, 1.0f, 0.0f                  );
    D3DXMatrixLookAtLH  ( &matView, &vEyePt, &vLookatPt, &vUpVec );
    d3ddev -> SetTransform  ( D3DTS_VIEW, &matView );
}
 
 
///===============================================================================================================================
/// Name: RotateAndMove
/// Desc: Обеспечивает поворот перса в ту сторону, куда смотрит камера и неподвижность перса пока он не двигается
///===============================================================================================================================
 
void RotateAndMove()
{
    angle = d_angle - angleYaw;
 
    if ( (WAccel > 0.01 || SAccel > 0.01 || AAccel > 0.01 || DAccel > 0.01) && rot_spd < 0.1 )  { rot_spd += 0.01; }
    else                                                                                        { rot_spd *= 0.99; }
 
    if ( WAccel > 0.01 && SAccel < 0.01 && AAccel < 0.01 && DAccel < 0.01 )
    {
        if      ( sin(angle) > 0.1 )                    { d_angle -= rot_spd;           }
        else if ( sin(angle) <-0.1 )                        { d_angle += rot_spd;           }
        else if ( angle >= Pi - 0.11 && angle <= Pi+0.11 )          { d_angle -= rot_spd;           }
        else if ( angle <=-Pi + 0.11 && angle >=-Pi-0.11 )          { d_angle -= rot_spd;           }
        else if ( sin(angle) <= 0.1 && sin(angle) >= -0.1 )             { d_angle = angleYaw;           }
    }
 
    if ( SAccel > 0.01 && WAccel < 0.01 && AAccel < 0.01 && DAccel < 0.01 )
    {
        if      ( sin(angle+Pi) > 0.1 )                 { d_angle -= rot_spd;           }
        else if ( sin(angle+Pi) <-0.1 )                     { d_angle += rot_spd;           }
        else if ( angle >=-0.11 && angle <= 0.11 )              { d_angle -= rot_spd;           }
        else if ( angle <= 0.11 && angle >=-0.11 )              { d_angle -= rot_spd;           }
        else if ( sin(angle+Pi) <= 0.1 && sin(angle+Pi) >= -0.1 )       { d_angle = angleYaw+Pi;        }
    }
 
    if ( AAccel > 0.01 && WAccel < 0.01 && SAccel < 0.01 && DAccel < 0.01 )
    {
        if      ( sin(angle+Pi/2) > 0.1 )               { d_angle -= rot_spd;           }
        else if ( sin(angle+Pi/2) <-0.1 )                   { d_angle += rot_spd;           }
        else if ( angle >= Pi/2 - 0.11 && angle <= Pi/2+0.11 )          { d_angle -= rot_spd;           }
        else if ( sin(angle+Pi/2) <= 0.1 && sin(angle+Pi/2) >= -0.1 )       { d_angle = angleYaw-Pi/2;      }
    }
 
    if ( DAccel > 0.01 && WAccel < 0.01 && SAccel < 0.01 && AAccel < 0.01 )
    {
        if      ( sin(angle-Pi/2) > 0.1 )               { d_angle -= rot_spd;           }
        else if ( sin(angle-Pi/2) <-0.1 )                   { d_angle += rot_spd;           }
        else if ( angle <=-Pi/2 + 0.11 && angle >=-Pi/2-0.11 )          { d_angle += rot_spd;           }
        else if ( sin(angle-Pi/2) <= 0.1 && sin(angle-Pi/2) >= -0.1 )       { d_angle = angleYaw+Pi/2;      }
    }
 
    /// Для одновременного движения по осям X и Z ( например W и D или S и A )
 
    if ( WAccel > 0.01 && AAccel > 0.01 && SAccel < 0.01 && DAccel < 0.01 )
    {
        if      ( sin(angle+Pi/4) > 0.1 )               { d_angle -= rot_spd;           }
        else if ( sin(angle+Pi/4) <-0.1 )                   { d_angle += rot_spd;           }
        else if ( angle >= Pi-Pi/4 - 0.11 && angle <= Pi-Pi/4 + 0.11 )      { d_angle -= rot_spd;           }
        else if ( sin(angle+Pi/4) <= 0.1 && sin(angle+Pi/4) >= -0.1 )       { d_angle = angleYaw-Pi/4;      }
    }
 
    if ( WAccel > 0.01 && DAccel > 0.01 && SAccel < 0.01 && AAccel < 0.01 )
    {
        if      ( sin(angle-Pi/4) > 0.1 )               { d_angle -= rot_spd;           }
        else if ( sin(angle-Pi/4) <-0.1 )                   { d_angle += rot_spd;           }
        else if ( angle <= Pi+Pi/4 + 0.11 && angle >= Pi+Pi/4 - 0.11 )      { d_angle += rot_spd;           }
        else if ( sin(angle-Pi/4) <= 0.1 && sin(angle-Pi/4) >= -0.1 )       { d_angle = angleYaw+Pi/4;      }
    }
 
    if ( SAccel > 0.01 && AAccel > 0.01 && WAccel < 0.01 && DAccel < 0.01 )
    {
        if      ( sin(angle+Pi-Pi/4) > 0.1 )                { d_angle -= rot_spd;           }
        else if ( sin(angle+Pi-Pi/4) <-0.1 )                    { d_angle += rot_spd;           }
        else if ( angle >= Pi/4 - 0.11 && angle <= Pi/4 + 0.11 )        { d_angle -= rot_spd;           }
        else if ( sin(angle+Pi-Pi/4) <= 0.1 && sin(angle+Pi-Pi/4) >= -0.1 )     { d_angle = angleYaw+Pi+Pi/4;       }
    }
 
    if ( SAccel > 0.01 && DAccel > 0.01 && WAccel < 0.01 && AAccel < 0.01 )
    {
        if      ( sin(angle+Pi+Pi/4) > 0.1 )                { d_angle -= rot_spd;           }
        else if ( sin(angle+Pi+Pi/4) <-0.1 )                    { d_angle += rot_spd;           }
        else if ( angle <=-Pi/4 + 0.11 && angle >=-Pi/4 - 0.11 )        { d_angle += rot_spd;           }
        else if ( sin(angle+Pi+Pi/4) <= 0.1 && sin(angle+Pi+Pi/4) >= -0.1 )     { d_angle = angleYaw+Pi-Pi/4;       }
    }
}
 
 
///===============================================================================================================================
/// Name:
/// Desc: Освобождает ресурсы
///===============================================================================================================================
 
void Release()
{
    if (mouse != 0)
    {
        mouse -> Unacquire();
        mouse -> Release();
    }
    if (keyboard != 0)
    {
        keyboard -> Unacquire();
        keyboard -> Release();
    }
    if (di != 0)
    {
        di -> Release();
    }
    if( d3ddev != 0 )
    {
        d3ddev -> Release();
    }
    if( d3d != 0 )
    {
        d3d -> Release();
    }
}
 
 
 
 
 
 
 
 
 
 
///===============================================================================================================================
/// Name:
/// Desc: Главная функция
///===============================================================================================================================
 
int WINAPI WinMain ( HINSTANCE hinst, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nFunsterStil )
{
    InitWin     ();
    InitD3D     ();
    InitInput   ();
 
    // Загрузка моделей
    LoadModel   ( 0, "model.x", "model.jpg" );
    LoadModel   ( 1, "model.x", "model.jpg" );
 
    while ( messages.message != WM_QUIT )
    {
        if( PeekMessage( &messages, NULL, 0, 0, PM_REMOVE ) )
        {
            TranslateMessage(&messages);
            DispatchMessage(&messages);
        }
        else
        {
            Mouse();
            Keyboard();
 
            Projection( D3DX_PI/4.0, 0.1, 1000.0 );
            CameraTP( fPosX+f*YawX, fPosY+0.50, fPosZ-f*YawY, YawY, anglePitch, YawX, PitchD, distcam );
 
            RotateAndMove();
 
            d3ddev -> BeginScene();
            d3ddev -> Clear( 0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(192, 208, 192), 1.0f, 0 );
 
            // Рисование моделей
            DrawModel( 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 );
            DrawModel( 1, fPosX, fPosY-0.75, fPosZ, d_angle, 0.0, 0.0 ); // Наш перс
 
            d3ddev -> EndScene();
            d3ddev -> Present( NULL, NULL, NULL, NULL );
        }
    }
    Release();
    return messages.wParam;
}
2
444 / 348 / 32
Регистрация: 16.10.2010
Сообщений: 842
Записей в блоге: 7
25.04.2012, 20:48
Цитата Сообщение от programina Посмотреть сообщение
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
void RotateAndMove()
{
    angle = d_angle - angleYaw;
 
    if ( (WAccel > 0.01 || SAccel > 0.01 || AAccel > 0.01 || DAccel > 0.01) && rot_spd < 0.1 )  { rot_spd += 0.01; }
    else                                                                                        { rot_spd *= 0.99; }
 
    if ( WAccel > 0.01 && SAccel < 0.01 && AAccel < 0.01 && DAccel < 0.01 )
    {
        if      ( sin(angle) > 0.1 )                    { d_angle -= rot_spd;           }
        else if ( sin(angle) <-0.1 )                        { d_angle += rot_spd;           }
        else if ( angle >= Pi - 0.11 && angle <= Pi+0.11 )          { d_angle -= rot_spd;           }
        else if ( angle <=-Pi + 0.11 && angle >=-Pi-0.11 )          { d_angle -= rot_spd;           }
        else if ( sin(angle) <= 0.1 && sin(angle) >= -0.1 )             { d_angle = angleYaw;           }
    }
 
    if ( SAccel > 0.01 && WAccel < 0.01 && AAccel < 0.01 && DAccel < 0.01 )
    {
        if      ( sin(angle+Pi) > 0.1 )                 { d_angle -= rot_spd;           }
        else if ( sin(angle+Pi) <-0.1 )                     { d_angle += rot_spd;           }
        else if ( angle >=-0.11 && angle <= 0.11 )              { d_angle -= rot_spd;           }
        else if ( angle <= 0.11 && angle >=-0.11 )              { d_angle -= rot_spd;           }
        else if ( sin(angle+Pi) <= 0.1 && sin(angle+Pi) >= -0.1 )       { d_angle = angleYaw+Pi;        }
    }
 
    if ( AAccel > 0.01 && WAccel < 0.01 && SAccel < 0.01 && DAccel < 0.01 )
    {
        if      ( sin(angle+Pi/2) > 0.1 )               { d_angle -= rot_spd;           }
        else if ( sin(angle+Pi/2) <-0.1 )                   { d_angle += rot_spd;           }
        else if ( angle >= Pi/2 - 0.11 && angle <= Pi/2+0.11 )          { d_angle -= rot_spd;           }
        else if ( sin(angle+Pi/2) <= 0.1 && sin(angle+Pi/2) >= -0.1 )       { d_angle = angleYaw-Pi/2;      }
    }
 
    if ( DAccel > 0.01 && WAccel < 0.01 && SAccel < 0.01 && AAccel < 0.01 )
    {
        if      ( sin(angle-Pi/2) > 0.1 )               { d_angle -= rot_spd;           }
        else if ( sin(angle-Pi/2) <-0.1 )                   { d_angle += rot_spd;           }
        else if ( angle <=-Pi/2 + 0.11 && angle >=-Pi/2-0.11 )          { d_angle += rot_spd;           }
        else if ( sin(angle-Pi/2) <= 0.1 && sin(angle-Pi/2) >= -0.1 )       { d_angle = angleYaw+Pi/2;      }
    }
 
    /// Для одновременного движения по осям X и Z ( например W и D или S и A )
 
    if ( WAccel > 0.01 && AAccel > 0.01 && SAccel < 0.01 && DAccel < 0.01 )
    {
        if      ( sin(angle+Pi/4) > 0.1 )               { d_angle -= rot_spd;           }
        else if ( sin(angle+Pi/4) <-0.1 )                   { d_angle += rot_spd;           }
        else if ( angle >= Pi-Pi/4 - 0.11 && angle <= Pi-Pi/4 + 0.11 )      { d_angle -= rot_spd;           }
        else if ( sin(angle+Pi/4) <= 0.1 && sin(angle+Pi/4) >= -0.1 )       { d_angle = angleYaw-Pi/4;      }
    }
 
    if ( WAccel > 0.01 && DAccel > 0.01 && SAccel < 0.01 && AAccel < 0.01 )
    {
        if      ( sin(angle-Pi/4) > 0.1 )               { d_angle -= rot_spd;           }
        else if ( sin(angle-Pi/4) <-0.1 )                   { d_angle += rot_spd;           }
        else if ( angle <= Pi+Pi/4 + 0.11 && angle >= Pi+Pi/4 - 0.11 )      { d_angle += rot_spd;           }
        else if ( sin(angle-Pi/4) <= 0.1 && sin(angle-Pi/4) >= -0.1 )       { d_angle = angleYaw+Pi/4;      }
    }
 
    if ( SAccel > 0.01 && AAccel > 0.01 && WAccel < 0.01 && DAccel < 0.01 )
    {
        if      ( sin(angle+Pi-Pi/4) > 0.1 )                { d_angle -= rot_spd;           }
        else if ( sin(angle+Pi-Pi/4) <-0.1 )                    { d_angle += rot_spd;           }
        else if ( angle >= Pi/4 - 0.11 && angle <= Pi/4 + 0.11 )        { d_angle -= rot_spd;           }
        else if ( sin(angle+Pi-Pi/4) <= 0.1 && sin(angle+Pi-Pi/4) >= -0.1 )     { d_angle = angleYaw+Pi+Pi/4;       }
    }
 
    if ( SAccel > 0.01 && DAccel > 0.01 && WAccel < 0.01 && AAccel < 0.01 )
    {
        if      ( sin(angle+Pi+Pi/4) > 0.1 )                { d_angle -= rot_spd;           }
        else if ( sin(angle+Pi+Pi/4) <-0.1 )                    { d_angle += rot_spd;           }
        else if ( angle <=-Pi/4 + 0.11 && angle >=-Pi/4 - 0.11 )        { d_angle += rot_spd;           }
        else if ( sin(angle+Pi+Pi/4) <= 0.1 && sin(angle+Pi+Pi/4) >= -0.1 )     { d_angle = angleYaw+Pi-Pi/4;       }
    }
}
здесь явно можно соптимизировать
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
25.04.2012, 20:48

Морской бой на C# с использованием библиотек DirectX: нужны исходники
Доброго времени суток :) Задали написать вот такой вот курсач :( В программировании я не особо разбираюсь, а уж тем более в Direct`e,...

Ищу исходники модуля ComSignal для работы с ComPort
Помогите откомпилировать программу для работы с Com портом, требовались файлы ComPort и ComSignal, ComPort нашел, а вот ComSignal.hpp и...

Принципы работы DirectX.
Хочу узнать как работает эта штука(DirectX). Буду очень благодарен за исходники на VB(6.0) которые можно будет поковырять или ссылки где...

Где можно посмотреть примеры (исходники) работы с базой данных на C#
Где можно посмотреть примеры (исходники) работы с базой данных на C#, работа с XML,SQL. Просто не знаю с чего начать...

Ищу примеры работы с 2D в DirectX
Хочу использовать DirectX в своем приложении для вывода графики, но столкнулся с проблемой отсутствия документации на многие вопросы по...


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
Создание формы заимствованного документа
Maks 03.08.2026
Задача: Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также табличная часть со следующими реквизитами: - Расчетный счет покупателя. . .
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача: В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
Почему SEO не начинается с ключевых слов: что проверить до написания текстов
Neotwalker 01.08.2026
Когда владельцу сайта предлагают заняться SEO, первым шагом часто становится сбор запросов и написание текстов. Логика кажется понятной: 1. Находим ключевые слова. 2. Добавляем их на. . .
Знание — сила: Доктрина интенциональности знаний, углубление в формулу
Hrethgir 01.08.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11957&stc=1&d=1785567302 Знаменитый афоризм Фрэнсиса Бэкона «Знание — сила» (Scientia potentia est) в массовой культуре принято понимать. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru