五、死亡触发器
相对于初始化器和更新器,死亡触发器要简单一些,在有粒子死亡时On成员函数将被调用。系统内建了两个死亡触发器。
// 空死亡触发器
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用于指定第二个更新器。