Project1

标题: [已解决]请帮忙读下这段代码,代码过长不知道我自己理解... [打印本页]

作者: miantouchi    时间: 2019-5-14 15:01
标题: [已解决]请帮忙读下这段代码,代码过长不知道我自己理解...
本帖最后由 miantouchi 于 2019-5-16 20:45 编辑

RUBY 代码复制
  1. # 不可见的情况下
  2.     unless @battler_visible
  3.       # 出现
  4.       if not @battler.hidden and not @battler.dead? and
  5.          (@battler.damage == nil or @battler.damage_pop)
  6.         appear
  7.         @battler_visible = true
  8.       end
  9.     end

写成一行
RUBY 代码复制
  1. # 不可见的情况下
  2.     unless @battler_visible
  3.       # 出现
  4.       if not @battler.hidden and not @battler.dead? and(@battler.damage == nil or @battler.damage_pop)
  5.         appear
  6.         @battler_visible = true
  7.       end
  8.     end

除非战斗者不可见(执行如下)
        如果 战斗者不隐藏 并且  战斗者没死 并且 (战斗者伤害为空 或者 战斗者 伤害标志为 真)
                显示
        战斗者显示
结束

我照着字面理解不是太明白,希望大大翻译下口语化最好
作者: 灯笼菜刀王    时间: 2019-5-14 16:27
本帖最后由 灯笼菜刀王 于 2019-5-14 16:29 编辑

你的理解没错, @battler_visible 这个实变量是 用来判断 该精灵实例是否显示图片的

你可能会有疑问, 精灵直接用 visible 就可以控制图片显示以否了, 为什么还要多个@battler_visible ?

从脚本的UPDATE里可以看到, @battler_visible 的值改变后, 会调用一个 Sprite 的方法, 用来动态显示图片或者让图片消失,  所以不直接操作 visible 就是为了这个动态效果

然后, 回到你这句, 它的意思就是 @battler_visible 的值是假的时候(也就是战斗图不显示状态), 如果这个时候,战斗者不是隐藏状态(not hidden), 不是死亡状态, 就让战斗图动态显示出来, 后面括号里的先不用管

这个效果就是游戏里, 敌人中途出现(hidden = false 隐藏标志关闭) 或者 复活后的特效, 括号里的那两个是为了"复活动画播放完,伤害显示出来后, 战斗图再显示出来", 没括号里的那个判定的话, 你一用复活技能, 死掉的人就马上蹦起来了, 然后和你一起看复活动画

后话, 要想理解战斗系统的脚本, 要结合实际的战斗流程和表现方式, 这样才更容易理解, 否则光看脚本, 你是很难想像这些变量有什么用, 为什么要这样写的
作者: miantouchi    时间: 2019-5-14 21:11
本帖最后由 miantouchi 于 2019-5-14 21:16 编辑
灯笼菜刀王 发表于 2019-5-14 16:27
你的理解没错, @battler_visible 这个实变量是 用来判断 该精灵实例是否显示图片的

你可能会有疑问, 精灵 ...


第一:@battler_visible 初始值是false
为了调用appear,escape,collapse这些效果吧(你标记的红色字体那句话吧),
如果appear调用后了,@battler_visible = true
就可以调用下面# 可见的情况下
就有机会调用escape,collapse这两个方法特效,
escape,collapse这两个方法如果哪个被调用了,
@battler_visible = false就恢复原样,
便于下次update

第二:
去掉了你说的两句,人物图片先出来了,然后才是特效。
确实鬼畜,理解不深刻,但是知道去掉的后果了。

第三,你说的结合实际的战斗流程和表现方式, 这样才更容易理解, 否则光看脚本
是不是要测试游戏,然后看代码

第四:我可能有误区,@battler_visible和hidden这些是标志,并不是执行隐藏命令,显示命令
作者: miantouchi    时间: 2019-5-14 21:25
本帖最后由 miantouchi 于 2019-5-14 21:27 编辑



这三处的@battler.hidden标记值是怎么变的,我不太清楚

第二处只有当 @battler.hidden = false时 ,
才能执行下面这段,# 可见的情况下
此时第三处@battler.hidden = false则不执行逃跑的代码特效

