设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 2327|回复: 32
打印 上一主题 下一主题

[已经解决] [已解决]请帮忙读下这段代码,代码过长不知道我自己理解...

[复制链接]

Lv4.逐梦者

梦石
0
星屑
14581
在线时间
2192 小时
注册时间
2019-1-24
帖子
1123

R考场第七期纪念奖

跳转到指定楼层
1
发表于 2019-5-14 15:01:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
本帖最后由 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

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

我照着字面理解不是太明白,希望大大翻译下口语化最好

Lv5.捕梦者

梦石
0
星屑
39009
在线时间
5716 小时
注册时间
2006-11-10
帖子
6618
2
发表于 2019-5-14 16:27:26 | 只看该作者
本帖最后由 灯笼菜刀王 于 2019-5-14 16:29 编辑

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

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

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

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

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

后话, 要想理解战斗系统的脚本, 要结合实际的战斗流程和表现方式, 这样才更容易理解, 否则光看脚本, 你是很难想像这些变量有什么用, 为什么要这样写的

点评

怎么冲突了? 这句的效果是"什么情况下调用战斗图显示特效", 条件当然是, 1战斗图是不显示的时候, 2战斗者不是隐藏状态, 3,战斗者不是死亡状态下   发表于 2019-5-14 21:57
你把hidden当做"隐藏状态开关" 这样去理解, 打开的时候(true)就是隐藏, 关闭的时候(false)就是不隐藏  发表于 2019-5-14 21:55
都不算, 如果你开始写脚本就会清楚了, 脚本其实是东补西补凑出来的XD, 写的时候没考虑到, 测试的时候发现了,就补上相关判断, 这种是很常见的  发表于 2019-5-14 21:54
,战斗图不显示状态,战斗者不是隐藏状态(显示状态)怎么感觉冲突。  发表于 2019-5-14 21:45
@battler_visible 的值是假的时候(也就是战斗图不显示状态), 如果这个时候,战斗者不是隐藏状态(not hidden) 这句怎么这么绕  发表于 2019-5-14 21:44
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
14581
在线时间
2192 小时
注册时间
2019-1-24
帖子
1123

R考场第七期纪念奖

3
 楼主| 发表于 2019-5-14 21:11:06 | 只看该作者
本帖最后由 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这些是标志,并不是执行隐藏命令,显示命令

点评

可以用 p 命令看调用的状态, 时机等, 并试试换成不同的数值会出现什么样的变化, 就像你测试复活那样,就明白这个干嘛用的了  发表于 2019-5-14 21:52
3, 就是如果某个变量或者函数或者方法不清楚干嘛用的, 就全局搜索, 看它是在什么地方调用, 显示出什么样的效果的, 也可以说是动手测试  发表于 2019-5-14 21:51
2, 伤害显示的步骤在scene_battle 4里调用, 要理解的话, 需要对战斗系统步骤很熟悉, 这个慢慢来就好  发表于 2019-5-14 21:49
1,可以把它当做一个开关, 这个开关负责预约战斗图片显示和消失的特效  发表于 2019-5-14 21:47
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
14581
在线时间
2192 小时
注册时间
2019-1-24
帖子
1123

R考场第七期纪念奖

4
 楼主| 发表于 2019-5-14 21:25:47 | 只看该作者
本帖最后由 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

   
   

点评

第一个是登场的时候, 如果登场的时候是死亡状态(我方) 或者 隐藏状态(敌人设置中途出现), 图片透明度为0  发表于 2019-5-14 21:59
回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
39009
在线时间
5716 小时
注册时间
2006-11-10
帖子
6618
5
发表于 2019-5-14 22:11:54 | 只看该作者
本帖最后由 灯笼菜刀王 于 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, 不管是死还是活

点评

scene battle 4 的def set_target_battlers(scope)里, 根据技能范围分歧,把对象放到目标数组里  发表于 2019-5-16 16:28
全局搜索了下,还是拿不准是哪块,望指出!  发表于 2019-5-16 11:35
不是, 那段只是用来限制技能效果, 判定复活技能能否使用的地方, 你可以搜索 hp0? 这个函数  发表于 2019-5-15 23:48
判断复活的位置是不是我今天发的那段代码,if ((skill.scope == 3 or skill.scope == 4) and self.hp == 0) or ((skill.scope == 5 or skill.scope == 6) 这段  发表于 2019-5-15 22:24
因为这个是在使用技能之前判断的, 你的复活技能不能用在没死的人身上, 也不能用在隐藏的人身上  发表于 2019-5-15 16:36

评分

参与人数 1星屑 +200 收起 理由
RyanBern + 200 认可答案

查看全部评分

回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
35180
在线时间
4169 小时
注册时间
2007-12-15
帖子
10066
6
发表于 2019-5-15 06:10:59 | 只看该作者
本帖最后由 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

点评

真位移限制我随心所欲的话动作,每个角色动作要帧数一样不能忍。第三个情况我是能接受,因为敌人全动态我画不过来,有的敌人还得单张图。  发表于 2019-5-15 13:52
有个疑问,你说你系统不是真位移,也就是用齐时动画被,你为什么不用真位移呢?另外我对你说的第3个问题比较好奇,怎么会有这个情况发生呢?  发表于 2019-5-15 11:59
fux2 我看了你写的rgss运行过程那篇文章收获很大,对写脚本很有帮助,希望多多写一些脚本分析。  发表于 2019-5-15 11:56
感谢分享心得,我现在还谈不到制作完美,我现在就是想能读懂默认脚本,进而进行修改,看来你所遇到的困难,我以后也是至多不少,也拓宽思路。  发表于 2019-5-15 11:55
这也太长了  发表于 2019-5-15 11:28
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-14 14:17

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表