相对于初始化器和更新器,死亡触发器要简单一些,在有粒子死亡时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 ); } }; |
发表于 @ 2004年02月02日 23:30:00 | 评论( loading... ) | 举报| 收藏