RUBY 代码复制
  1. # 可见的情况下
  2.     if @battler_visible
  3.       # 逃跑
  4.       if @battler.hidden
  5.         $game_system.se_play($data_system.escape_se)
  6.         escape
  7.         @battler_visible = false
  8.       end
  9.       # 白色闪烁
  10.       if @battler.white_flash
  11.         whiten
  12.         @battler.white_flash = false
  13.       end
  14.       # 动画
  15.       if @battler.animation_id != 0
  16.         animation = $data_animations[@battler.animation_id]
  17.         animation(animation, @battler.animation_hit)
  18.         @battler.animation_id = 0
  19.       end
  20.       # 伤害
  21.       if @battler.damage_pop
  22.         damage(@battler.damage, @battler.critical)
  23.         @battler.damage = nil
  24.         @battler.critical = false
  25.         @battler.damage_pop = false
  26.       end
  27.       # korapusu
  28.       if @battler.damage == nil and @battler.dead?
  29.         if @battler.is_a?(Game_Enemy)
  30.           $game_system.se_play($data_system.enemy_collapse_se)
  31.         else
  32.           $game_system.se_play($data_system.actor_collapse_se)
  33.         end
  34.         collapse
  35.         @battler_visible = false
  36.       end
  37.     end

   
   
作者: 灯笼菜刀王    时间: 2019-5-14 22:11
本帖最后由 灯笼菜刀王 于 2019-5-14 22:32 编辑

第一个是登场的时候, 如果登场的时候是死亡状态(我方) 或者 隐藏状态(敌人设置中途出现), 图片透明度为0(为之后的显示图片特效做准备)

设置敌人中途出现,就是把 hidden (隐藏开关) 打开, 设置方法是在数据库敌群设置里, 右键勾上中途出现即可, 这样这个敌人战斗开始的时候就是隐藏的, 不会攻击也不会被攻击

第二个就是 实施中途出现, 让隐藏的敌人在战斗中出现, 做乱入,召唤等效果, 这个是用战斗事件启动的,  方法就是关闭 hidden(隐藏开关)

有两种情况用到这个判断, 一个是隐藏的敌人出现, 隐藏的敌人, 它的状态是: hidden打开的 非死亡, 所以,只要把hidden关上, 那这行条件就满足了, 调用显示图片特效, 战斗图出现, 新的敌人乱入成功

另一个就是复活,  死亡的角色, 它的状态是: hidden关闭的 死亡中 , 所以只要解除死亡状态, 那这行条件就满足了, 调用显示图片特效, 战斗图出现, 角色复活成功

PS: hidden(隐藏开关)打开的时候是不能复活的, 因为 hp0? 这个复活对象的判断方法里就是判定 hidden==false and hp == 0 才成立

3, 就是逃跑的处理, game_enemy 里, 找到定义逃跑方法, 你就会看到内容就是打开 hidden(隐藏开关)

默认战斗, 正常情况下是不会操作到 hidden 的,  只有设置"中途出现" 或者"敌人逃跑" 才会操作到它, 所以没有这两种情况的时候, hidden的值始终都是false, 不管是死还是活


作者: 89444640    时间: 2019-5-15 06:10
本帖最后由 89444640 于 2019-5-15 06:17 编辑

其实,楼主你看代码,有实际效果的真的应该结合游戏画面进行,在想实现一些效果的时候,如果有全套的素材,很容易知道哪里应该怎么做。没自己素材可以找个商业级别的全套图,或者某个MV被用烂了的质量很高的免费图测试用,比什么图都没有干想强好多。
程序运行的根本目的,是为游戏如何更好的显示自己需要的图像而运行的,过程有很多种,但是能看到的是最终结果。有可能过程很扭曲,(比如我这脚本堆,一片重定义)但是结果正常就行了,优化代码这事单说。
虽然说直接黑方块改成白方块也行,单实际运行的区别不如真正的角色图像来的更明白。
一定要要正确认识有对应图像的重要性,他能在你程序不是很明确的情况下,帮自己检测哪里出了问题。
比如昨天,我就碰到了用V(X,Y)在设置角色移动路线中给某个变量赋值,用F9检查变量也确实变化了,但是用这个变量控制的其他事件死活就不变道第二页当变量为1的情况,图像表现就是地铁到站以后死活不给我开门T T
后来发现,需要后面加个 什么什么……我记不住,反正就是要让变量赋值以后刷新一下,这样本地图的其他事件才会变道变量为1的第二页去执行其他命令。

