人攻击怪物的碰撞判断,应该写在人里还是怪里?
gamemaker吧
全部回复
仅看楼主
level 1
人攻击怪物的碰撞判断,应该写在人里还是怪里?
怪物很多,怪的状态也很多,要是攻击的一瞬间每个都验证一次碰撞
那么大概要在零点几秒的时间里验证至少上千个碰撞检测。能保证不
卡么??或者造成攻击失误??
2018年03月24日 02点03分 1
level 8
应该都可以吧[哈哈]我渣渣,不敢确定
2018年03月24日 02点03分 2
level 15
写哪都一样,写人里需要检测上千碰撞,写怪里同样要检测上千碰撞。
如果怕卡,一个原则就是,当事先筛选带来的效益大于筛选产生的消耗,一定要先事先筛选再检测碰撞。
2018年03月24日 02点03分 3
level 9
写人那里和写怪那里都一样,碰撞判断交给游戏引擎就行了,相信引擎自己会有优化的。
2018年03月24日 03点03分 4
level 1
[呵呵]谢谢大家。给的建议很不错!
2018年03月24日 12点03分 5
level 6
肯定写在人上面,给怪物一个父类object,然后不同状态不同判定,可以直接if多种状态
2018年03月26日 01点03分 6
level 6
肯定写在人上面,给怪物一个父类object,然后不同状态不同判定,可以直接if多种状态
2018年03月26日 01点03分 7
level 12
我做洛克人同人的时候把造成伤害判定写在子弹里,把受伤判定写人里。因为子弹和人比怪少。关于怪多的问题,你应该尝试实例解散,很多地图大的游戏都是通过解散屏幕外面的实例减少计算,从而保证不卡。[滑稽]
2018年03月26日 13点03分 9
你说的实例解散,我一定会学习的,谢谢你!
2018年03月26日 23点03分
伤害判定是碰撞之后出现撞击特效玩家HP下降播放受伤动作然后删除子弹,受伤判定不也是同样的吗?伤害判定和受伤判定哪里不一样?
2018年03月26日 23点03分
回复 ★未熟的恶魔★ :我指的伤害判定是给敌人造成伤害,受伤指玩家受伤。
2018年03月27日 13点03分
level 1
你好,现在有很关键的问题,子弹击中玩家和
玩家操作失误撞到子弹上,其实是相同的代码吧?
你写在子弹里一次,然后再写在人物里一次,是不是就重复了?
重复的判定会不会引发2次伤害?第一次子弹打中人被删除了,
然后第二次,我们再删除一个已经删除了的子弹,会不会卡死?
都是大神,感谢你们回复我的帖子,很开心,趁你们都在,赶
紧把不会的疑问都解决掉。
2018年03月26日 23点03分 10
level 8
回复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脚本就编写完了
所有技能。
所以这种方式效率就快多了,而且错误的话,也容易查找。
2018年03月27日 01点03分 12
伪代码ss表示怪物数量,或者先判断可能受到伤害的怪物,灵活处理,算法自由。
2018年03月27日 01点03分
非常感谢你,你说这么多,我其实没懂,因为我根本不会批量判断,都是一个判断完了接下一个判断。你说的这些是GMS2里面的吗?GM8里面有么?我用的是论坛的老版本。虽然不懂,但看起来很好,以后应该学!
2018年03月27日 01点03分
@★未熟的恶魔★ 我说的这些都适用,游戏做多了,自然就明白啦,先做小游戏练练手吧。
2018年03月27日 02点03分
@四脚盘带 四脚最近有在做什么没
2018年03月27日 02点03分
level 10
自认为板栗仔说的灰常有道理,我也是这么想的
2018年03月27日 13点03分 13
吧务
level 12
逻辑相同,写在实例少的对象里较好。
如果人物对所有怪攻击的逻辑都是相同的,我认为写在人对象里就可以。
但如果某些被攻击的怪物有特殊处理(攻击反弹、流血、播放不同音效等),这种情况我认为写在怪里逻辑更清晰一些。
2018年03月29日 13点03分 14
1