哇塞,一转眼已经到了传说中的粒子系统了,学会了粒子系统就可以做出一些更好玩的效果啦!加油啦!
一.简介
粒子系统,正如其名称,由各种小的粒子构成。通常用来模拟火焰,爆炸,烟,水流,火花,落叶,雨,雪等等难以用具体的形状来描述的物体。单个的粒子非常简单,可以用多边形来表示,甚至用像素表示。但是,不要小看了这样微小的粒子,当粒子的数量级达到上千,上万,甚至十万时,表现力是及其震撼的!
下面附上两张DX自带的粒子系统的截图:
帅呆了...然而我并做不出来...
粒子系统有三个特性:
1.群体性:粒子如此微小,要想成大气候,就必须聚集起来。
2.统一性:每个粒子性质相同。
3.随机性:粒子系统中的元素会随机表现出不同的特性。
简单的概括就是,整体有一致的表现,但是单独的粒子可以有不同的表现。
粒子系统的基本原理,即粒子系统的生命周期:
1.产生新的粒子
2.更新现有粒子的属性
3.删除已经消亡的粒子
4.绘制粒子
通常一次性分配足够的空间,通过数据结构管理存在的粒子以及消亡的粒子,如果粒子消亡了,不显示即可。
二.封装一个粒子系统的类
按照浅墨大大的方法,写了一个雪花飘落的粒子系统:
.h文件
/*!
* \file Particle.h
*
* \author puppet_master
* \date 八月 2015
*
* 粒子系统的实现
*/
#ifndef __CPARTICLE_H_
#define __CPARTICLE_H_
#include "stdafx.h"
#pragma once
//粒子定点格式
struct POINTVERTEX
{
float x, y, z;
float u, v;
};
#define D3DFVF_POINTVERTEX (D3DFVF_XYZ | D3DFVF_TEX1)
//粒子结构体定义
struct ParticleStruct
{
float x, y, z; //坐标
float rotationX; //绕X轴旋转角度
float rotationY; //绕Y轴旋转角度
float speed; //下落速度
float rotationSpeed; //旋转速度
};
const int PARTICLE_NUMBER = 3000; //粒子数量
const int AREA_WIDTH = 10000; //粒子系统区域宽度
const int AREA_LENGTH = 10000; //粒子系统区域长度
const int AREA_HEIGHT = 10000; //粒子系统区域高度
class CParticle
{
private:
LPDIRECT3DDEVICE9 m_pDevice; //设备指针
ParticleStruct m_Particle[PARTICLE_NUMBER]; //粒子结构体数组
LPDIRECT3DVERTEXBUFFER9 m_pVertexBuffer; //顶点缓冲区
LPDIRECT3DTEXTURE9 m_pTexture; //粒子纹理
public:
CParticle(LPDIRECT3DDEVICE9);
virtual ~CParticle(void);
//初始化粒子系统
bool InitParticle();
//更新粒子
bool UpdateParticle(float);
//绘制粒子
bool RenderParticle();
};
#endif
.cpp文件
#include "stdafx.h"
#include "Particle.h"
#include <time.h>
CParticle::CParticle(LPDIRECT3DDEVICE9 pDevice)
{
m_pDevice = pDevice;
m_pVertexBuffer = NULL;
m_pTexture = NULL;
}
CParticle::~CParticle(void)
{
SAFE_RELEASE(m_pVertexBuffer);
SAFE_RELEASE(m_pTexture);
}
bool CParticle::InitParticle()
{
srand((unsigned int)time(0));
//初始化雪花粒子数组
for(int i = 0; i < PARTICLE_NUMBER; i++)
{
m_Particle[i].x = rand() % AREA_LENGTH - AREA_LENGTH / 2;
m_Particle[i].y = rand() % AREA_HEIGHT;
m_Particle[i].z = rand() % AREA_WIDTH - AREA_WIDTH / 2;
m_Particle[i].speed = 500 + rand() % 500;
m_Particle[i].rotationSpeed = 5.0f + rand() % 10 / 10.0f;
}
//创建雪花粒子顶点缓存
m_pDevice->CreateVertexBuffer(4 * sizeof(POINTVERTEX), 0, D3DFVF_POINTVERTEX, D3DPOOL_MANAGED, &m_pVertexBuffer, NULL);
//填充顶点缓存
POINTVERTEX vertices[] =
{
{-10.0f, 0.0f, 0.