然后上面的那个,菜刀描述的异常,一说我就知道是哪里,虽然不知道代码怎么写的,但是实际运行中,这些异常我基本都碰到过。

这个隐藏角色图像,用想的很难知道应该哪里消失,其实很多时候都需要
然后,不但要考虑己方,还要考虑敌方,而且敌方还得分有没有动态图像,单张图好做,敌人有动态要和角色一样处理。

1、在角色有待机的时候,只要更改了角色图像,并且角色不在原地执行行动,就都要消失,
2、角色的全屏招式一打多时候需要消失,根据招式的实际效果,决定是己方全体消失还是敌人和己方都消失只留下角色动画和对象方动画。
3、由于我这个系统没有真实位移,所以角色非原地出招攻击的时候,角色头顶上的所有状态动画应该消失,如果角色前冲角色也要一起消失
4、死亡后,没有敌人/角色死亡图像的情况下,敌人调用默认方法消失
5、敌人在战斗途中出现的话,为满足条件时候无论是静态还是动态都是隐藏的。 这个就以前的全动画脚本没想到,结果无比恶心,我没法战斗中出现敌人,因为这样会造成一开始就有但是进行攻击,等到满足条件了才可以选择,无比难受,而且当年我没法解决只能不出现这样的敌人群组……
6、敌人分别逃跑的情况,自身消失,角色分别逃跑的情况,角色自身消失。这个意思是角色自己跑自己的,只要有一个没跑呗打死就算游戏结束的那种。
7、这个是我添加以后才碰到的,反正我想画就画XD,
角色有入场动画的情况下,是全体都有一起入场还是分别入场,如果分别入场,如何随机,被随机到的角色就要一开始是隐藏的。
然后就碰到了个没想到的情况,角色如果死亡怎么办,死亡时候角色有动态过程和最后一帧的静态的,这时候就不能再播放入场动画了,否则效果就是,角色已经战斗不能了,然后播放入场动画,播放完毕跑到死亡静态帧躺下。
这时候就要让随机不抽到已经战斗不能的角色。或者加个判断,随机到了处于状态战斗不能时的角色,不播放入场动画。

8、这个是刚写上面问题时候想到的,我这里给与敌人最后一击的角色会播放胜利动画,主角随机5,根据变量增加胜利动作,其他人就一个。
设当前2个参战角色,角色1使用毒,敌人中毒了,下回合敌人攻击己方放毒的角色1造成角色1死亡,然后敌人因为掉血死亡了,按照当前的判断,可能会出现角色从战斗不能状态蹦起来,播放胜利动画…………
还有,现在能在战斗中换人,如果是角色1放毒,下回合先被换下去了,然后敌人因为掉血而死亡,是换下去的角色会继承刚才角色的胜利播放胜利动画,还是因为无法判断角色会而跳出。
由此衍生,所有的有持续伤害造成敌人死亡的情况,在角色处于哪些情况,不播放胜利动画。
另外爱丽丝这有点特殊,
上面的判断我觉得都没加过,回头问下菜刀看看。
爱丽丝招式有点特殊,由于我实在画不过,来暂时没调爱丽丝的战斗动画,
菜刀你看下,爱丽丝被替换时候要考虑清除掉敌人里面,爱丽丝给与的状态,虽然说菜刀的设计,爱丽丝形成完整攻击态势需要很多回合,有病的玩家才会让已经形成攻击态势的爱丽丝换下去,但是有病人很多呀XD。


然后这些都不是一下发现的,都是要结合游戏实际运行才能一点一点修理出来的,所以别指望一下就写的什么毛病没有,除非天生就是程序脑想法和计算机一样……,一般人都不可能的,要在写的时候反复测试。
另外,找个人一起商量也是好主意。当然有的美工基本不听话就是啦~XD




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1