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

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

:namespace prefix = o ns = "urn:schemas--com::office" />

// 移動位置器

template<

  class _ParticleType,

  size_t nVelIndex

> class TMovePosActor {

protected:

  typedef _ParticleType  tParticle;

public:

  // 更新

  template< size_t nIndex >

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

  p.Part< nIndex >().m_Value += p.Part< nVelIndex >().m_Value * dTime;

  }

};

TMovePosActor是一個移動位置更新器,它根據當前的速度值更新位置,只能應用於粒子的位置部分。它有兩個模板引數,_ParticleType用於指定所需要更新的粒子型別,nVelIndex用於指定粒子的速度部分在粒子結構中的。

// 重力速度更新器

template<

  class _ParticleType,

  typename _Vector3Type

> class TGravityVelActor {

protected:

  typedef _ParticleType  tParticle;

  typedef _Vector3Type  tVector3;

  // 重力加速度

  tVectorsourceValue="3" UnitName="m">3 m_vGravity;

public:

  TGravityVelActor( void )

  : m_vGravity( tVector3( 0.0,-9.8, 0.0 ) )

  {}

  // 設定重力加速度

  void SetGravity( const tVector3& vec3 ) {

  m_vGravity = vec3;

  }

  // 執行更新

  template< size_t nIndex >

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

  p.Part< nIndex >().m_Value += m_vGravity * dTime;

  }

};

TGravityVelActor是一個重力速度更新器,它根據指定的重力加速度更新速度,只能應用於粒子的速度部分。它有兩個模板引數,_ParticleType用於指定所需要更新的粒子型別,_Vector3Type用於指定重力加速度的型別。公共成員SetGravity終於設定重力加速度。

// 壽命逝去更新器

template<

  class _ParticleType

> class TElapseLifeActor {

protected:

  typedef _ParticleType  tParticle;

public:

  // 執行更新

  template< size_t nIndex >

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

  p.Part< nIndex >().m_Value -= dTime;

  }

};

TElapseLifeActor是一個壽命逝去更新器,它根據逝去的時間減少壽命,只能應用於粒子的壽命部分。它有一個模板引數,_ParticleType用於指定所需要更新的粒子型別。

// 死亡斷言更新器

template<

  class _ParticleType

> class TDeadLifeActor {

protected:

  typedef _ParticleType  tParticle;

  typedef boost::function< bool ( const tParticle& ) >  tfnDead;

  // 死亡斷言函式

  tfnDead m_DeadPred;

public:

  // Set dead predicate

  void SetDeadPredicate( const tfnDead& DeadPred ) { m_DeadPred = DeadPred; }

  // 執行更新

  template< size_t nIndex >

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

  if( ! m_DeadPred.empty() ) {

  if( m_DeadPred( p ) ) p.Part< nIndex >().m_Value = -0.0f;

  }

  }

};

TDeadLifeActor是一個死亡斷言更新器,它死亡斷言函式物件來確認粒子是否死亡,如果死亡則修改壽命值為-0.0,只能應用於粒子的壽命部分。它有一個模板引數,_ParticleType用於指定所需要更新的粒子型別。

如果以上提到的內建更新器中並沒有您需要的,那麼動手自定義一個更新器也是一件非常輕鬆愉快的事情。

// 退色更新器

template<

  class _ParticleType,

  typename _ColorType,

  size_t nFadeIndex

> class TFadeColorActor {

protected:

  typedef _ParticleType  tParticle;

  typedef _ColorType  tColor;

  // 顏色一

  tColor  m_Value1;

  // 顏色二

  tColor  m_Value2;

public:

  TFadeColorActor( void )

  : m_Value1( tColor( 1.0, 1.0, 1.0, 1.0 ) )

  , m_Value2( tColor( 0.0, 0.0, 0.0, 1.0 ) )

  {}

  // 設定顏色一

  void SetColorOne( const tColor& col ) {

  m_Value1 = col;

  }

  // 設定顏色二

  void SetColorTwo( const tColor& col ) {

  m_Value2 = col;

  }

  // 執行更新

  template< size_t nIndex >

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

  p.Part< nIndex >().m_Value += ( m_Value2 - m_Value1 ) * p.Part< nFadeIndex >().m_Value * dTime;

  }

};

這裡我們自定義了一個根據壽命值使粒子顏色由顏色一退為顏色二的更新器,只能應用於粒子的顏色部分。它有三個模板引數,_ParticleType用於指定所需要更新的粒子型別,_ColorType用於指定顏色型別,nFadeIndex用於指定退色因子在粒子結構中的索引。


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

相關文章