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

Project1

 找回密码
 注册会员
搜索

[已解决]如何给每个角色添加逃跑动画。

查看数: 4727 | 评论数: 12 | 收藏 0
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2019-10-2 08:33

正文摘要:

本帖最后由 miantouchi 于 2019-10-8 10:53 编辑 如上面的图,第一个是成功逃跑情况,姜太公成功逃跑,剩下的人依次逃跑。 第二个是,后面三个人逃跑失败,逃跑失败,显示动画后,角色图片恢复默认的战斗图,如果 ...

回复

灯笼菜刀王 发表于 2019-10-4 19:40:00
本帖最后由 灯笼菜刀王 于 2019-10-4 19:41 编辑

直接给你栗子吧

首先你顾虑到用公共事件去做逃跑判断太麻烦,  那只要改造下之前屏蔽的这个

  #--------------------------------------------------------------------------
  # ● 画面更新 (同伴指令回合 : 逃跑)
  #--------------------------------------------------------------------------
  def update_phase2_escape
    # 计算敌人速度的平均值
    enemies_agi = 0
    enemies_number = 0
    for enemy in $game_troop.enemies
      if enemy.exist?
        enemies_agi += enemy.agi
        enemies_number += 1
      end
    end
    if enemies_number > 0
      enemies_agi /= enemies_number
    end
    # 计算角色速度的平均值
    actors_agi = 0
    actors_number = 0
    for actor in $game_party.actors
      if actor.exist?
        actors_agi += actor.agi
        actors_number += 1
      end
    end
    if actors_number > 0
      actors_agi /= actors_number
    end
    # 逃跑成功判定
    success = rand(100) < 50 * actors_agi / enemies_agi
    # 成功逃跑的情况下
    if success
      # 演奏逃跑 SE
      $game_system.se_play($data_system.escape_se)
      # 还原为战斗开始前的 BGM
      $game_system.bgm_play($game_temp.map_bgm)
      # 战斗结束
      battle_end(1)
    # 逃跑失败的情况下
    else
      # 清除全体同伴的行动
      $game_party.clear_actions
      # 开始主回合
      start_phase4
    end
  end


红色的这段全不要, 因为这段就是处理计算后的结果了, 我们拿到公共事件里处理 ,改造后的脚本是这样

  #--------------------------------------------------------------------------
  # ● 画面更新 (同伴指令回合 : 逃跑)
  #--------------------------------------------------------------------------
  def update_phase2_escape
    # 计算敌人速度的平均值
    enemies_agi = 0
    enemies_number = 0
    for enemy in $game_troop.enemies
      if enemy.exist?
        enemies_agi += enemy.agi
        enemies_number += 1
      end
    end
    if enemies_number > 0
      enemies_agi /= enemies_number
    end
    # 计算角色速度的平均值
    actors_agi = 0
    actors_number = 0
    for actor in $game_party.actors
      if actor.exist?
        actors_agi += actor.agi
        actors_number += 1
      end
    end
    if actors_number > 0
      actors_agi /= actors_number
    end
    # 逃跑成功判定
    return (rand(100) < 50 * actors_agi / enemies_agi) #让这段函数返回计算后的结果
end

然后公共事件里这样设置

点评

而不是选择逃跑后,理解执行逃跑动画的。  发表于 2019-10-5 21:00
我在一楼又补充了一个逃跑动画,他们是按照正常角色的顺序,轮到了在逃跑,死亡的角色不参与逃跑动画  发表于 2019-10-5 20:59
我怎么感觉又绕到昨天你第一次给我的代码,屏蔽update_phase2_escape,用公共事件取代  发表于 2019-10-5 15:38
你绕路了, 单体逃跑比群体简单, 因为它参与了正常流程, 所以直接预约公共事件即可  发表于 2019-10-5 11:04
整体逃跑效果实现了,现在弄把逃跑加入每个人的菜单里里面。看样子还要改代码,计算每个人的逃跑几率,默认系统是角色和敌人和平均的比较。  发表于 2019-10-5 10:13
灯笼菜刀王 发表于 2019-10-4 15:41:44
本帖最后由 灯笼菜刀王 于 2019-10-4 15:42 编辑

  #--------------------------------------------------------------------------
  # ● 刷新画面 (同伴命令回合)
  #--------------------------------------------------------------------------
  def update_phase2
    # 按下 C 键的情况下
    if Input.trigger?(Input::C)
      # 同伴指令窗口光标位置分支
      case @party_command_window.index
      when 0  # 战斗
        # 演奏确定 SE
        $game_system.se_play($data_system.decision_se)
        # 开始角色的命令回合
        start_phase3
      when 1  # 逃跑
        # 不能逃跑的情况下
        if $game_temp.battle_can_escape == false
          # 演奏冻结 SE
          $game_system.se_play($data_system.buzzer_se)
          return
        end
        # 演奏确定 SE
        $game_system.se_play($data_system.decision_se)
        # 逃走处理
        #update_phase2_escape
        common_event = $data_common_events[10086]
        $game_system.battle_interpreter.setup(common_event.list, 0)
        # 清除全体同伴的行动
        $game_party.clear_actions
        # 开始主回合
        start_phase4

      end
      return
    end
  end

