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

news2024/9/20 9:00:33

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

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

游戏整体效果展示:

在这里插入图片描述

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);

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1983905.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Mind+】掌控板入门教程05 心情灯

大自然的各种色彩使人产生各种感觉&#xff0c;心理学家认为&#xff0c;不同的颜色会让人产生不同的情绪。比如&#xff0c;红色通常给人刺激、热情和幸福的感觉&#xff0c;而绿色作为自然界中草原和森林的颜色&#xff0c;给人以理想、年轻、新鲜的感觉&#xff0c;蓝色则让…

MediaHub中的卡片实现进展汇报

今天刚从家赶到北京&#xff0c;北京和内蒙的温度差别真的太大了。给大家简单汇报一下目前MediaHub的进展&#xff1a; 上节卡片需求我们分析了gamma中卡片的设计&#xff0c;经过几天的开发以及前期的积累&#xff0c;开发进度超预期&#xff0c;功能基本上已经开发完成&#…

认识Mybatis和搭建Mybatis初始环境(Java)

首先我们需要知道在Java中连接数据库的底层就是JDBC&#xff0c;但是JDBC存在诸多弊端&#xff0c;如硬编码&#xff0c;代码重复度高&#xff0c;SQL参数固定&#xff0c;属于底层技术&#xff0c;结果集映射麻烦等。为了解决这些弊端&#xff0c;官方为我们提供了一些ORM模型…

基于大数据的混合音乐推荐系统的设计与设计(论文+源码)_kaic

摘 要 随着数据的不断增长和用户对随听随播的收听方式的习惯&#xff0c;开发一款音乐推荐系统变得越来越必要。为了满足这一需求&#xff0c;本论文采用Java语言、Vue以及数据库MySQL进行开发。系统的主要功能包括登录注册、音乐分类管理、音乐推荐管理、音乐资讯管理、音乐库…

Nacos-2.4.0最新版本,postgresql插件适配器修改分享

1. 背景 自前段时间&#xff0c;发表的一篇博文“Nacos-2.4.0最新版本docker镜像&#xff0c;兼容postgresql最新版本17和16” 有网友在评论区叫我出个修改源码的过程&#xff0c;今天就给大家简单分享一下关于“Nacos最新版&#xff08;2.4.0&#xff09;的postgresql插件适…

一些主流在线测长仪品牌!几毫米到几十米均可检测!

在线测长仪应用于生产线中长度尺寸检测&#xff0c;在各种产品中&#xff0c;总有形形色色的产品需要对长度进行检测&#xff0c;本文介绍3个测长仪品牌。 深圳市中图仪器股份有限公司 中图 SJ5100系列测长仪采用超高精度全自动光栅测长机&#xff0c;在 SJ5100光栅测长机的基础…

web通用漏洞

web通用漏洞 文章目录 web通用漏洞1. SSRF1. gopher伪协议2. 常见绕过1. ip地址绕过2. DNS重绑定攻击 3. mysql未授权4. tomcat漏洞5. redis未授权写webshell6. redis 未授权写入ssh公钥7. redis 未授权计划任务shell反弹 2. XXE测试 3. XSS4. CSRF关于vmware的网络参考 1. SSR…

【工具】图片背景移除界面 UI 源码

移除图片背景的UI 照片背景移除和填充颜色的用户界面 仓库地址&#xff1a;https://github.com/MengWoods/remove-background-ui/tree/main 介绍 该项目提供了一个基于 removebg 库的用户界面&#xff0c;用于从输入的照片中移除背景&#xff0c;并用不同的颜色填充背景。 …

设计模式18-中介者模式

设计模式18-中介者模式&#xff08;Mediator&#xff09; 动机定义结构类图解释&#xff1a;交互方式&#xff1a;左边流程图右边流程图联系中介者模式 C代码推导优缺点应用总结 动机 在软件构建过程中&#xff0c;经常会出现多个对象互相关联交互的情况。他们之间常常会维持一…

认真学习JVM几种类加载器

