泛型粒子系統的設計4 (轉)
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 泛型粒子系統的設計1 (轉)泛型
- 泛型粒子系統的設計2 (轉)泛型
- 泛型粒子系統的設計3 (轉)泛型
- 泛型粒子系統的設計5 (轉)泛型
- 泛型粒子系統的設計6 (轉)泛型
- 泛型粒子系統的設計7 (轉)泛型
- 泛型類及系統中常用的泛型類泛型
- .NET泛型程式設計簡介 (轉)泛型程式設計
- 泛型程式設計泛型程式設計
- 泛型最佳實踐:Go泛型設計者教你如何用泛型泛型Go
- java 泛型程式設計Java泛型程式設計
- [CUJ]泛型程式設計--轉移建構函式 (轉)泛型程式設計函式
- 4.泛型泛型
- Swift 4 中的泛型Swift泛型
- Windows系統上泛域名解析的設定(轉)Windows
- [SceneKit專題]4-Particle-Systems粒子系統
- 十、GO程式設計模式 : 泛型程式設計Go程式設計設計模式泛型
- 談談 "JS 和 設計泛型"JS泛型
- 泛型程式設計詳解(一)泛型程式設計
- 泛型程式設計與 OI——modint泛型程式設計
- C#學習 [型別系統] 泛型(16)C#型別泛型
- hugo.elias專題 之 粒子系統 (轉)Go
- c++ 泛型 程式設計 之 Functor 設計模式C++泛型程式設計設計模式
- Kotlin語言中的泛型設計哲學Kotlin泛型
- Go泛型草案設計簡明指南Go泛型
- c++ 泛型程式設計 之 TypeListsC++泛型程式設計
- 泛型轉DataTable方法泛型
- 物件導向程式設計和`GP`泛型程式設計物件程式設計泛型
- 如何設計一個微博系統?- 4招教你搞定系統設計
- Swift 4 泛型:如何在你的程式碼或App裡應用泛型Swift泛型APP
- Dart語法篇之型別系統與泛型(七)Dart型別泛型
- 使用 Go 泛型的函數語言程式設計Go泛型函數程式設計
- 泛型--泛型萬用字元和泛型的上下限泛型字元
- GO語言泛型程式設計實踐Go泛型程式設計
- Linux系統程式設計【4】——檔案系統Linux程式設計
- 泛型程式設計在非C++語言中的實現之探討 (轉)泛型程式設計C++
- 轉向Kotlin——泛型Kotlin泛型
- 許可權系統設計(4)--resource