"相杀"判定设计例子 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Game Engines
Unreal Engine
MyCryENGINE
lucky2touch
V2EX    游戏开发

"相杀"判定设计例子

  •  
  •   lucky2touch 205-06-10 11:35:48 +08:00 5449 次点击
    这是一个创建于 3833 天前的主题,其中的信息可能已经有所发展或是发生改变。
    最近捣鼓了下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     Solana     793 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 21:36 PVG 05:36 LAX 13:36 JFK 16:36
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86