close

延續上一次的主題,再來看看Factory內部的建立流程
一個AI需要載入Model,需要建立FSM,需要建立Physics...
所以流程大概會有:
// Load model and create callback function
m_pAM = NiActorManager::Create( sFileName );
m_pkAnimCallback = NiNew AnimCallbackObject;
m_pAM->SetCallbackObject(m_pkAnimCallback);
// create state machine and some state node
m_pFSM = NiNew  ksFSM( iAgentType );
ksBaseStateNode *pIdleState = NiNew
ksBaseStateNode(
                                                                                  IdleStateID );
m_pFSM->AddState(pIdleState);
ksBaseStateNode *pMoveState = NiNew
ksBaseStateNode(
                                                                                      MoveStateID );
m_pFSM->AddState(pMoveState);
// create NxShape and NxActor for physcis
NxShapeDesc *pShapeDesc =
ksPhysX::Get()->CreateBoxShape(
                                                                shapeflag, extension, transform);
m_pPhysXActor = ksPhysX::Get()->GetPhysXScene()->createActor(

                                        pShapeDesc);
嗯,看完頭也昏了,所以這也不是個好的建立方式

這時候Builder就出現了
這也是一種對於建構子的封裝方式
因為使用者建立AI的時候,通常不想知道太詳細的建立方式
而且寫太多雜七雜八很容易搞混或是漏寫
既然我們知道可以分成三大部分,就可以把建立的步驟拆解
每一個步驟都封裝成為function,只留下簡單的interface
首先把Builder建立出來:
class ksAIBuilder : public NiRefObject
{
public:
    ksAIBuilder();
    ~ksAIBuilder();
    // Load model and create callback function
   
NiActorManager *CreateActorManager();
    // create state machine and some state node
    ksFSM *CreateFSM();
    // create NxShape and NxActor for physcis
    NxActor *CreatePhysics();
};
建立完之後再來就是使用了,於是AI的建立流程就變成:
ksAIBuilder *pBuilder = NiNew ksAIBuilder();
m_pAM =
pBuilder->CreateActorManager();
m_pFSM =
pBuilder->CreateFSM();
m_pPhysXAcotr =
pBuilder->CreatePhysics();
這樣一來要建立AI就簡單多了,變化性又高
當我想要一個沒有物理的AI,只要不呼叫
CreatePhysics就可以了
既直覺又不容易出錯

全站熱搜
創作者介紹
創作者 kgsprogrammer 的頭像
kgsprogrammer

太陽系後援會

seeulin 發表在 痞客邦 留言(1) 人氣()