首页 > 编程语言 >消灭星星游戏程序设计【连载十】——小星星的残影轨迹

消灭星星游戏程序设计【连载十】——小星星的残影轨迹

时间:2024-08-09 18:54:30浏览次数:6  
标签:fp 连载 int 小星星 残影 ShadowPoint sizeof

消灭星星游戏程序设计【连载十】——小星星的残影轨迹

大家每次都可以在页面中下载本节内容的实现代码,一步一步从简单开始,逐步完成游戏的各种功能,如果大家有任何问题也欢迎留言交流。

游戏整体效果展示:

在这里插入图片描述

1、本节要达到的效果

这一节课,我们需要添加小星星的残影轨迹效果,也就是当小星星在移动过程中,它会产生一个移动的轨迹,就像我们平时游戏里走过的足迹一样,在移动的过程中残影不断的产生,跟随,最终消失。
在这里插入图片描述

2、记录运动轨迹的位置信息

如果要实现这个功能,我们需要给每个小星星添加一个存储运动轨迹(残影)位置的POINT数组,用于不断保存小星星的近期移动位置,其中POINT的x和y变量分别表示残影位置的横纵坐标值。数组的大小可以根据我们需要显示残影的数量确定,我们这里暂时设置为5个,表示最多可以存储5个残影位置,我们这里将设置一个规矩位置的常量。我们在第8节内容中已经预留了残影的位置信息如下,接下来我们直接使用即可。

//设置轨迹影子的最大个数

#define		SHADOWPOINTMAXNUM	5

//小星星类

class SmallStar:public Object
{

public:

	......

	//用于后期小星星影子的实现

	POINT		ShadowPoint[SHADOWPOINTMAXNUM];

	......
	
};

在小星星构造函数中对轨迹位置进行初始化

	//初始化小星星的规矩位置坐标
	
	for(int i=0;i<SHADOWPOINTMAXNUM;i++)
	{
		
		ShadowPoint[i].x=-100;

		ShadowPoint[i].y=-100;
	
	}

