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

Project1

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

[推荐问答] [已解决]【步骤1】准备行动update_phase4_step1,理解问题请教!

[复制链接]

Lv4.逐梦者

梦石
0
星屑
14131
在线时间
2143 小时
注册时间
2019-1-24
帖子
1121

R考场第七期纪念奖

跳转到指定楼层
1
发表于 2019-5-26 20:07:56 | 显示全部楼层 |只看大图 回帖奖励 |倒序浏览 |阅读模式

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

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

x
本帖最后由 miantouchi 于 2019-6-1 10:59 编辑

最近在研究Scene_Battle机制,遇到点问题,请教下,首先是看了RB的文字教程,并且这个脚本也有汉字的注释了,有些地方是道理性质的通过明白,
但是代码的实质指向包含何意没有深刻的理解,由于本人没有什么基础,还是不是太明白。
打的字有点多,请耐心阅读
RUBY 代码复制
  1. def update_phase4_step1
  2.     # 隐藏帮助窗口
  3.     @help_window.visible = false
  4.     # 判定胜败
  5.     if judge
  6.       # 胜利或者失败的情况下 : 过程结束
  7.       return
  8.     end
  9.     # 强制行动的战斗者不存在的情况下
  10.     if $game_temp.forcing_battler == nil
  11.       # 设置战斗事件
  12.       setup_battle_event
  13.       # 执行战斗事件中的情况下
  14.       if $game_system.battle_interpreter.running?
  15.         return
  16.       end
  17.     end
  18.     # 强制行动的战斗者存在的情况下
  19.     if $game_temp.forcing_battler != nil
  20.       # 在头部添加后移动
  21.       @action_battlers.delete($game_temp.forcing_battler)
  22.       @action_battlers.unshift($game_temp.forcing_battler)
  23.     end
  24.     # 未行动的战斗者不存在的情况下 (全员已经行动)
  25.     if @action_battlers.size == 0
  26.       # 开始同伴命令回合
  27.       start_phase2
  28.       return
  29.     end
  30.     # 初始化动画 ID 和公共事件 ID
  31.     @animation1_id = 0
  32.     @animation2_id = 0
  33.     @common_event_id = 0
  34.     # 未行动的战斗者移动到序列的头部
  35.     @active_battler = @action_battlers.shift
  36.     # 如果已经在战斗之外的情况下
  37.     if @active_battler.index == nil
  38.       return
  39.     end
  40.     # 连续伤害
  41.     if @active_battler.hp > 0 and @active_battler.slip_damage?
  42.       @active_battler.slip_damage_effect
  43.       @active_battler.damage_pop = true
  44.     end
  45.     # 自然解除状态
  46.     @active_battler.remove_states_auto
  47.     # 刷新状态窗口
  48.     @status_window.refresh
  49.     # 移至步骤 2
  50.     @phase4_step = 2
  51.   end


1.强制行动的战斗者 指什么?,怎么设置才是存在,怎么设置才是不存在?不太明白啊。
但从字面上能解释点。
2.@action_battlers.delete($game_temp.forcing_battler)
   @action_battlers.unshift($game_temp.forcing_battler)
是不是从@action_battlers当中先删除$game_temp.forcing_battler
然后把$game_temp.forcing_battler这个强制行动的战斗者添加到首位,
达到置前的意思。
3.未行动的战斗者不存在的情况下,用@action_battlers.size == 0这个判断我不是很理解,
队员人数一直都是固定的,是怎么减少的呢?
4.@active_battler.damage_pop = true,这句什么时候起到作用了,是不是设置true后就用在哪块用了,起到效果了。
(比如点灯开关打开了,我知道开关开了能亮,我不知道线路是怎么走的)


