拳皇中碰撞检测和血量变化的实现

拳皇中碰撞检测和血量变化的实现

碰撞检测的初始想法

我们小组中本来的想法是,在所有类之外定义一个专门的碰撞检测函数,如图command()函数一样。根据两个人物角色的位置x,y和img_x图片的宽度,因为x,y和img_x都是实时更新的,所有可以进行图片是否碰撞的检测。

并不是说不能这样写,知识后面在写人物技能的时候,我们发现不同的技能有不同的机制,独立在所有类之外还要要求能识别不同人物的不同技能,这样实现起来非常复杂。

后面,我们选择在每一个role子类中的每一个能产生伤害的技能独立进行伤害判断,而因为人物左右朝向的不同,需要进行不同的判断。

碰撞检测的部分改进

在碰撞检测这一部分,我们要实现的是,另一人物的扣血和“被打”画面显示。

在刚开始进行实现时,我们是将“被打”这一画面只是当做了一个动作,后面察觉到这样实现存在着一些谬误,“被打”画面播放存在问题。

后面进行了改进,将“被打”视为了一种状态,p1实现攻击时,p2正处于“被打”状态进行画面播放。
在这里插入图片描述
在这里插入图片描述

碰撞检测的代码

代码样例(左右两侧不同):在这里插入图片描述
在这里插入图片描述

碰撞检测的实现思路

拳皇游戏主要通过在窗口界面中连续贴图,以实现人物的动态效果。当P1、P2两个人物进入游戏中,由于二者的贴图相对位置,会产生碰撞检测的问题。此外,如何判断攻击和技能是否命中,也需要进行碰撞检测。特别的,碰撞并不代表有效命中,即不代表扣血。判定受到攻击的人物是否扣血,还要判定受到攻击的人物是否处于防御状态,而对于地波攻击,还要判定受到攻击的人物是否在特定的时间跳跃。

碰撞检测主要用于人物相对位置检测,以及作为拳击、腿击、技能是否命中的充分条件。下面是以P1为例的实现思路。

对于人物相对位置的碰撞检测。在人物处于跳跃状态时要进行碰撞检测,需要判定P1是否跳跃,同时判定P1贴图的x坐标是否大于P2贴图的x坐标,并且还要判定P1贴图的y坐标加上P1跳跃图片的长度是否小于P2贴图的y坐标。即P1->x > P2->x &&
P1->y + img_y < P2->y?才能决定是否发生了两个人物的相对位置交换。在人物处于移动状态时(即没有人物处于跳跃状态时)也要进行碰撞检测,设置判定条件P1->x + img_x < P2->x ?以避免两个人物贴图重合。

对于拳击的碰撞检测,需要判定P1的拳击贴图的x坐标加上P1的拳击贴图对应图片的宽度,是否大于P2贴图的x坐标。即判定P1->x+ img_x(拳击图片的宽度)> P2->x ?

对于腿击的碰撞检测,需要判定P1的腿击贴图的x坐标加上P1的腿击贴图对应图片的宽度,是否大于P2当前贴图的x坐标。即判定P1->x+ img_x(腿击图片的宽度)> P2->x ?

对于技能的碰撞检测,需要判定P1的“技能特效”贴图的x坐标加上P1的“技能特效”贴图对应图片的宽度,是否大于P2当前贴图的x坐标。即判定skill_x(技能特效的x坐标) + skill_img_x(技能特效的宽度) > P2->x ?

特别的,拳击、腿击、技能的碰撞检测判定之后,还需判定是否为有效的命中,并且置P2为承伤状态,以进行P2血量的扣除。同时更改标志变量的内容,以保证一次有效的命中只扣除一次血量。判定是否为有效命中,通过判定P2是否处于防御状态来实现,而对于地波攻击,还要追加判定P2是否处于跳跃状态。

血量变化的实现思路

在碰撞检测中,若是进行了扣血,实际上只是对role类中的blood变量进行了减少。

而对于实际上需要的贴图场景变换,是置于独立的draw_fight()函数中的,对于满值为100的blood,记录其变化值,根据变化值来进行相应的贴图变换。

p->point存储的值为人物血量的一个非常小的平行四边形的四个点,后续血量变换只需要改变相应的点使平行四边形增大即可。

血量变化的代码
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值