点评

就是把逃跑作为一个指令动作来处理的方法  发表于 2019-10-5 23:41
你说的是我7楼里的 第二种 做法  发表于 2019-10-5 23:38
判定失败则跳过步骤3,以我方全员发呆状态进入步骤4,  发表于 2019-10-5 23:36
这又不是"单独行动", 这个是"直接判断", 它是"步骤2", 在"输入指令(步骤3)" 和"开始战斗(步骤4)"之前, 判定成功直接中断战斗   发表于 2019-10-5 23:35
正常不应该是,生成顺序、然后按照速度排序,到了我方或者敌人角色就执行对应的动作吗?  发表于 2019-10-5 22:18
灯笼菜刀王 发表于 2019-10-4 09:51:52
本帖最后由 灯笼菜刀王 于 2019-10-4 09:56 编辑
miantouchi 发表于 2019-10-4 09:36
哦,我现在处于似懂非懂状态了。
1.默认的战斗系统,是开始就让选择“战斗”、“逃跑”,如果我选择逃跑 ...


1, 当然可以, 选择逃跑后直接启动一个公共事件, 然后公共事件里全员播放逃跑动画, 顺便处理逃跑几率,成功失败等即可

2, 我是说"XP默认的战斗脚本里, 只有敌人有逃跑这个basic的赋值", 原因已经说了, 角色你选择逃跑的时候是直接处理的, 不是像攻击防御一样通过给角色赋值basic 走流程, 所以默认的情况下角色永远不会有 basic == 2 这个行为(除非强制行动,然而逃跑的处理限定了敌人, 所以角色不会有任何效果)

而敌人的逃跑是和攻击防御一样走流程的, 轮到它的时候才执行, 而且只影响它自己, 这就和你要的效果一致咯

你只要在逃跑处理上, 区分出角色来,然后按ID预约公共事件, 就可以做到每个人分别判断逃跑成功率和逃跑动作了,  甚至可以做到FF10的逃跑(自顾自跑, 只要跑掉一个人就不会被全灭)

点评

第一种情况,我应该在哪里写?该死的battle_end(1),一运行到这里面返回到地图,根本不给我机会播放动画。。。。。  发表于 2019-10-4 11:11

评分

参与人数 2星屑 +100 +2 收起 理由
guoxiaomi + 100 + 1 认可答案
miantouchi + 1 认可答案

查看全部评分

灯笼菜刀王 发表于 2019-10-3 23:05:08
本帖最后由 灯笼菜刀王 于 2019-10-3 23:07 编辑
miantouchi 发表于 2019-10-3 22:39
1.我简单选择了2个地方测试(我也弄不准了),系统都不调用这个公共事件,话说,公共事件里面只是简单一 ...


因为只有敌人有"逃跑" 这个行为动作(Game_BattleAction), 角色的"逃跑" 是在步骤2处理的, 并不是"行为动作"

错误原因--------

第一张图, 你在这里处理无效, 原因是执行这段的时候直接就结束战斗了(调用了battle_end), 所以在战斗中"预约"的公共事件不会执行

第二张图, 先不说条件限定了"敌人",  就说 @active_battler.current_action.basic == 2 , 在默认的设置下, 你角色也是无法达到的, 因为XP默认的"逃跑"选项并没有执行 @active_battler.current_action.basic = 2 的操作

正确做法--------------

你要把敌人限定去掉, 并给角色"选择逃跑指令" 后, 让他的current_action.basic = 2  就可以和敌人一样进行"单独逃跑行为"了, 怎么做, 可以参考"防御"

===============
提醒:  @active_battler 是当前行动者, 它包括了角色和敌人, 所以默认的逃跑处理才会加上"is_a?" 来区分处理,  如果你的角色和敌人要采用不同的处理方法, 记得也要加上 is_a? 判断

比如, 你上面的防御,  仅判断ID的话, 那敌人也是有"ID为1,2,3,4"的情况哦
拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

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

GMT+8, 2024-11-23 13:18

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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