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



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


int CMainFrame::OnCreate(LPCREATESTRUCT IpCreateStruct) {

// Загрузить фоновое изображение m_imgBkgnd.Load(IDB BKGND) ;

NewScene() ;

ASSERT(m_pScene) ;

// Создать объект-контроллер m_pController = new CTankCtrl;

m_pController-»Create (&m wnd3d,

OnGetCtrlFrame,

this) ;

// Восстановить конфигурацию контроллера m_pController-»SelectDevice (m_iObjCtrlDev) ;

return 0;

}

Функция NewScene создает макет и задает начальные условия

BOOL CMainFrame::NewScene() (

// Удалить макет, если он уже существует if (m_p3cene) {

m_wnd3d.SetScene(NULL) ;

delete m_pScene;

m_pScene = NULL;

?

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

/b>

// Создать исходный макет m_pScene = new CSdScene;

if ( !m_pScene-»Create() ) return FALSE;

// Задать источники света C3dDirLight dl;

dl.Create (0.8, 0.8, 0.8);

m pScene-»AddChild(&dl) ;

dl.SetPosition(-2, 2, -5);

dl.SetDirection(l, -1, 1);

m_pScene-»SetAmbientLight(0.4, 0.4, 0.4);

// Установить положение и направление камеры // в исходное состояние m_pScene-»SetCameraPosition (C3dVector (0, 5, -25));

m_pScene-»SetCameraDirection (C3dVector (О, О, 1));

m_wnd3d.SetScene(m_pScene) ;

// Задать фоновое изображение m pScene-»SetBackground(&m_imgBkgnd) ;

// Разместить танк в макете if (!m_pTank) m_pTank = new C3dTank;

m_pScene-»AddChild(m_pTank) ;

m_pTank-»SetPosition(0, 0, 0) ;

m_pTank-»SetDirection(0, 0, 1) ;

return TRUE;

}

Если танк уедет за край окна и потеряется, можно выполнить команду Fite ¦New, чтобы вызвать функцию NewScene и начать все заново. Осталось сказать о последнем изменении, внесенном мной, — когда контроллер запрашивает указатель на фрейм, с которым он должен работать, функция OnGetCtrlFrame возвращает ему указатель на танк:

C3dFrame* CMainFrame::OnGetCtrlFrame(void* pArg) (

CMainFrame* pThis = (CMainFrame*) pArg;

ASSERT(pThis) ;

ASSERT <pThis-»IsKindOf(RUNTIME_CLASS (CMainFrame) ) ) ;

return pThis-»m_pTank;

}

Обратите внимание — хотя функция должна возвращать указатель на C3dFrame, на самом деле она передает указатель на объект C3dTank. Мы пользуемся этим обстоятельством в функции Onllpdate, приведенной на стр. 144. Если раньше вам могло показаться, что преобразование указателя на C3dFrame в указатель на

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

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

Пора в дорогу

Хватит возиться с самолетами, часами и танками. Пойдем дальше и посмотрим, как выбираются объекты в макете.




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