求助一个技能设计的问题,大佬们帮助优化下设计吧。
gamemaker吧
全部回复
仅看楼主
level 4
具体的代码先不贴出来,只说下思路,看看有没有办法优化或者别的地方入手。当然里面用了好多笨方法,肯请大家不吝指正。因为我做的事一个arpg,具体问题是在技能方面出问题的。设计是技能玩家可以扔,npc也可以,所以代码是写在技能里的。
这里技能设计分为四大类吧,第一种是剑气类的技能,这种可以被格挡,可以被闪避,碰到人之后扣血,然后自己摧毁自己。第二种是类似普通攻击,就是一个刀光,这种可以被格挡闪避,碰到的掉血。第三种是范围的爆发伤害,比如炸弹?不可被闪避格挡。第四种是范围持续伤害的类型,比如毒雾,同样不能被格挡和闪避。
因为是所有人都可以放技能,所以每当玩家或者npc发射技能的时候,此时会给技能一个目标。比如目标是敌人,这时候技能碰到敌人掉血,碰到玩家不会。反之敌人发射的只会碰到玩家扣血。当然也存在一种不分敌我的技能,类似流星雨之类?
然后就是说一下闪避的机制,大概是给出一个“身法”属性,比如身法属性是20,假设技能碰到人了,此时irandom(100) < 身法的时候,此时技能会被闪避,会从敌人身上穿过去,不造成伤害。
最后一个就是格挡这些了,这里受限于素材原因,格挡我做的是一个类似保护罩的半球,格挡的时候动画就是前面出现一个保护罩,这时候可以防御正前方的可防御技能。差不多做法是技能碰到人之后,通过人的面朝向和计算人的贴图中间到技能的夹角来判断技能是正面被格挡了,还是打到背后没有被格挡。
所以大概的思路应该是这样的。
if(技能类型是为有方向无速度的爆发技能,比如普通攻击的刀光){
if(image_index == 技能动画最中间的一帧){//因为爆发技能,我设定是动画播放一半的时候计算扣血
if(技能的目标 == npc){
if(技能打到npc){
if(技能没有被闪避){
if(技能没有被格挡 || 技能被格挡失败){
npc掉血;
}
}
}
}
}
}
最后先给回帖的大佬们道歉吧,这个代码因为还在修改中,加上本人路子比较野,估计贴出来也是天书,没人看得懂的那种。。这里只是说下思路。其实我感觉思路没问题的,游戏里也确实实现了这些效果。但是实际上十几个if嵌套下来,我自己也是头皮发麻。实际写的时候当然也有封装函数的。只是这个思路或者算法能优化吗,或者大家在做arpg的时候这种情况一般怎么处理。实际情况的if嵌套比上面的还严重,比如第二层,除了if技能目标是npc的情况,还有if技能目标是玩家的情况。。第三层,除了if技能打到npc,还有技能打到玩家做出的处理。。毕竟有的技能是不分敌我的。。
2020年01月21日 04点01分 1
吧务
level 13
这if套了6层,有点不明所以啊。
0.技能类型是为有方向无速度的爆发技能,比如普通攻击的刀光 //不明所以,从你的说明上看,所有的技能都有伤害判定
1.image_index == 技能动画最中间的一帧 //认可
2.技能的目标 == npc //分多种情况,可以和3合并
3.技能打到npc //同2,统一成“目标判定”
4.技能没有被闪避 //分多种情况,和5合并
5.技能没有被格挡 || 技能被格挡失败 //同4,统一成“成功判定”
如果按这个做法的话,就只是3层
0.是否处于伤害判定帧;
1.是否是该判定伤害的目标;
2.是否成功造成伤害;
其中1的简写就是if(other.type=target_type),如果LZ是在“技能”的碰撞事件里这么做,且技能定义了target_type,且所有碰撞目标都有type属性。
而2就是if(不可闪避/格挡 || (格挡角度不对 && 闪避失败)),目标如果处于未格挡状态时用格挡角度=-1000来表示,这样即使是用“攻击角度与格挡角度的角度差”来判定也没问题。
2020年01月21日 05点01分 2
我回家了去看看哦,早知道扣扣上问你啦,
2020年01月21日 05点01分
1