【1】类加载器的分类 JVM支持两种类型的类加载器 。分别为引导类加载器&#xff08;Bootstrap ClassLoader&#xff09;和自定义类加载器&#xff08;User-Defined ClassLoader&#xff09;&#xff08;JVM规范这样定义的&#xff09;。 从概念上来讲&#xff0c;自定义类加载…

轻闪PDF v2.14.9 解锁版下载及安装教程 (一款全能PDF转换器,支持自动补全标签)

前言 轻闪PDF(原傲软PDF编辑软件)是一款操作简单的全能PDF转换器,轻松实现PDF转换为Word,Excel或其他格式,以及PDF压缩,合并和图片文字识别OCR等功能.这款pdf编辑转换软件几乎支持所有常见文档格式,一键完成PDF与其他文档互相转换,并含有PDF合并,压缩,图片文字识别OCR等增值功…

[qt] 多线程应用01

源码: 点击此处 一 多线程应用 实现一个多线程的网络时间服务器&#xff0c;利用多线程功能的技术&#xff0c;为每个客户端返回当前的时间&#xff0c;并且在返回后自动退出。同时&#xff0c;服务器也会记录当前受到的请求次数。其实这相当于一个ntp时间服务器 二 服务器实…

C语言 | Leetcode C语言题解之第326题3的幂

题目&#xff1a; 题解&#xff1a; bool isPowerOfThree(int n){int count0;while(n){countn%3;n/3;}return count1?true:false;}

个人对TCP流量控制与拥塞控制的理解

TCP 协议和 UDP 协议 TCP 作为最常用的两大传输层协议之一&#xff0c;无疑是久经生产环境检验的。传输层有两个我们广泛使用的协议&#xff1a;UDP 协议、TCP 协议&#xff0c;我们一般会说前者是面向无连接的&#xff0c;后者是面向连接的。 这里的 “连接” 具体是什么意思…

Prometheus-v2.45.0 + 钉钉告警

目录 1. 创建一个钉钉内部群 2. 添加自定义机器人 3. 配置钉钉发送告警服务 4. 配置alertmanager&#xff0c;接入dingding 5. 配置告警消息发送模板 6. 修改配置规则文件 续接上篇&#xff1a;https://blog.csdn.net/Lzcsfg/article/details/140851688 相关软件包链接…

sqli-labs环境搭建以及部分sql注入

sqli-labs靶场搭建&#xff1a; 安装phpstudy并创建网页 初始化靶场 实现sql注入&#xff1a; less-1&#xff08;根据数据库的命令在超链接后输入?id1&#xff09; less-2&#xff08;如法炮制?id2&#xff09; less-3&#xff08;闭合单引号和括号&#xff09; less-9&am…

新增AI Copilot,DataEase开源数据可视化分析工具v2.9.0发布

2024年8月5日&#xff0c;人人可用的开源数据可视化分析工具DataEase正式发布v2.9.0版本。 这一版本的功能变动包括&#xff1a;导航栏新增Copilot入口&#xff0c;借助AI技术&#xff0c;通过自然语言交互实现即问即答&#xff0c;让数据分析更加直观和便捷&#xff1b;图表方…

vxe-pulldown下拉容器的使用,覆盖样式z-index来解决在Modal中初次显示在Modal的下层的问题。

1、官网的例子&#xff1a; 可以说这个vxe-pulldown用起来还是挺方便的。 2、代码&#xff1a; <template><div><vxe-pulldown ref"pulldownRef" popup-class-name"my-dropdown4" transfer><template #header><div class&quo…

FFMPEG 序列帧图片合成视频

需求&#xff1a; 将多张.png图片合成为视频 注意: 1需要Windows电脑 2将图片重命名 下载EXE 官网 https://ffmpeg.org/download.html#build-windows 解压后长这样 将图片和exe放在同一目录下 文件中找个空白地&#xff0c;Shift右键 进入PowerShell 输入命令: ./ffm…

Chapter 27 封装

欢迎大家订阅【Python从入门到精通】专栏&#xff0c;一起探索Python的无限可能&#xff01; 文章目录 前言一、基本概念二、私有成员 前言 在面向对象编程&#xff08;OOP&#xff09;中&#xff0c;封装是一个重要的概念&#xff0c;旨在保护数据并限制对对象内部状态的直接…