延續上一次的主題,再來看看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就可以了
既直覺又不容易出錯
- Aug 13 Wed 2008 01:32
- Refactoring to Patterns~Creation~Builder
            
                close
            
        
            全站熱搜
         留言列表
 留言列表
發表留言
       
         留言列表
 留言列表 
             
 
 程式研究 (8)
 程式研究 (8)


