V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Game Engines
Unreal Engine
MyCryENGINE
lucky2touch
V2EX  ›  游戏开发

"相杀"判定设计例子

  •  
  •   lucky2touch · 2015-06-10 11:35:48 +08:00 · 4869 次点击
    这是一个创建于 3443 天前的主题,其中的信息可能已经有所发展或是发生改变。
    最近捣鼓了下cocos2d-x,想实现一下街霸的游戏逻辑。
    “相杀” 玩过格斗游戏的应该知道,就是两个人物同时受创。
    那么格斗游戏攻击判定的逻辑是如何设计的呢?
    Google了下也没有找到相关资料。
    看了一些其它攻击判定方面的都是在按键的时候判断攻击,这样有个问题就是理论上永远不会相杀了。
    所以我认为这类游戏应该是按键后播放动画,在游戏主循环逻辑中判断两个角色所处的帧状态,进而进行判断。
    但是这样有个顺序问题,比如在主循环逻辑中判断,角色1先将角色2判断为受创状态,轮到角色2判断的时候状态就已经改变了,会影响同一帧游戏逻辑判断问题。
    所以我想的是在游戏循环中判断状态,将状态变化放在一个队列中,在循环的最后进行“清算”。
    不知道想法合理不,或者有什么更好的模式解决这类问题。
    第 1 条附言  ·  2015-06-10 20:57:28 +08:00
    语死早啊,我问的不是为什么会产生相杀以及相杀的原理,而是相杀发生的那一帧,程序做了什么。这个程序逻辑是如何设计。
    相杀对于程序来说是两个对象在同一时间互相产生的结果,其中不只是判定,还有判定后的状态的处理。
    @Mutoo 提到的http://gameprogrammingpatterns.com/double-buffer.html 就是我说的问题
    所以我认为双缓冲这个模式是解决这个问题的方案之一,有相同问题的可以参考。
    比较巧的是我搜到的是http://gameprogrammingpatterns.com/update-method.html 这一篇
    "Objects all simulate each frame but are not truly concurrent" 就是我提到的不是同时判定的问题。
    因为开始我认为double buffer就是显卡方面的问题,看了下确实有用。
    20 条回复    2015-06-10 20:01:19 +08:00
    canesten
        1
    canesten  
       2015-06-10 11:52:19 +08:00
    一般的格斗游戏都是按帧判定
    逐帧的做逻辑
    在每帧的时候判断每个角色的状态
    每个动作的判定帧都不一样
    有的快有的慢
    而且每个动作的判定优先级也不一样
    有的高有的低
    如果你深入玩过街霸就知道了
    canesten
        2
    canesten  
       2015-06-10 11:56:20 +08:00
    为什么街霸四里面杀意隆很屌
    就是因为他的下轻腿特别好按
    判定帧又很靠前
    所以很容易抢到判定优势
    打中以后可以接很强大的连续技
    lucky2touch
        3
    lucky2touch  
    OP
       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
        4
    chairuosen  
       2015-06-10 13:53:43 +08:00
    第一帧按下的动作,在第二帧执行,计算出结果但不写入,在第三帧写入?
    Mutoo
        5
    Mutoo  
       2015-06-10 14:06:23 +08:00   ❤️ 1
    这个是经典的双缓冲问题咯 看文中的例子,将双缓冲用于状态:
    http://gameprogrammingpatterns.com/double-buffer.html
    lucky2touch
        6
    lucky2touch  
    OP
       2015-06-10 14:27:22 +08:00
    @Mutoo 刚正好搜到这个模式设计,资料看起来不错,赞!
    jnduan
        7
    jnduan  
       2015-06-10 14:39:34 +08:00   ❤️ 1
    lucky2touch
        8
    lucky2touch  
    OP
       2015-06-10 14:54:24 +08:00
    @jnduan 这个了解基本原理还不错,不过还是讲得有点浅。
    w359405949
        9
    w359405949  
       2015-06-10 16:56:47 +08:00
    应该是先把所有检测到的碰撞整合起来,然后再依次处理碰撞相对应的逻辑。

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

    为什么不是hitbox的问题?当两个攻击的box相交时就相杀。
    https://www.youtube.com/user/UltraDecapre/videos 看了这视频应该对格斗机制有大概的了解。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5949 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 02:10 · PVG 10:10 · LAX 18:10 · JFK 21:10
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.