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

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

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

游戏整体效果展示:

在这里插入图片描述

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.rhkb.cn/news/392485.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MyBatis快速学习

目录 前言 MyBatis的具体使用 一些小工具&#xff1a;MyBatisX 常见问题&#xff1a; 1.表中字段名和实体属性名不一致 2.按条件查询&#xff08;单条件&#xff09;时的&#xff0c;查询条件怎么编写 3.按条件查询&#xff08;多条件&#xff09; 4.多条件查询时&…

pywinauto:Windows桌面应用自动化测试(七)

前言 上一篇文章地址&#xff1a; pywinauto&#xff1a;Windows桌面应用自动化测试&#xff08;六&#xff09;-CSDN博客 下一篇文章地址&#xff1a; 暂无 一、实战常用方法 1、通过Desktop快速获取窗口 通过之前章节我们了解到控制应用的方法为Application&#xff0…

10、springboot3 vue3开发平台-前端-elementplus, axios配置及封装使用, 包含token 存储

1. 准备工作 1.1 清除项目自带页面 删除views和components目录下所有东西&#xff1a; 1.2 修改App.vue <script setup lang"ts"></script><template><router-view></router-view> </template><style scoped></st…

基于R语言绘制GGE双标图2

参考资料&#xff1a; 严威凯等: 双标图分析在农作物品种多点试验中的应用【作物学报】 https://cran.r-project.org/web/packages/GGEBiplots/GGEBiplots.pdf 1、如何判断双标图是否充分体现数据中的规律 在对双标图的解释中&#xff0c;有一个隐含的假设&#xff0c;就是所…

COFFEE AI PARTNER -- 神奇的AI工具,相当我雇佣了一个AI员工,淘汰你的是会使用AI的人

COFFEE AI PARTNER介绍 COFFEE AI PARTNER是由 AI JAVA开发的一款生成式人工智能工具&#xff08;又名AI助手&#xff09;&#xff0c;尝试一下。 首先域名似乎正在备案中&#xff0c;企业邮箱似乎正在采购&#xff0c;目前服务地址是&#xff1a;COFFEE AI PARTNER-官网 官网…

git安装图文

1.下载 通过百度网盘分享的文件&#xff1a;git安装图文 链接&#xff1a;https://pan.baidu.com/s/17ZMiWUIULtrGGba5n-WLeA 提取码&#xff1a;anjm --来自百度网盘超级会员V3的分享 2.安装

【C语言篇】猜数字游戏(赋源码)

文章目录 猜数字游戏前言随机数生成randsrandtime设置随机数生成范围 猜数字游戏的实现 猜数字游戏 前言 在前两篇博客对于分支和循环语句进行了详细的介绍&#xff1a; 分支语句详解 循环语句详解 我们就可以写一写稍微有趣的代码了&#xff0c;比如&#xff1a; 写一个…

二分查找法

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 非常期待和您一起在这个小…

SQL各种注入详解加案例--持续更新

sql注入 联合查询注入案例手工注入判断是否有SQL注入漏洞 sqlmap工具注入 报错注入常用的函数updatexml()函数案例 floor()涉及的函数实现手工注入sqlmap工具注入 盲注布尔盲注案例手工注入脚本sqlmap自动化工具 时间盲注 post注入GET传参和POST传参案例手工注入sqlmap工具 二次…

使用 Python 制作一个属于自己的 AI 搜索引擎

1. 使用到技术 OpenAI KEYSerper KEYBing Search 2. 原理解析 使用Google和Bing的搜搜结果交由OpenAI处理并给出回答。 3. 代码实现 import requests from lxml import etree import os from openai import OpenAI# 从环境变量中加载 API 密钥 os.environ["OPENAI_AP…

MySQL:索引(Index)语句

索引的限制 每个表最多可以有 16 个索引&#xff08;InnoDB 表的限制&#xff09;。 单个索引最多可以包含 16 列。 索引列的最大长度为 767 字节&#xff08;对于 CHAR, VARCHAR, 和 BINARY 类型&#xff09;&#xff0c;3072 字节&#xff08;对于 BLOB 类型&#xff09;。…

浅谈取样器插件之bzm - Free-Form Arrivals Thread Group

浅谈取样器插件之bzm - Free-Form Arrivals Thread Group bzm - Free-Form Arrivals (Ultimate Thread Group) 是一个高级且灵活的线程组插件&#xff0c;专为Apache JMeter设计。它扩展了JMeter的标准线程组功能&#xff0c;允许用户以自由形式定义线程&#xff08;用户&…

SSM项目学习:用xml配置文件或注解开发实现控制反转和依赖注入

什么是SSM SSMSpring(Spring Framework)Spring MVC mybatis Spring Framework系统架构 Spring Framework学习线路 IoC(Inversion of Control)和DI(Dependency Injection) 他们解决的问题&#xff1a;代码耦合度高的问题&#xff0c;需要类自己new对象&#xff0c;修改部分代…

03、DQL(数据查询语句)

目录 1、编写顺序 2、基本查询 3、条件查询 4、聚合函数 5、分组查询 6、排序查询 7、分页查询 8、执行顺序 1、编写顺序 SELECT 字段列表 FROM 表名列表 WHERE 条件列表 GROUP BY 分组字段列表 HAVING 分组后条件列表 ORDER BY 排序字段列表 LIMIT 分页参数2、基本查…

简单的docker学习 第11章 镜像中心

第11章 镜像中心 Docker Hub 与阿里云都是 Docker 的公网镜像中心&#xff0c;用户可以将自己的镜像 push 到公网镜像中心中自己的镜像仓库&#xff0c;并可将仓库设置为私有库&#xff0c;使他人无法看到&#xff0c;更无法 pull&#xff0c;以保证镜像的安全性。不过&#x…

【LeetCode刷题笔记】LCR.27 回文链表

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; 更多算法知识专栏&#xff1a;算法分析&#x1f525; 给大家跳段街舞感谢…

为什么康耐视visionpro的C#二次开发调用的recorddisplay控件偶尔会显示白色的,偶尔又正常了?

recorddisplay控件正常显示 异常显示 原因分析&#xff1a; 没有完全加载recorddisplay控件&#xff0c;有可能是有bug没有完全加载&#xff0c;打断点调试控件是否完全加载。

EMQX服务器安装MQTT测试

cd /usr/local/develop wget https://www.emqx.com/en/downloads/broker/5.7.1/emqx-5.7.1-el7-amd64.tar.gz mkdir -p emqx && tar -zxvf emqx-5.7.1-el7-amd64.tar.gz -C emqx ./emqx/bin/emqx start 重启 ./emqx/bin/emqx restart http://10.8.0.1:18083/ 账号ad…

【Kubernetes】应用的部署(一):金丝雀部署

应用的部署&#xff08;一&#xff09;&#xff1a;金丝雀部署 在项目迭代开发过程中&#xff0c;经常需要对应用进行上线部署。上线部署策略主要有 3 种&#xff1a;金丝雀部署、蓝绿部署 和 滚动部署。 金丝雀部署 也被叫作 灰度部署。金丝雀部署过程&#xff1a;先让一部分…

letcode 分类练习 哈希表 242.有效的字母异位词 349. 两个数组的交集 202. 快乐数 1. 两数之和

letcode 分类练习 哈希表 242.有效的字母异位词 349. 两个数组的交集 202. 快乐数 1. 两数之和 242.有效的字母异位词349.两个数组的交集202.快乐数1.两数之和 242.有效的字母异位词 分别定义两个字母哈希表就可以了 class Solution { public:bool isAnagram(string s, strin…