我能按照注释和代码理解的如下,对吗?:
如果战斗胜败能够确定(即主角队伍和敌人队伍之一全灭),那么直接结束主回合,
在主角队伍胜利的情况下,进入战斗的第五个阶段。
在主角队伍失败的情况下,显示游戏结束或者进入游戏地图。
否则   才能进行下面的内容
强制行动的战斗者不存在的情况下,设置战斗事件,执行战斗事件中的情况下进行返回,结束
强制行动的战斗者存在的情况下,把强制行动的战斗者添加到首位,置前
如果全员已经行动,开始同伴命令回合后返回,结束
初始化动画 ID 和公共事件 ID
把序列数组当中第一个未行动人员删除,并且把第一个人员存放到@active_battler里面,(依次删除首位,提取每次首位的未行动人)
接着判断如果,当前未行动人,血量大于0并且 连续伤害标记,就应用应用连续伤害效果和显示伤害标志设置为true
最后刷新状态窗口,移动到@phase4_step = 2(主回合步骤 2 : 开始行动)


评分

参与人数 1星屑 +60 收起 理由
RyanBern + 60 推荐问答

查看全部评分

Lv4.逐梦者

梦石
0
星屑
14131
在线时间
2143 小时
注册时间
2019-1-24
帖子
1121

R考场第七期纪念奖

2
 楼主| 发表于 2019-5-27 20:14:43 | 显示全部楼层
本帖最后由 miantouchi 于 2019-5-27 20:37 编辑
灯笼菜刀王 发表于 2019-5-26 22:33
1, 强制行动, 事件设置的, 具体去看"RMXP入门",不改造脚本的情况下要制作一些特殊战斗效果, 一般就是用它来 ...


今天头疼了一天,吃点药继续克。

1。今天从战斗事件里面找到了,简单体会了下
2.强制行动(立即行动的情况下),会让强制行动人员,在本轮第一个出手。
3,大概理解了就是,我方和敌方人员按速度从大到小排序存放在数组当中,然后依次通过shift方法取出前面的人,依次进行连续伤害、自然解除状态、刷新状态窗口,直到数组size为0,就进行下一回合。
4.(1)你说的搜索  def slip_damage_effect 这句, 这里有操作伤害(即@active_battler.damage != nil)是不是意思,执行def slip_damage_effect这个方法,就能证明是有伤害的,因为这个方法就是计算伤害值的。
   (2)Sprite_battler 的 update 是在什么时候调用的什么地方调用这个update刷新的,我怎么找不到?

最后一个作业,测试下了,用完技能,我方第一个人员会出现“天下无敌”字样。
a.damage_pop = false,就不会显示了,证明damage_pop是你上面说的显示开关,
例子中用于在我方人员身上显示,天下无敌的开关。

所以
# 连续伤害
    if @active_battler.hp > 0 and @active_battler.slip_damage?
      @active_battler.slip_damage_effect
      @active_battler.damage_pop = true
    end
这段代码,就是获取当前行动者如果HP>0并且这个行动者有连续伤害
那么计算slip_damage_effect伤害值,把这个人员身上的伤害的显示开关打开。

另外,最后一个问题。
@active_battler = @action_battlers.shift
    # 如果已经在战斗之外的情况下
    if @active_battler.index == nil
      return
    end

战斗之外的情况下是什么情况,比如我方和敌方攻击6人,我方4人、敌方2人,6个人开始都是未行动人员,挨个就行伤害处理了。
@active_battler.index == nil是啥情况?





点评

上面已经注释了“在战斗之外的情况下”,比如因为计时器导致战斗提前结束  发表于 2019-5-27 22:16
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
14131
在线时间
2143 小时
注册时间
2019-1-24
帖子
1121

R考场第七期纪念奖

3
 楼主| 发表于 2019-5-28 13:34:49 | 显示全部楼层
本帖最后由 miantouchi 于 2019-5-29 07:37 编辑
灯笼菜刀王 发表于 2019-5-28 00:01
这就是XP默认的伤害显示调用方法 battler.damage != nil 且 battler.damage_pop == true

batt ...


第一步:先讨论第一个问题吧,
if @active_battler.hp > 0 and @active_battler.slip_damage?
      @active_battler.slip_damage_effect
      @active_battler.damage_pop = true
