게임브리오의 오브젝트 객체에는 TimeController 를 붙일수 있습니다. 이것은 오브젝트 자체에서 수행하는 UpdateFrame() 이외에도 따로 TimeController를 통해 프레임 단위 처리를 수행할수 있게 해줍니다. 밑은 Tutorial 6에서 TimeController를 상속받은 FlightController를 오브젝트에 붙이는 코드입니다.
추가된 TimeController는 오브젝트의 UpdateObejctControllers()를 통해 매 프레임마다 호출됩니다.
bool TimeControllers::CreateScene() { // The world is also expected to have a node named "AttachmentBox". // This is the location that we will attach the helicopter to. NiNode* pkAttachPt = (NiNode*) m_spScene->GetObjectByName( "AttachmentBox"); NIASSERT(NiIsKindOf(NiNode, pkAttachPt)); // Create a controller for our attachment point that will // move the helicopter based on the gamepad FlightController* pkFlightController = NiNew FlightController(35.0f); pkFlightController->SetTarget(pkAttachPt); return bSuccess; }SetTarget() 에서 이루어지는 작업. 지정된 오브젝트를 멤버로 설정하고, 오브젝트에서도 현재 TimeController를 멤버로 추가합니다.
void NiTimeController::SetTarget(NiObjectNET* pkTarget) { if (m_pkTarget == pkTarget) return; // Increment ref count to insure that "this" is not deleted when it is // detached from m_pkTarget. IncRefCount(); // remove from old list if (m_pkTarget) { if (m_pkTarget->GetControllers()) m_pkTarget->RemoveController(this); } m_pkTarget = pkTarget; // add to new list if (m_pkTarget) { NIASSERT(TargetIsRequiredType()); // add controller to list only if it is not already in list NiTimeController* pkControl = m_pkTarget->GetControllers(); while (pkControl) { if (pkControl == this) { DecRefCount(); return; } pkControl = pkControl->GetNext(); } m_pkTarget->PrependController(this); } DecRefCount(); }
추가된 TimeController는 오브젝트의 UpdateObejctControllers()를 통해 매 프레임마다 호출됩니다.
inline void NiAVObject::UpdateObjectControllers(float fTime, bool bProperties) { NiTimeController* pkControl = GetControllers(); for (/**/; pkControl; pkControl = pkControl->GetNext()) pkControl->Update(fTime); }