gamemaker吧 关注:13,688贴子:95,897
  • 22回复贴,共1

人攻击怪物的碰撞判断,应该写在人里还是怪里?

只看楼主收藏回复

人攻击怪物的碰撞判断,应该写在人里还是怪里?
怪物很多,怪的状态也很多,要是攻击的一瞬间每个都验证一次碰撞
那么大概要在零点几秒的时间里验证至少上千个碰撞检测。能保证不
卡么??或者造成攻击失误??


IP属地:吉林1楼2018-03-24 10:32回复
    应该都可以吧我渣渣,不敢确定


    IP属地:广东来自Android客户端2楼2018-03-24 10:52
    回复
      2026-01-25 22:32:52
      广告
      不感兴趣
      开通SVIP免广告
      写哪都一样,写人里需要检测上千碰撞,写怪里同样要检测上千碰撞。
      如果怕卡,一个原则就是,当事先筛选带来的效益大于筛选产生的消耗,一定要先事先筛选再检测碰撞。


      IP属地:上海来自Android客户端3楼2018-03-24 10:56
      回复
        写人那里和写怪那里都一样,碰撞判断交给游戏引擎就行了,相信引擎自己会有优化的。


        IP属地:浙江4楼2018-03-24 11:13
        回复
          谢谢大家。给的建议很不错!


          IP属地:吉林5楼2018-03-24 20:05
          回复
            肯定写在人上面,给怪物一个父类object,然后不同状态不同判定,可以直接if多种状态


            来自手机贴吧6楼2018-03-26 09:18
            回复
              肯定写在人上面,给怪物一个父类object,然后不同状态不同判定,可以直接if多种状态


              来自手机贴吧7楼2018-03-26 09:18
              回复
                我做洛克人同人的时候把造成伤害判定写在子弹里,把受伤判定写人里。因为子弹和人比怪少。关于怪多的问题,你应该尝试实例解散,很多地图大的游戏都是通过解散屏幕外面的实例减少计算,从而保证不卡。


                IP属地:北京来自iPhone客户端9楼2018-03-26 21:53
                收起回复
                  2026-01-25 22:26:52
                  广告
                  不感兴趣
                  开通SVIP免广告
                  你好,现在有很关键的问题,子弹击中玩家和
                  玩家操作失误撞到子弹上,其实是相同的代码吧?
                  你写在子弹里一次,然后再写在人物里一次,是不是就重复了?
                  重复的判定会不会引发2次伤害?第一次子弹打中人被删除了,
                  然后第二次,我们再删除一个已经删除了的子弹,会不会卡死?
                  都是大神,感谢你们回复我的帖子,很开心,趁你们都在,赶
                  紧把不会的疑问都解决掉。


                  IP属地:吉林10楼2018-03-27 07:00
                  回复
                    回复10楼:
                    应该会出现两种情况:
                    1,如果人物中先检测,然后删除了子弹,子弹就不存在了,不会造成二次检测和伤害。
                    2,如果子弹先检测,子弹删除后,人物代码中如果再对这颗子弹做遍历的话,会报错。
                    为什么要写到两处,代码统一写吧。
                    看了你的这些问题,最根本的问题就是,代码的执行顺序没搞明白。还有就是做游戏前
                    对整个游戏流程没做规划,想到一点,就敲一点代码,效率很低。
                    给你说说我一般做游戏的流程:
                    1,编写核心算法,如果没有,直接pass。
                    2,核心算法写成后,表示你的想法可实现。这时候就要构思整个游戏的流程。
                    也就是代码块之间的相互关系。哪些代码块先运行,哪些后运行,哪些被调用等等。
                    最终确定代码的位置。一般尽量降低开销。
                    3,每个代码块的编写。
                    这个很自由,每个人都有自己的风格,我更偏向利用脚本。比如对玩家的移动
                    编写一个脚本,玩家的技能,编写一个脚本,事件的触发编写脚本等等,一切
                    代码基本全写到脚本里,在对象内部,直接调用等等。
                    4,最后一步,就是对代码的优化。
                    最后回答你最初的问题,代码写到哪里,其实都可以。看你怎么安排你的代码,也就是第2步。
                    你可以在怪物内部判断,也可以在人物中遍历。开销差不多,关键看你的整个游戏代码块之间的逻辑关系。
                    我的做法是,把碰撞判断放到技能脚本代码块儿中去,然后伤害输出放到统一的代码块。比如伪代码:
                    ----------------------
                    伤害heartEnemy脚本:
                    revOBJ=argument0;
                    revValue=argument1;
                    revOBJ.hp-=revValue;
                    if(revOBJ.hp<0){
                    //删除怪物等等处理
                    }
                    -------------------------
                    技能0,基本攻击skill_0脚本:
                    var revOBJ;//伤害对象,如果是群攻就用list等等
                    var sendOBJ;//伤害输出者
                    var sendValue;//传递的伤害
                    var i;
                    sendOBJ=argument0;
                    for(i=0;i<ss;ss+=1){
                    //武器的碰撞判断,遍历出被攻击的怪物
                    }
                    //调用伤害脚本
                    heartEnemy(sendOBJ.attack,revOBJ)
                    -------------------------
                    玩家按键触发脚本keyEvent
                    if(keyPressA){
                    then move LEFT
                    }
                    else if(keyPressD){
                    then move RIGHT
                    }
                    else if(keyPressW){
                    then move UP
                    }
                    else if(keyPressS){
                    then move DOWN
                    }//技能触发
                    else if(keyPressJ){
                    skill_0();
                    }
                    ---------------------
                    然后玩家步事件中,把keyEvent()调用出来即可。
                    后面的技能,按照这种模式,直接添加skill_1....skill_n脚本就编写完了
                    所有技能。
                    所以这种方式效率就快多了,而且错误的话,也容易查找。


                    12楼2018-03-27 09:48
                    收起回复
                      自认为板栗仔说的灰常有道理,我也是这么想的


                      IP属地:陕西来自手机贴吧13楼2018-03-27 21:17
                      回复
                        逻辑相同,写在实例少的对象里较好。
                        如果人物对所有怪攻击的逻辑都是相同的,我认为写在人对象里就可以。
                        但如果某些被攻击的怪物有特殊处理(攻击反弹、流血、播放不同音效等),这种情况我认为写在怪里逻辑更清晰一些。


                        IP属地:北京14楼2018-03-29 21:09
                        回复