end
执行这块后,正如你所说这个时候
battler.damage != nil
battler.damage_pop == true


第二步:接下来会刷新一次
loop do
      # 刷新游戏画面
      Graphics.update
      # 刷新输入信息
      Input.update
      # 刷新画面
      update
      # 如果画面切换的话就中断循环
      if $scene != self
        break
      end
end
update
    # 刷新活动块
    @spriteset.update
end
第三步到达Spriteset_Battle,update里面
   # 刷新战斗者的活动块
for sprite in @enemy_sprites + @actor_sprites
      sprite.update
end

第四步到达Sprite_Battler类里面的update.

下面切入正题:假如我方有一人死亡,现在对他使用复活技能。
unless @battler_visible
      # 出现
      if not @battler.hidden and not @battler.dead? and
         (@battler.damage == nil or @battler.damage_pop)
        appear
        @battler_visible = true
      end
end
这时@battler.hidden = false  
@battler.dead? = false(由于我方使用复活技能由true变成false)
@battler.damage != nil (最开始得知)
@battler.damage_pop = true(最开始得知)
所以,上面的条件 not false and not false(false or true) 条件是成立的,appear,让使精灵从透明状态平滑渐变为不透明状态。

接下来执行动画
#
      if @battler.animation_id != 0
        animation = $data_animations[@battler.animation_id]
        animation(animation, @battler.animation_hit) #显示动画
        @battler.animation_id = 0
      end
      # 这块开始显示伤害数值
      if @battler.damage_pop
        damage(@battler.damage, @battler.critical) #使伤害的数字或“Miss”等字符串弹出在精灵前面,critical 指定真的话,会在伤害字符串上追加小的“CRITICAL”的文字
        @battler.damage = nil
        @battler.critical = false
        @battler.damage_pop = false
      end
我怎么分析后,还是人物先出来,然后出现动画和伤害。虽然你第一段说的很明白了,我也知道
battler.damage != nil
battler.damage_pop == true ,才能执行动画,一分析代码,就又是一回事了。









1.png (80.75 KB, 下载次数: 20)

先把第一个给解决了

先把第一个给解决了

点评

好吧第一个问题就不纠结了,现在着手改造他们,还有你留的两个问题  发表于 2019-5-29 06:36
弄不懂就别去纠结, 知其然就好了, 等以后动手对它改造自然就会知道其所以然, 不动手很快就会忘记了, 比如这个$a, 笑  发表于 2019-5-28 22:35
果然是时时刻刻update,速度快的一批  发表于 2019-5-28 21:52
$a 拿到 scene map 里去刷新它,这个怎么搬到里面刷新,这个怎么写?  发表于 2019-5-28 21:33
你说的在第三步计算战斗公式后,第三步是显示行动方动画,你说不是说skill_effect应用特技效果这个  发表于 2019-5-28 21:28
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
14131
在线时间
2143 小时
注册时间
2019-1-24
帖子
1121

R考场第七期纪念奖

4
 楼主| 发表于 2019-5-29 16:38:34 | 显示全部楼层
本帖最后由 miantouchi 于 2019-5-29 18:34 编辑
RyanBern 发表于 2019-5-29 14:00
来插一脚动画和人物出现顺序问题的说明。有关谁先谁后,我这边的结论是:人物淡入,动画显示,伤害显示这三 ...


感谢RB的详细解答,看了你的分析后,我就加了些打印控制台,观察下战斗界面的运行流程。
第一:Step 5:设置显示伤害。对象方 damage_pop 设置为 true。按照 @battler_visible 修改的判定,只要角色没隐藏,没阵亡,并且有伤害要显示,它就会被设置为 true
但是我发现游戏进入瞬间@battler_visible 就已经被赋值true了,分别是图中打印的,false  false " " false,让这个判断直接成立了。
第二:你说的step2,我方成员使用技能,此时回复量已经计算,包含普通攻击吗?包含我方的攻击技能吗?
第三:执行完 appear 一句之后,角色就已经出现了。我之前确实是这样。下面module RPG有很长一段,能给我简单说下嘛?appear运行机制
先问这3个吧

