拳皇中碰撞检测和血量变化的实现
拳皇中碰撞检测和血量变化的实现
碰撞检测的初始想法
我们小组中本来的想法是,在所有类之外定义一个专门的碰撞检测函数,如图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存储的值为人物血量的一个非常小的平行四边形的四个点,后续血量变换只需要改变相应的点使平行四边形增大即可。
血量变化的代码
拳皇中碰撞检测和血量变化的实现相关推荐
- 【Unity】一个使用Dorween实现的血量条显示与血量变化
学习的时候负责写了关于怪物血量以及其血条显示的脚本,先上代码. 游戏内血量条的制作 1.先展示一下具体是怎么写的 两个Image文件拉成长方形条,并将该组合制作为预制体. 在Source Image中 ...
- U3D游戏角色血条制作并显示血量变化
U3D游戏角色血条制作并显示血量变化 关键:利用Slider来制作血条 大概效果: 数字会随着血量变化而变化. 步骤 1.在层级面板中右击,选择UI中的Slider. 2.创建好后,将Slider命名 ...
- 教你如何查看 Git 提交中发生了什么变化
Git 提供了几种方式可以帮你快速查看提交中哪些文件被改变. 如果你每天使用 Git,应该会提交不少改动.如果你每天和其他人在一个项目中使用 Git,假设 每个人 每天的提交都是安全的,你会意识到 G ...
- 《HTML5移动应用开发入门经典》—— 2.4 HTML5中的HTML语法变化
本节书摘来异步社区<HTML5移动应用开发入门经典>一书中的第2章,第2.4节,作者:[美]Jennifer Kyrnin,更多章节内容可以访问云栖社区"异步社区"公众 ...
- Java ME游戏开发中,碰撞检测算法在Java?ME中的实现(
2019独角兽企业重金招聘Python工程师标准>>> 在Java ME游戏开发中,碰撞检测算法在Java?ME中的实现(百搜技术) 在Java ME游戏开发中,经常需要进行碰撞检测 ...
- vue 监听表格里的数据变化_vue中监听数据变化 watch
今天做项目的时候,子组件中数据(原本固定的数据)需要父组件动态传入,如果一开始初始化用到的数据.但当时还没有获取到,初始化结束就不会更新数据了.只有监听这两个属性,再重新执行初始化. 1.watch是 ...
- oracle dba角色_DBA在“即服务”世界中角色的不断变化
oracle dba角色 在过去的十年中,现代企业中管理和运行数据库的需求和要求有了巨大的发展. 负责运行企业数据库的数据库管理员(DBA)的注意力正在发生普遍的转移:不是确保访问和可用性,而是要求他 ...
- 在Android中处理屏幕布局变化
说明 以编程方式处理屏幕布局,锁定屏幕布局.控制活动生命周期,本文简明讲述以编程方式管理屏幕布局,每个小节都聚焦于这个主题的不同方面. 手动处理布局变化 首个显要的讨论点是如何手动处理布局变化. 一个 ...
- 一元线性回归中loss值的变化分析
1 致谢 感谢陈助教的帮助和解答! 2 前言 线性回归是我们在机器学习算法中学习到的第一个回归算法,所以我们一定要学习并且掌握清楚,为后续的学习奠定良好的基础. 3 问题描述 这几天在做一元线性回归的 ...
- 实现随着 下拉菜单中 选中值的变化 周边的值也也跟着变化。(使用【 VLOOKUP 】 函数)
前言: 我们要实现如下功能. 部门 姓名 职务 ------------------------------ 实现如下功能 其中,姓名是一个下列菜单. 选中姓名时,部门和职务也跟着变化. ...
最新文章
- 史诗级画面刷爆全球,尼奥重返矩阵,为崔妮蒂而战!《黑客帝国4》重磅来袭!...
- 云安全趋势:IaaS?谢了,我要 PaaS
- jdbc mysql 函数 慢_java jdbc addBatch()提交mysql速度过慢
- VB的一些项目中常用的通用方法-一般用于验证类
- Java多线程之Synchronized和Lock的区别
- React开发(183):ant design 中treeSelect控制选中
- 使用命令行开始你的netcore之路
- svn 导入的 web项目怎么变成了java项目了
- eclipse安装svn服务器
- Python如何使用生成器得到斐波那契数列
- 数仓系列 | Flink 窗口的应用与实现
- 致敬Github那些卓越贡献的大佬和他们的公众号
- 0框架前端-如何写垂侧边栏(Vertical Tabs)
- 基于Pytorch对凸函数采用SGD算法优化实例(附源码)
- ExpandableListView
- h2ouve下载 insyde_H20UVE_100.00.9.2 Insyde H2OUVE (UEFI Variable Editor) - 下载 - 搜珍网
- n9005zhuenb6 Android 5,三星Galaxy Note3(港版N9005)刷机与ROOT教程【详细介绍】
- 联想服务器CPU系列,联想推出采用第三代英特尔至强处理器的ThinkSystem SR860 V2服务器...
- 广州 人才引进,家属随迁(有小孩),自己房产,外省户口,复核所需资料
- [BZOJ3837][Pa2013][随机][乱搞]Filary