好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

数据结构应用(队列——简单应用(粒子系统)).ppt

27页
  • 卖家[上传人]:ji****72
  • 文档编号:56779935
  • 上传时间:2018-10-15
  • 文档格式:PPT
  • 文档大小:278.50KB
  • / 27 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 队列,简单应用,STL中的队列,STL中提供了queue来表示队列 queue允许新增元素、移除元素、从最低端加入元素、取得最顶端元素但是除了最低端可以加入、最顶端可以取出外,没有任何其他方法可以存取queue的其它元素换言之,queue不允许有遍历行为 将元素推入queue的操作称为push,将元素推出queue的操作称为pop queue以deque作为内部实现容器常用方法,empty 是否为空 size 元素个数 front 队头元素 push 插入队列 pop 删除对头元素 back 得到队尾元素,使用举例,#include #include using namespace std; void main() {queue q;for(int i= 0;i<10;i++){q.push(i);}cout<

      粒子系统是有众多细小的微粒组成,每个微粒拥有自己的物理属性,如:速度、所受加速度、颜色、微粒大小等 观察粒子系统演示,总结粒子系统的属性,粒子,粒子是组成粒子系统的最小单位 从本质上来说,粒子是一个精灵 粒子是具有一些特殊物理属性的精灵,需要服从于某种物理规律更新自身 既然粒子是一种新的精灵,它需要使用扩展框架的一般做法来表示这种新的精灵类型 下面看粒子类的定义,class CParticle :public CSprite { public:CParticle( LPDIRECT3DDEVICE9 pD3DDevice, const LPCWSTR pszName, LPDIRECT3DTEXTURE9 pTexture, //纹理D3DXVECTOR3 vPos, //位置向量int w, //精灵宽度int h, //精灵高度int tx = 0, //纹理xint ty = 0, //纹理yD3DXVECTOR3 vHotSpot=D3DXVECTOR3(0,0,0) ); public:~CParticle(void);,private:D3DXVECTOR3 vAccel;D3DXVECTOR3 vVelocity;//D3DXVECTOR3 vGravityAccel;//D3DXVECTOR3 vTangentAccel;//D3DXVECTOR3 vNormalAccel;float fSurvivalTime;float fLifeTime;float fSpin;float fAngle;D3DXCOLOR startColor;D3DXCOLOR endColor;D3DXCOLOR colorAccel;,float fStartSize;float fEndSize;float fSizeAccel;public:void Update(float fDeltaTime);void SetColor(D3DXCOLOR startColorVal,D3DXCOLOR endColorVal);void SetLifeTime(float fTime);void Relive();,void SetSpin(float fSpinVal);void SetVelocity(D3DXVECTOR3 vVelocityVal);void SetAccel(D3DXVECTOR3 vAccelVal);void SetSize(float startSize,float endSize);void AddAccel(D3DXVECTOR3 vAccelVal);};,管理粒子精灵,众多的粒子精灵需要统一管理调度,这些调度包括系统中粒子精灵数目控制,粒子物理属性的设置、粒子精灵的“生、死”控制。

      粒子创建是有开销的,为了尽可能高地提高效率, 可以采用链表或者队列来存储活的和死的粒子 这里我们采用list存储活的粒子,采用queue存储死去的粒子 下面看类的设计,#include “Particle.h“ #include “MySpriteManager.h“ #include using namespace std; class CParticleSystem { public:CParticleSystem(CResourceManager *pResManager); public:~CParticleSystem(void); protected:CMySpriteManager *pSpriteManager;CResourceManager *pResManager;,list alivedParticles;queue deadParticles;int nParticlesLimited;int nCurParticleCount;float fEmitRate;D3DXCOLOR startColor;D3DXCOLOR endColor;float fStartSize;float fEndSize;float fSpread;,float fMinLifeTime;float fMaxLifeTime;D3DXVECTOR3 vVelocity;D3DXVECTOR3 vPos;D3DXVECTOR3 vGravityAccel;D3DXVECTOR3 vTangentAccel;D3DXVECTOR3 vNormalAccel;D3DXVECTOR3 vAccel;D3DXVECTOR3 vTargetPos;float fRange;,protected:virtual void InitParticleSystem() = 0;virtual void AddNewParticle() = 0;virtual void UpdateFunc(float fDeltaTime) = 0;public:virtual void Update(float fDeltaTime);void SetPos(D3DXVECTOR3 ,注意到此处有两纯虚函数,说明CParticleSystem是抽象类。

      这是因为不同的自然现象的模拟,对应的物理算法不同,因此在CParticleSystem里只能提供一个可供继承的基类,把物理算法的实现推迟到子类去完成 下面看一下重点函数Update的实现,void CParticleSystem::Update(float fDeltaTime) {//考虑粒子数int nNewParticles = fEmitRate * fDeltaTime;list::const_iterator iter = alivedParticles.begin();while(iter != alivedParticles.end()){ CParticle *pParticle = (*iter ++);if (pParticle->fSurvivalTime > pParticle->fLifeTime){DeleteAParticle(pParticle);}},if (nCurParticleCount + nNewParticles < nParticlesLimited){for(int i=0;ibVisible = false;pParticle->bEnabled = false;nCurParticleCount --; } float CParticleSystem::RandRange(float s,float e) {return s + fmod(rand(),e - s); },具体实现类,假设模拟火焰,定义一个CFirework类来模拟。

      class CFirework : public CParticleSystem { public:CFirework(CResourceManager *pResManager,CMySpriteManager *pSpriteManager); public:~CFirework(void); protected:void AddNewParticle();void UpdateFunc(float fDeltaTime);,void InitFirework();float range; protected:CMySpriteManager *pSpriteManager; public:void MoveTo(D3DXVECTOR3 vTargetPos); };,重点函数的实现,void CFirework::InitFirework() {this->pResManager->LoadTextureFromFile(TEXT(“Particles“),TEXT(“Particles.png“));fEmitRate = 200;startColor.r = 1.0;startColor.g = 90.0 / 255.0;startColor.b = 40.0 / 255.0;startColor.a = 1.0;endColor.r = 1.0;endColor.g = 200.0f / 255.0f;endColor.b = 110.f / 255.0f;endColor.a = 0.2f;fStartSize = 1.0f;fEndSize = 0.2f;,fMinLifeTime = 1;fMaxLifeTime =5;vAccel.x = vAccel.z = 0.0f;vAccel.y = -10;range = 8; },void CFirework::AddNewParticle() {D3DXVECTOR3 vParticlePos;CParticle *pParticle;if (deadParticles.size() > 0){pParticle = deadParticles.front();deadParticles.pop();pParticle->SetVisible(true);pParticle->SetEnabled(true);pParticle->Relive();},else{pParticle = pSpriteManager->CreateParticle(TEXT(“Particles“),RES_TEX,vPos,32,32,0,0,D3DXVECTOR3(16,16,0));}pParticle->SetLifeTime(RandRange(fMinLifeTime,fMaxLifeTime));pParticle->SetColor(startColor,endColor);pParticle->SetSize(fStartSize,fEndSize);vParticlePos = vPos;,。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.