添加1.png (80.23 KB, 下载次数: 20)

添加1.png

添加2.png (84.97 KB, 下载次数: 23)

添加2.png

添加3.png (97.93 KB, 下载次数: 25)

添加3.png

进入战斗画面瞬间.png (638.67 KB, 下载次数: 23)

进入战斗画面瞬间.png

进入第四步.png (627.77 KB, 下载次数: 22)

进入第四步.png
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
14131
在线时间
2143 小时
注册时间
2019-1-24
帖子
1121

R考场第七期纪念奖

5
 楼主| 发表于 2019-5-30 21:34:09 | 显示全部楼层
本帖最后由 miantouchi 于 2019-10-16 22:11 编辑

思考了2天,刚刚有点头绪,赶紧发下。不对的对方,希望指正,我根据这些日子大家论坛的讲解指点,用流程彻底分析了下战斗界面流程以下。暂时今天写这么多,再修正,终于可以睡个好觉了
第一部分:敌方攻击导致我方致死情况

4-1很快过去

4-2
敌方攻击我方,计算出伤害值172.
此时:隐藏:false,死亡:false,伤害:172,战斗伤害标志:false
接着刷新@spriteset.update

此时:隐藏:false,死亡:true,伤害:172,战斗伤害标志:false

4-3敌方白闪攻击动画ID=0
此时赋值 @phase4_step = 4
@spriteset.update-------Sprite_Battler-update
因为@battler_visible =true,所以执行下面的
        # 白色闪烁 whiten后,设置@battler.white_flash = false
        此时:隐藏:false,死亡:true,伤害:172,战斗伤害标志:false
update_phase4-----------case @phase4_step-------- update_phase4_step4进入第四步
4-4我方被攻击动画
首先,赋值给 对象方动画id和命中
target.animation_id = @animation2_id
target.animation_hit = (target.damage != "Miss")
接着刷新@spriteset.update
因为@battler_visible =true,所以执行下面的
# 动画,因为此时动画ID = @animation2_id,有值
所以播放被攻击动画,播放后,把对像方动画id归0
此时:隐藏:false,死亡:true,伤害:172,战斗伤害标志:false

4-5我方被攻击显示数值字体。
此时因为第2步有伤害值172,!=nil
所以target.damage_pop = true把伤害标志变成true
接着刷新@spriteset.update
因为@battler_visible =true,所以执行下面的
#伤害因为此时damage_pop = true
所以播放damage动画,
damage设置nil,damage_pops和critical设置为false

接下来
死亡判断动画处(伤害值刚刚被设置为nil,并且已经死亡)此时成立
if @battler.damage == nil and @battler.dead?
播放collapse死亡消失动画。
最后设置@battler_visible = false

此时:隐藏:false,死亡:true,伤害:nil,战斗伤害标志:false

第二部分:接下来我方用技能复活阵亡的队员
4-1很快过去了
此时:隐藏:false,死亡:true,伤害:nil,战斗伤害标志:false
@battler_visible = false
4-2
我方使用复活技能复活队友,计算出恢复值-541.
此时:隐藏:false,死亡:false,伤害:-541.,战斗伤害标志:false
      @battler_visible = false
接着刷新@spriteset.update,等着因为上面都不成立,结果什么都没干

4-3
行动方(我方)动画不等于0,@animation1_id != 0
@active_battler.animation_id = @animation1_id
@active_battler.animation_hit = true
接着刷新@spriteset.update
此时:隐藏:false,死亡:false,伤害:-541.,战斗伤害标志:false
      @battler_visible = false
所以,这一步什么都没做

4-4
首先,赋值给 对象方(死亡队员)动画id和命中
target.animation_id = @animation2_id
target.animation_hit = (target.damage != "Miss")
接着刷新@spriteset.update

