泛型粒子系統的設計7 (轉)

themoney發表於2007-09-15
泛型粒子系統的設計7 (轉)[@more@]

五、死亡

相對於初始化器和器,死亡觸發器要簡單一些,在有粒子死亡時On成員將被。內建了兩個死亡觸發器。:namespace prefix = o ns = "urn:schemas--com::office" />

// 空死亡觸發器

template<

  class _ParticleType

> class TNilDeadTrigger {

protected:

  typedef _ParticleType tParticle;

public:

  void On( const tParticle& ) const {

  }

};

TNilDeadTrigger是一個空死亡觸發器,它不對粒子的死亡做任何的處理。它有一個模板引數,_ParticleType用於指定所需要更新的粒子型別。

// 簡單死亡觸發器

template<

  class _ParticleType

> class TSimpleDeadTrigger {

protected:

  typedef _ParticleType tParticle;

  typedef boost::function< void ( const tParticle& ) >  tfnDeadTrigger;

  // 死亡觸發函式

  tfnDeadTrigger m_DeadTrigger;

public:

  // 設定死亡觸發函式物件

  void SetDeadTrigger( const tfnDeadTrigger& DeadTrigger ) {

  m_DeadTrigger = DeadTrigger;

  }

  // 處理死亡事件

  void On( const tParticle& p ) const {

  if( ! m_DeadTrigger.empty() ) m_DeadTrigger( p );

  }

};

TSimpleDeadTrigger是一個簡單死亡觸發器,當有粒子死亡時他呼叫死亡觸發函式物件,公共成員函式SetDeadTrigger用於設定死亡觸發函式物件。它有一個模板引數,_ParticleType用於指定所需要更新的粒子型別。

六、其他

完成了以上工作後我幾乎幾經設計出了易於擴充套件,適應性強的泛型粒子系統了。為什麼我要說幾乎呢?不知道您有沒有發現現在一個粒子部分只能對應一個初始化器,和一個更新器。如果我們需要用兩個初始化器來初始化一個粒子部分,用兩個更新器來更新一個粒子部分該怎麼辦呢?這就需要設計一個結合兩個初始化器和結合兩個更新器的工具。

// 整合兩個初始化器

template<

  class _ParticleType,

  class _PolicyOne,

  class _PolicyTwo

> class TBothInitializerPolicy

  : public _PolicyOne

  , public _PolicyTwo

{

protected:

  typedef _ParticleType tParticle;

public:

  // 初始化

  template< size_t nIndex >

  void Action( tParticle& p ) {

  _PolicyOne::Action< nIndex >( p );

  _PolicyTwo::Action< nIndex >( p );

  }

};

TBothInitializerPolicy整合了兩個初始化器,使他們共同作用於一個粒子部分。它有三個模板引數,_ParticleType用於指定所需要初始化的粒子型別,_PolicyOne用於指定第一個初始化器,_PolicyTwo用於指定第二個初始化器。

// 整合兩個更新器

template<

  class _ParticleType,

  class _PolicyOne,

  class _PolicyTwo

> class TBothActorPolicy

  : public _PolicyOne

  , public _PolicyTwo

{

protected:

  typedef _ParticleType tParticle;

public:

  // 執行更新

  template< size_t nIndex >

  void Action( const double& dTime, tParticle& p ) {

  _PolicyOne::Action< nIndex >( dTime, p );

  _PolicyTwo::Action< nIndex >( dTime, p );

  }

};

TBothActorPolicy整合了兩個更新器,使他們共同作用於一個粒子部分。它有三個模板引數,_ParticleType用於指定所需要更新的粒子型別,_PolicyOne用於指定第一個更新器,_PolicyTwo用於指定第二個更新器。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10794571/viewspace-969595/,如需轉載,請註明出處,否則將追究法律責任。

相關文章