消灭星星游戏程序设计【连载八】——爆炸散开效果的小星星
大家每次都可以在页面中下载本节内容的实现代码,一步一步从简单开始,逐步完成游戏的各种功能,如果大家有任何问题也欢迎留言交流。
游戏整体效果展示:
1、本节要达到的效果:上一节我们在游戏按键中加入了动画效果,本节我们将添加会移动的小星星,在空中像烟花一样产生爆炸效果,小星星还可以自由落体式的掉下来。
2、添加物体的移动属性
这里我们需要给所有的物体都加上移动的属性,所以需要给Object类添加上位置、速度和加速的属性。我们可以让Object类派生出来的所有类移动,比如可以让按键移动,可以让窗口移动,可以让得分数字移动,也可以让通关图片移动,总之所有的派生类都可以移动。
第一、位置
我们用Area的ax和bx表示物体的位置信息,前边已经添加过来,我们直接拿来使用就可以了,当前物体的位置信息就为点(Area.ax,Area.ay)的位置。
第二、速度和加速度
接下来我们需要给Object类添加上速度变量和加速度变量,速度又包括x轴速度和y轴速度,加速度也分为x轴加速度和y轴加速度。
class Object
{
......
public:
//速度分量
float SpeedX;
float SpeedY;
//加速度分量
float AccelX;
float AccelY;
//根据指定速度和需要移动的目标位置确定SpeedX分量和SpeedY分量
void GetSpeedByTargetPoint(float tempSpeedValue,float targetX,float targetY);
......
};
第三、移动
当我们在自动运行消息函数中加入以下代码后,物体就能根据设置的速度和加速度进行移动了。
void Object::OnTimer(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{
//根据加速度计算新的速度
SpeedX+=AccelX;
SpeedY+=AccelY;
//根据速度计算并设置新的位置信息
Area.MoveTo(Area.ax+SpeedX,Area.ay+SpeedY);
}
物体的运动,可以理解为物品在二维空间中坐标的改变;位置的改变会受到速度的影响;速度的改变又会受到加速度的改变。举个例子:A物体SpeedX为1,SpeedY为0,加速度均为0,则物体会一直向右水平匀速移动。B物体SpeedX为-1,SpeedY为0.5,加速度均为0,则B物体会匀速向左下角移动。C物SpeedX为1,SpeedY为-1,AccelX为0,AccelY为0.3,则物体会向右上抛起,随后按抛物线落下。
也就是说,只要给不同的物体设定不同的速度和加速度,物体就可以按照自然规律进行移动,做出匀速前进,加速前进,减速前进,抛物线运动等各种效果。
为了后期操作方便,我们这里添加了一个GetSpeedByTargetPoint函数,用于在指定速度(tempSpeedValue)和目标位置点坐标(targetX,targetY)的情况下,计算并确定SpeedX分量和SpeedY分量的值,使得物体可以获取一个能够项目标点移动的速度值。
//根据指定速度和需要移动的目标位置确定SpeedX分量和SpeedY分量
void Object::GetSpeedByTargetPoint(float tempSpeedValue,float targetX,float targetY)
{
//记录当前位置
float posX=Area.ax;
float posY=Area.ay;
//获取当前位置和目标位置的距离
float distance=(float)sqrt(pow(targetX-posX,2)+pow(targetY-posY,2));
//根据给定的速度值和目标位置计算出对应
if(distance!=0)
{
SpeedX=(targetX-posX)*tempSpeedValue/distance;
SpeedY=(targetY-posY)*tempSpeedValue/distance;
}
}
3、添加会移动的小星星
我们这里给小星星一个爆炸散开,并自由落下的效果。其实就是给小行星一个任意方向上的初始速度(炸开效果),并加一个垂直向下的加速度(抛物线下落)。
//存储位图信息,图片会多次公用,因此加载为全局变量
HBITMAP hSmallStar=(HBITMAP)LoadImage(NULL,"Image/SmallStar.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
//小星星类
class SmallStar:public Object
{
public:
//标记是否有效
bool tagValid;
//位