0
点赞
收藏
分享

微信扫一扫

深度学习输入数据的归一化

kmoon_b426 2023-09-03 阅读 55

一. 游戏的展示效果

二.本节开发日志

三.优化上篇中main函数里的sleep(30)

首先为什么要优化这个呢?

了解sleep的都知道,这个是让程序休眠30ms也就是当程序执行到这里的时候,会在这里呆30ms,因为这款游戏需要接收玩家的按键消息,所以有时候玩家在这30ms内有键盘响应的时候,由于程序休眠,无法接收到消息,会降低游戏的体验性

要解决的问题: 在按跳跃键的时候不受sleep的影响

解决方法 : 利用时间戳,定义一个计时器,当达到该计时器的设定的时间就可以打开刷新窗口的按钮,或者当跳跃时候打开该按钮,代码如下:

 这样优化的话,感觉和sleep(30)的效果一样,此时还需要在跳跃的时候将其update设为true,在以后只要接受玩家键盘消息的时候都要加上

这样的话就解决了玩家按跳跃键程序休眠的问题 ,此时提高了游戏的体验性

四.实现玩家的下蹲功能

天天酷跑主要就是跳跃和下蹲,下蹲可躲避障碍物柱子,给障碍物的创建先奠定基础,实现下蹲和实现跳跃的流程大致相似,分析可知,下蹲时玩家发出的信号,那么我们就可用从用户点击函数开始开发,当玩家按下a的时候执行下蹲操作

资源必须先加载进来,因为下蹲有两张图片,所以在全局定义一个存放该图片的数组,然后再初始化中进行加载

用户点击 

实现下蹲 

现在就可以在数据层实现数据的更新了

数据更新

下蹲速度优化

为什么速度会这么快呢?

因为这个下蹲的图片只有两张,循环一次的时间也就几十毫秒,所以速度很快,解决这个问题有两种方法,第一个就是,将这个下蹲过程的图片设置很多张,例如下蹲的图片有50张,将其全部渲染出来,这就加长了时间,当然也是很费内存的,第二种就是用计数器,利用空循环当达到计数器设定的值的时候在进行执行下蹲,由于下蹲第二张渲染呈现时间比第一张的长,这也显得下蹲才逼真,解决这一问题,需要定义一个数组,存储两张图片的计数,以下为代码:

渲染下蹲操作

人物跳跃的渲染在main函数里面通过一行代码实现了,但是现在人物的状态有两种,跳跃与下蹲,此时就需要封装为函数了,创建updateHero函数

在main函数里用updateHero函数代替人物奔跑的代码 

此时的下蹲代码算是写完了,下面时运行结果此时就很容易的截图到该英雄的下蹲操作了,接下来实现随机障碍物

五.随机障碍物的实现

如何实现随机障碍物呢?

此时就会涉及到枚举的应用,障碍物的封装,障碍物的池子和随机数

枚举 : 可用提高代码的可读性,简化程序,一般一定个数的东西可定义为枚举类型,枚举里的元素,也就是整数类型

首先定义枚举类型,就将障碍物设置为乌龟,狮子,四种柱子

typedef enum {
	TORTOISE,//乌龟  0
	LION,//狮子      1
	HOOK1,//柱子     2
	HOO2,
	HOO3,
	HOOK4,
	OBSTACLE_TYPE_COUNT // 总数 
}obstacle_type;

在这里用到的OBSTACLE_TYPE_COUNT 很是巧妙,枚举里的值从0开始,到了OBSTACLE_TYPE_COUNT 刚好时前面障碍物的总数,此时就将枚举定义好了,然后就可以封装结构体了

首先应该知道封装的属性都有什么,一个障碍物,他得有类型,坐标,速度,伤害,使用状态,此时我们可用再添加一个图片的帧序列,因为每个障碍物有的是动态的,都有序列,此时就可以将初始化加载图片进行优化,要用到一个大小可变的容器vector来存储,声明为二维的,每一维存储该组图片

代码中 obstacleImgs为定义在全局的二维数组,在初始化时候,创建个一维数组,最后再将其一维数组添加到该二维数组里

 此时所有障碍物的图片存在于二维数组obstacleImgs中了

封装结构体

创建障碍物池子

也就是定义一个结构体数组,OBSTACLE_COUNT是定义的宏,池子的大小

在封装了障碍物之后,那么之前小乌龟所定义的地方都需要优化了

小乌龟的定义

创建小乌龟

fly函数中小乌龟的运动

障碍物的渲染层

 此时可用依据上面删除的部分进行开发,定义我们已经做了但是应该将池子里的exist属性进行初始化,以保证能够正确的知道哪个障碍物可用

接下来需要创建小乌龟,此时应该重写creatObstacle函数,

fly中更新障碍物的数据

更新x坐标使其运动,更新图片帧序列使其处于动态

渲染障碍物

这样就设计完了,看看成果

我跑了半分钟,感觉这个柱子出现的频率还是太大了,因为当初随机数是对6取余的,二柱子就占了四个,所以这里可用优化

此时类型的这里就化解了,取两次随机数,让其柱子出现的几率降低

此时就能看到这几个障碍物同框了,但是碰撞这里还没有做,现在随机障碍物也实现了

六.实现英雄与障碍物的碰撞检测

从图可以看出,障碍物的碰撞检测就是在检测两个矩形是否相交,这种判断矩形相交的代码在网上开源的有很多

如果以白边的坐标来检测的话,可能会有误差,则加上偏移量,使判断更加准确,

分析 : 碰撞检测实在数据层进行的,但是这个功能可封装为函数,所以在fly函数里面定义一个checkHit函数用于检测碰撞

一下是判断是否碰撞的代码,主要是找到这四个点的坐标,加上偏移量即可

开源代码,判断矩形是否相交

 找四个点的坐标,调用rectIntersect函数进行判断是否相交

 

 此时有个bug,碰撞一次,连续掉血多次

bug原因 : 一帧一帧的检测

解决方法 : 结构体中添加属性,是否碰撞,在进行对其初始化,最后在碰撞检测函数里面优化

1.添加了判断条件

2.当判断碰撞后,将其hited设置为true

 效果图:

以上就是英雄与障碍物的碰撞检测模块了

七.总结

举报

相关推荐

0 条评论