"相杀"判定设计例子

2015-06-10 11:35:48 +08:00
 lucky2touch
最近捣鼓了下cocos2d-x,想实现一下街霸的游戏逻辑。
“相杀” 玩过格斗游戏的应该知道,就是两个人物同时受创。
那么格斗游戏攻击判定的逻辑是如何设计的呢?
Google了下也没有找到相关资料。
看了一些其它攻击判定方面的都是在按键的时候判断攻击,这样有个问题就是理论上永远不会相杀了。
所以我认为这类游戏应该是按键后播放动画,在游戏主循环逻辑中判断两个角色所处的帧状态,进而进行判断。
但是这样有个顺序问题,比如在主循环逻辑中判断,角色1先将角色2判断为受创状态,轮到角色2判断的时候状态就已经改变了,会影响同一帧游戏逻辑判断问题。
所以我想的是在游戏循环中判断状态,将状态变化放在一个队列中,在循环的最后进行“清算”。
不知道想法合理不,或者有什么更好的模式解决这类问题。
4877 次点击
所在节点    游戏开发
20 条回复
canesten
2015-06-10 11:52:19 +08:00
一般的格斗游戏都是按帧判定
逐帧的做逻辑
在每帧的时候判断每个角色的状态
每个动作的判定帧都不一样
有的快有的慢
而且每个动作的判定优先级也不一样
有的高有的低
如果你深入玩过街霸就知道了
canesten
2015-06-10 11:56:20 +08:00
为什么街霸四里面杀意隆很屌
就是因为他的下轻腿特别好按
判定帧又很靠前
所以很容易抢到判定优势
打中以后可以接很强大的连续技
lucky2touch
2015-06-10 13:48:50 +08:00
@canesten 恩,我的意思是实际上已经到了某帧判定的时候,具体代码逻辑如何设计,或者有没类似例子,比如到某一帧的伪代码?
因为判定涉及到状态变化,这个状态变化应该是同时发生的。但是代码来说是顺序的,所以有问题,简单的来说如果某次逻辑计算是
update()
{
if player_one->isattacking{
player_two->dealdamage
player_two->changestate
}
if player_two->isattacking{//上一句代码已经改变状态
player_one->dealdmage
player_one->changestate
}
}

我个人认为的逻辑是

update()
{
if player_one->isattacking{
recordattackdata
}
if player_two->isattacking{//上一句代码已经改变状态
recordattackdata
}
replayattackdata
}
chairuosen
2015-06-10 13:53:43 +08:00
第一帧按下的动作,在第二帧执行,计算出结果但不写入,在第三帧写入?
Mutoo
2015-06-10 14:06:23 +08:00
这个是经典的双缓冲问题咯 看文中的例子,将双缓冲用于状态:
http://gameprogrammingpatterns.com/double-buffer.html
lucky2touch
2015-06-10 14:27:22 +08:00
@Mutoo 刚正好搜到这个模式设计,资料看起来不错,赞!
jnduan
2015-06-10 14:39:34 +08:00
lucky2touch
2015-06-10 14:54:24 +08:00
@jnduan 这个了解基本原理还不错,不过还是讲得有点浅。
w359405949
2015-06-10 16:56:47 +08:00
应该是先把所有检测到的碰撞整合起来,然后再依次处理碰撞相对应的逻辑。

这样也可以避免状态递归的问题。
endrollex
2015-06-10 17:01:43 +08:00
isattacking这个逻辑不对,如果发飞行道具呢,这个attack是跟人物状态无关的
然后格斗游戏还有各种霸体,刚体,无敌时间,即在受创的情况下攻击
MountainRain
2015-06-10 17:08:11 +08:00
晶晶同学,你最近搞这么先进的东西了哇
lucky2touch
2015-06-10 17:17:43 +08:00
@endrollex 写的是伪码...... attack为什么与人物状态无关?如果发飞行道具就是飞行道具的attack状态吧。
lucky2touch
2015-06-10 17:23:02 +08:00
@w359405949 依次处理就会有类似的问题,双缓冲估计是很好的模式,回去试试看......
w359405949
2015-06-10 17:28:54 +08:00
@lucky2touch 除了碰撞,还有时间,BUFF等都要进行这样的处理。
gamingcat1234
2015-06-10 18:15:53 +08:00
你思路有问题。
google 关键字: street fighter 4 hitbox
gamecreating
2015-06-10 18:19:22 +08:00
业务逻辑实现有问题 你那个update
lucky2touch
2015-06-10 18:47:37 +08:00
@gamingcat1234 这个问题不是hitbox的问题好吧
lucky2touch
2015-06-10 18:47:59 +08:00
@gamecreating 然后呢?
tabris17
2015-06-10 18:53:31 +08:00
我猜是每个角色都有一块“杀伤器官”,按攻击后“杀伤器官”被激活,如果“杀伤器官”碰触到对方身体范围就判定对方受到伤害
Jasio
2015-06-10 20:01:19 +08:00

为什么不是hitbox的问题?当两个攻击的box相交时就相杀。
https://www.youtube.com/user/UltraDecapre/videos 看了这视频应该对格斗机制有大概的了解。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/197443

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX