ПРОГРАМИРУЕМ 3D ГРАФИКУ ИСПОЛЬЗУЯ DirectX



Перемещение объектов - часть 17


//

// STAGE.RC2 - resources Microsoft Visual C++ does not edit

directly

//

/b> fy Глава 6. Перемещение объектов в макете

#ifdef APSTUDIO_INVOKED

terror this file is not editable by Microsoft Visual C++

#endif //APSTUDIO_INVOKED

/////////'11/1111/111/1111111111/1111111/1' I Ullll/lt'I'III'I•II/

I I / I I / / / / / I II t / / / I

II Add manually edited resources here...

^include "3dPlus.rc"

// Tank parts

I DX_HULL XO F re S \ T_hul 1. X

IDX_TURRET XOF res\turret.x

IDX_GON XOF res\gun.x

IDX_RADAR XOF res\radar.x

camo.bmp BITMAP res\camo.bmp

camousa.bmp BITMAP res\camousa.bmp // Звуковые эффекты

IDS_BANG WAVE res\bang.wav

/////////////////////////////////////////////////////////// //////////////////

Рисунок. 6-13. Размещение радара внутри фрейма


Башня

Тэг XOF, встречающийся в файле ресурсов, на самом деле можно заменить любой другой строкой. Я выбрал XOF лишь потому, что такое расширение используется в файлах описания фигур. Единственное место программы, где встречается строка XOF — функция C3dShape::Load, где эта строка используется для того, чтобы отличать XOF-файлы от других типов ресурсов.

Создание собственного контроллера движения

/b>

В класс танка вошли три функции, находящиеся в файле 3dTank.cpp и предназначенные для регулирования углов башни и пушки, а также для стрельбы:

#define D2R 0.01745329251994

void C3dTank::SetTurret(double angle)

{

if ((angle « 0) II (angle »= 360)) { angle = 0;

} double x = sin(angle * D2R);

double z = cos(angle * D2R);

m_turret.SetDirection(x, 0, z, &m_hull);

void C3dTank::SetGun(double angle) {

if (angle « 0) ( angle = 0;

} else if (angle »= 60) ( angle = 60;

> double у = -sin(angle * D2R);

double z = cos(angle * D2R);

m gun.SetDirection(0, у, z, &m turret);

}

void C3dTank::FireGun() {

PlaySound(MAKEINTRESOURCE(IDS_BANG), AfxGetResourceHandie(), SND_RESOURCE) ;

}

Как видите, чтобы определить положение башни и пушки, мы вычисляем вектор направления. Затем мы задаем направление объекта по отношению к его родителю', кстати говоря, именно так функция SetDirection действует по умолчанию. Но я хотел сделать свой код максимально простым и очевидным, поэтому при каждом вызове передаю дополнительный аргумент — эталонный фрейм.




Содержание  Назад  Вперед