小星星残影位置的运行过程如下:残影位置数组中始终保持前近后远的顺序。小星星每次位置改变时,就将残影位置数组中最远的一个位置信息删除,并依次将每个位置数据移动到后一个次残影位置,最后就将首个残影数组位置空出来,用于保存当前小行星的位置。这样循环往复,就可以展现出小星星不断往前走,残影随后跟随的效果。

	
void	SmallStar::OnTimer(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{

	Object::OnTimer(hWnd,message,wParam,lParam);

	......
	
	//小星星有效状态下记录轨迹位置

	if(tagValid==true)
	{

		//就将残影位置数组中最远的一个位置信息删除,并依次将每个位置数据移动到后一个次残影位置

		for(int i=SHADOWPOINTMAXNUM-1;i>0;i--)
		{
			
			ShadowPoint[i].x=ShadowPoint[i-1].x;

			ShadowPoint[i].y=ShadowPoint[i-1].y;
		
		}

		//将最新的小星星位置存储到数组第一个位置

		ShadowPoint[0].x=(int)Area.ax;

		ShadowPoint[0].y=(int)Area.ay;

	}

	......

}

3、显示小星星轨迹残影

小行星的残影位置信息存储完毕后,我们就可以,小星星的显示消息函数中,逐个显示残影信息。


void	SmallStar::OnPaint(HWND hWnd,HDC hDC)
{
	
	Object::OnPaint(hWnd,hDC);

	//显示小星星

	if(tagValid==true)
	{

		//获取图像大小信息
		
		BITMAP BM;
		
		GetObject(hSmallStar,sizeof(BITMAP),&BM);
		
		//显示图像
		
		HDC hTemDC=CreateCompatibleDC(hDC);
		
		SelectObject(hTemDC,hSmallStar);
		
		TransparentBlt(hDC,(int)Area.ax,(int)Area.ay,9,9,hTemDC,0+9*iColorIndex,0,9,9,RGB(0,0,0));
		
		DeleteDC(hTemDC);
		
	}

	//逐个显示小星星的规矩位置坐标
	
	if(tagValid==true)
	{
		
		for(int i=1;i<SHADOWPOINTMAXNUM-1;i++)
		{
			
			//获取图像大小信息
			
			BITMAP BM;
			
			GetObject(hSmallStar,sizeof(BITMAP),&BM);
			
			//显示图像
			
			HDC hTemDC=CreateCompatibleDC(hDC);
			
			SelectObject(hTemDC,hSmallStar);
			
			TransparentBlt(hDC,ShadowPoint[i].x,ShadowPoint[i].y,9,9,hTemDC,0+9*iColorIndex,0,9,9,RGB(0,0,0));
			
			DeleteDC(hTemDC);
			
		}
		
	}

}

添加以上代码后,显示效果如下:

在这里插入图片描述

4、小星星的半透明显示

我们刚刚显示了小星星的残影图片,发现一个问题,我们的残影没有半透明效果,显得有点生硬,我们需要添加一个半透明图片的显示效果。

这里显示半透明效果,我们要用到一个AlphaBlend函数,同我们之前用的显示图片函数相类似。但我们这里需要注意一点,不能直接将图片半透明显示到屏幕上去。因为我们的图片是含有黑色背景颜色的,如果直接半透明显示到屏幕上,那么背景黑色也会半透明,显示到屏幕上。解决方法是:首先,我们需要创建一个兼容空白平面,然后将屏幕上的图像先拷贝到兼容平面做背景,通过TransparentBlt函数将小星星的图片去黑色背景后拷贝到兼容平面,再将整个处理后的图像通过AlphaBlend半透明拷贝到屏幕上去,这样就可以产生较为理想的半透明效果。

//按透明的背景色显示半透明的位图,100为不透明,0为全透明

void		TransAlphaBlt(HDC hDC,double rx,double ry,double tx,double ty,HDC hMemDC,double ax,double ay,double bx,double by,double iAlpha,COLORREF transColor)
{

	HDC	saveDC;

	HDC	tempDC; 

	HBITMAP	saveBM;

	//创建兼容设备

	tempDC = CreateCompatibleDC(hDC);

	saveDC = CreateCompatibleDC(hDC);

	//产生一个与图像等大小的位图,并将背景拷贝到存储位图中

	saveBM = CreateCompatibleBitmap(hDC,(int)tx,(int)ty);

	SelectObject(saveDC,saveBM);

	BitBlt(saveDC,0,0,(int)tx,(int)ty,hDC,(int)rx,(int)ry,SRCCOPY);

	//将镂空图像拷贝到存储位图中

	TransparentBlt(saveDC,0,0,(int)tx,(int)ty,hMemDC,(int)ax,(int)ay,(int)bx,(int)by,transColor);

	//将组合的位图透明显示到背景中

	BLENDFUNCTION bf;

	bf.BlendOp=AC_SRC_OVER;

	bf.BlendFlags=0;

	bf.SourceConstantAlpha=(unsigned char)iAlpha*255/100;

	bf.AlphaFormat=0;

	AlphaBlend(hDC,(int)rx,(int)ry,(int)tx,(int)ty,saveDC,0,0,(int)tx,(int)ty,bf);

	//删除设备资源

	DeleteObject(tempDC);

	DeleteObject(saveBM);

	DeleteObject(saveDC);

}

然后我们在小星星显示时,不同的残影添加不同的半透明值即可。


	//逐个显示小星星的规矩位置坐标
	
	if(tagValid==true)
	{
		
		for(int i=1;i<SHADOWPOINTMAXNUM-1;i++)
		{
			
			//获取图像大小信息
			
			BITMAP BM;
			
			GetObject(hSmallStar,sizeof(BITMAP),&BM);
			
			//显示图像
			
			HDC hTemDC=CreateCompatibleDC(hDC);
			
			SelectObject(hTemDC,hSmallStar);
			
			//TransparentBlt(hDC,ShadowPoint[i].x,ShadowPoint[i].y,9,9,hTemDC,0+9*iColorIndex,0,9,9,RGB(0,0,0));

			//星星的半透明显示
			
			TransAlphaBlt(hDC,ShadowPoint[i].x,ShadowPoint[i].y,9,9,hTemDC,0+9*iColorIndex,0,9,9,100-100*(i+1)/(SHADOWPOINTMAXNUM+1),RGB(0,0,0));
			
			DeleteDC(hTemDC);
			
		}
		
	}

显示效果如下:

在这里插入图片描述

5、小星星存档数据的保存和读取

在后期游戏过程中,也需要用到小星星爆炸的效果,当我们在保存游戏时,就需要将小行星的位置、颜色、残影位置等信息保存下来,同时,在调取存档时,我们又需要加载相应的小星星信息。

public:
	
	void	Save(FILE *fp);

	void	Load(FILE *fp);

为了后期统一保存和加载,我们这里使用传入文件指针的保存和加载函数,保存和加载小星星的各种信息。我们将在后期统一使用。


void	SmallStar::Save(FILE *fp)
{

	fwrite(&tagValid,sizeof(bool),1,fp);

	fwrite(&Area.ax,sizeof(double),1,fp);

	fwrite(&Area.ay,sizeof(double),1,fp);

	fwrite(&SpeedX,sizeof(double),1,fp);

	fwrite(&SpeedY,sizeof(double),1,fp);

	fwrite(&AccelY,sizeof(double),1,fp);

	fwrite(&iColorIndex,sizeof(int),1,fp);
	
	for(int i=0;i<SHADOWPOINTMAXNUM;i++)
	{

		fwrite(&ShadowPoint[i],sizeof(POINT),1,fp);

	}

}

void	SmallStar::Load(FILE *fp)
{

	fread(&tagValid,sizeof(bool),1,fp);

	float x=-1,y=-1;

	fread(&x,sizeof(float),1,fp);

	fread(&y,sizeof(float),1,fp);

	fread(&SpeedX,sizeof(float),1,fp);

	fread(&SpeedY,sizeof(float),1,fp);

	fread(&AccelY,sizeof(float),1,fp);
	
	fread(&iColorIndex,sizeof(int),1,fp);
	
	for(int i=0;i<SHADOWPOINTMAXNUM;i++)
	{

		fread(&ShadowPoint[i],sizeof(POINT),1,fp);

	}

	//移动到特定位置
	
	Area.MoveTo(x,y);

}

标签:fp,连载,int,小星星,残影,ShadowPoint,sizeof
From: https://blog.csdn.net/zhooyu/article/details/140862279

相关文章

  • [米联客-安路飞龙DR1-FPSOC] UDP通信篇连载-07 ICMP层程序设计
    软件版本:Anlogic-TD5.9.1-DR1_ES1.1操作系统:WIN1064bit硬件平台:适用安路(Anlogic)FPGA实验平台:米联客-MLK-L1-CZ06-DR1M90G开发板板卡获取平台:https://milianke.tmall.com/登录"米联客"FPGA社区http://www.uisrc.com视频课程、答疑解惑! 3.6ICMP层该层在程序中为IP层......
  • [米联客-安路飞龙DR1-FPSOC] UDP通信篇连载-01 以太网协议介绍
    软件版本:Anlogic-TD5.9.1-DR1_ES1.1操作系统:WIN1064bit硬件平台:适用安路(Anlogic)FPGA实验平台:米联客-MLK-L1-CZ06-DR1M90G开发板板卡获取平台:https://milianke.tmall.com/登录"米联客"FPGA社区http://www.uisrc.com视频课程、答疑解惑! ​1概述本文介绍了基于XILIN......
  • [米联客-安路飞龙DR1-FPSOC] UDP通信篇连载-02 MAC层程序设计
    软件版本:Anlogic-TD5.9.1-DR1_ES1.1操作系统:WIN1064bit硬件平台:适用安路(Anlogic)FPGA实验平台:米联客-MLK-L1-CZ06-DR1M90G开发板板卡获取平台:https://milianke.tmall.com/登录"米联客"FPGA社区http://www.uisrc.com视频课程、答疑解惑! 3程序设计前面我们介绍了以太......
  • [米联客-安路飞龙DR1-FPSOC] UDP通信篇连载-03 IP_ARP层程序设计
    软件版本:Anlogic-TD5.9.1-DR1_ES1.1操作系统:WIN1064bit硬件平台:适用安路(Anlogic)FPGA实验平台:米联客-MLK-L1-CZ06-DR1M90G开发板板卡获取平台:https://milianke.tmall.com/登录"米联客"FPGA社区http://www.uisrc.com视频课程、答疑解惑! 3.2IP_ARP层由于IP和ARP数据......
  • 【正点原子i.MX93开发板试用连载体验】中文提示词的训练
    本文首发于电子发烧友论坛:【正点原子i.MX93开发板试用连载体验】基于深度学习的语音本地控制-正点原子学习小组-电子技术论坛-广受欢迎的专业电子论坛!好久没有更新了,今天再来更新一下。我们用前面提到的录音工具录制了自己的中文语音,包括“打开”和“关闭”各100条,同......
  • [米联客-安路飞龙DR1-FPSOC] SDK入门篇连载-02 FPSoc程序固化入门
    软件版本:Anlogic-TD5.9.1-DR1_ES1.1操作系统:WIN1064bit硬件平台:适用安路(Anlogic)FPGA实验平台:米联客-MLK-L1-CZ06-DR1M90G开发板板卡获取平台:https://milianke.tmall.com/登录"米联客"FPGA社区http://www.uisrc.com视频课程、答疑解惑! 1概述在应用的调试过程中,我们......
  • [米联客-安路飞龙DR1-FPSOC] SDK入门篇连载-03 GPIO PS/PL实验
    软件版本:Anlogic-TD5.9.1-DR1_ES1.1操作系统:WIN1064bit硬件平台:适用安路(Anlogic)FPGA实验平台:米联客-MLK-L1-CZ06-DR1M90G开发板板卡获取平台:https://milianke.tmall.com/登录"米联客"FPGA社区http://www.uisrc.com视频课程、答疑解惑! 1概述本课对FPSoC芯片GPIO进......
  • [米联客-安路飞龙DR1-FPSOC] SDK入门篇连载-01 FPSoc开发入门
    软件版本:Anlogic-TD5.9.1-DR1_ES1.1操作系统:WIN1064bit硬件平台:适用安路(Anlogic)FPGA实验平台:米联客-MLK-L1-CZ06-DR1M90G开发板板卡获取平台:https://milianke.tmall.com/登录"米联客"FPGA社区http://www.uisrc.com视频课程、答疑解惑!1概述1.1背景介绍由于FPS......
  • OpenGL实现3D游戏编程【连载2】——了解并创建3D空间模型
    1、本节实现的内容上一节我们创建一个简单的窗口,本节我们需要了解一下细节内容,同时为了方便观看,我们需要显示一个世界坐标轴,建立一个直观的三维空间。2、我们的眼睛设定(gluPerspective函数)上一节课,我们创建了一个简单的opengl窗口,并显示了一个简单的3d模型正方体,这节我......
  • 连载|浅谈红队中的权限维持(六)-Linux 主机后门与Linux 隐藏文件
    本文来源无问社区,更多实战内容,渗透思路可前往查看http://www.wwlib.cn/index.php/artread/artid/11584.html0x01Linux主机后门1、添加用户一句话添加用户useraddtest;echo-e"123456n123456n"|passwdtest或者使用openssluseradd-popensslpasswd-1-salt'salt'12......