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

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

TParticleSystem有兩個主要的成員Emit和Update。Emit用於發射指定數目的粒子其中需要說明的是用於初始化粒子的一條語句::namespace prefix = o ns = "urn:schemas--com::office" />

Init< 0 >( m_aParticles[nCnt], m_Initializer )

它的是一個帶有一個數值型模板引數的成員函式Init,Init有一個模板引數nIndex,用於指定當前所初始化的粒子部分。Init內部有一個遞迴呼叫,每次遞迴把指加一使用不同的粒子部分初始化器初始化不同的粒子部分:

  i.Part< nIndex >().Action< nIndex >( p );

如上的呼叫表示從第0部分開始初始化粒子,直至所有部分初始化完畢。

Update與Emit的運作機制類似,透過語句:

Update< 0 >( dElapsedTime, m_aParticles[nCnt], m_Actor );

從第0部分開始整個粒子。更新完粒子後還透過語句:

if( m_aParticles[nCnt].Part< nLifeIndex >().m_Value <= 0.0 )

檢測當前粒子是否死亡,這裡就用到了先前設定的一個模板引數nLifeIndex。如果死亡則使用死亡做相應的處理:

  m_DeadTrigger.On( m_aParticles[nCnt] );

此外Update還接受一個引數dElapsedTime,用於表示上次更新到此次更新的間隔。

三、  初始化器

初始化器是整個粒子的重要組成部分,每個初始化器都必須有個一公共的帶有一個size_t型模板引數的Action成員函式,TParticleSystem將呼叫此函式對粒子進行初始化,模板引數nIndex用於指定所需要初始化的粒子部分。系統中內建了幾個常用的初始化器:

// 空初始化器

template<

  class _ParticleType

> class TNilInitializer {

protected:

  typedef _ParticleType tParticle;

public:

  template< size_t nIndex >

  void Action( tParticle& ) {

  }

};

TNilInitializer是一個空初始化器,它有一個模板引數,_ParticleType用於指定所需要初始化的粒子型別,如果指定其為某個粒子部分的初始化器系統將不對此粒子部分進行初始化動作。

// 常量初始化器

template<

  class _ParticleType,

  typename _Type

> class TConstantInitializer {

protected:

  typedef _ParticleType  tParticle;

  typedef _Type  tType;

  typedef boost::mpl::if_c<

  boost::is_pod< tType >::value,

  tType,

  boost::add_reference< boost::add_const< tType >::type >::type

  >::type tParaType;

  // 初始化的值

  tType m_Value;

public:

  // 設定初始化值

  void Set( tParaType Value ) { m_Value = Value; }

  // 初始化

  template< size_t nIndex >

  void Action( tParticle& p ) {

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

  }

};

TConstantInitializer是一個常量初始化器,它有兩個模板引數,_ParticleType用於指定所需要初始化的粒子型別,_Type用於指點其將要初始化的粒子部分的型別。公共成員函式Set用於設定初始化的值。

// 矩陣變換初始化器

template<

  class _ParticleType,

  typename _MatrixType

> class TTranonitializer {

protected:

  typedef _ParticleType  tParticle;

  typedef _MatrixType  tMatrix;

  // 矩陣

  tMatrix m_Matrix;

public:

  // 建構函式

  TTransformInitializer( void )

  : m_Matrix( 1.0, 0.0, 0.0, 0.0,

  0.0, 1.0, 0.0, 0.0,

  0.0, 0.0, 1.0, 0.0,

  0.0, 0.0, 0.0, 1.0 )

  {}

  // 設定變換矩陣

  void Set( const tMatrix& Matrix ) {

  m_Matrix = Matrix;

  }

  // 執行初始化

  template< size_t nIndex >

  void Action( tParticle& p ) {

  p.Part< nIndex >().m_Value *= m_Matrix;

  }

};

TTransformInitializer是一個矩陣變換初始化器,它有兩個模板引數,_ParticleType用於指定所需要初始化的粒子型別,_MatrixType用於指定變換矩陣的型別。公共成員函式Set用於設定變換矩陣。使用此初始化器還必須為p.Part< nIndex >().m_Value的型別定一個接受tMatrix型別的*=運算子,用於執行變換操作。

 


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

相關文章