此时:隐藏:false,死亡:false,伤害:-541.,战斗伤害标志:false
      @battler_visible = false
所以,这一步什么都没做

4-5
此时因为第2步有恢复值-541,不等于空!=nil
所以damage_pop = true把伤害标志变成true(执行关键)
接着刷新@spriteset.update

此时:隐藏:false,死亡:false,伤害:-541.,战斗伤害标志:true
      @battler_visible = false
所以执行下面的:这一步当中,appear,animation,damage都成立了
接下来update这三个动画次数

第三部分,为什么去掉@battler.damage == nil or @battler.damage_pop会发生,战斗图先出现,施法和复活、伤害值动画后出来。

4-2运行之前:隐藏:false,死亡:true,伤害:nil.,战斗伤害标志:false
                   @battler_visible = false
4-2开始
我方使用复活技能复活队友,死亡变成false,血量恢复506不为空
此时:@battler_visible = false直接成立了
      隐藏:false,死亡:false,伤害:-506.,战斗伤害标志:false

接着刷新@spriteset.update,

因为只判断这两项,隐藏:false,死亡:false。appear人物出现了,鬼畜了
此时:@battler_visible = true

4-3开始
因为:@battler_visible = true
      隐藏:false,死亡:false,伤害:-506.,战斗伤害标志:false
      动画ID不等于nil
      显示我方施法动画(反复update)
4-4开始
因为:@battler_visible = true
      隐藏:false,死亡:false,伤害:-506.,战斗伤害标志:false
      动画ID不等于nil
      显示复活动画(反复update)
4-5开始(打开伤害开关)
因为:@battler_visible = true
      隐藏:false,死亡:false,伤害:-506.,战斗伤害标志:true
      显示恢复血量值(反复update)
所以造成,人物出现-施法动画-复活动画(被复活)-显示恢复血量

第四部分,我方人员中毒情况。
4-1这步
if @active_battler.hp > 0 and @active_battler.slip_damage?
      @active_battler.slip_damage_effect
      @active_battler.damage_pop = true
end
连续伤害判断成立。上面判断成立
4-1结束
接着刷新@spriteset.update
此时:隐藏:false,死亡:false,伤害:400(中毒扣的血量).,战斗伤害标志:true
      @battler_visible = true
下面判断成立
if @battler.damage_pop
        damage(@battler.damage, @battler.critical)
        @battler.damage = nil
        @battler.critical = false
        @battler.damage_pop = false
end
反复刷新damage动画,刷新完成后进入4-2
此时:隐藏:false,死亡:false,伤害:nil.,战斗伤害标志:false
所以4-1刷新部分就进行扣血了。
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
14131
在线时间
2143 小时
注册时间
2019-1-24
帖子
1121

R考场第七期纪念奖

6
 楼主| 发表于 2019-5-31 16:24:55 | 显示全部楼层
灯笼菜刀王 发表于 2019-5-28 00:01
这就是XP默认的伤害显示调用方法 battler.damage != nil 且 battler.damage_pop == true

batt ...

能详细说下吗?我看你做的是单人9999,我是在脚本里面
Game_Character 1加了
  attr_accessor :damage_pop               # 显示伤害标志
  attr_accessor :damage                   # 伤害值
  attr_accessor :critical                 # 会心一击标志
Sprite_Character里面加了
if @character.damage_pop
        puts "伤害"
        damage("9999", @character.critical)#@character.damage
        @character.damage = nil
        @character.critical = false
        @character.damage_pop = false
end

9999.jpg (171.04 KB, 下载次数: 21)

9999.jpg

222.jpg (157.38 KB, 下载次数: 26)

222.jpg

点评

好的,结贴!继续学习。  发表于 2019-6-1 10:57
以咱的态度来说, "只要实现目的就算成功,方法优化什么的闲了再去想", 所以你算及格了XD, 做过一次以后就知道怎么调用伤害了, 这个很常用  发表于 2019-6-1 10:46
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-5-7 17:14

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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