게임브리오의 오브젝트 객체에는 TimeController 를 붙일수 있습니다. 이것은 오브젝트 자체에서 수행하는 UpdateFrame() 이외에도 따로 TimeController를 통해 프레임 단위 처리를 수행할수 있게 해줍니다. 밑은 Tutorial 6에서 TimeController를 상속받은 FlightController를 오브젝트에 붙이는 코드입니다.
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);
}

+ Recent posts