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

Project1

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

[已经过期] 如何让对像方动画和显示伤害同时出现?

[复制链接]

Lv1.梦旅人

梦石
0
星屑
236
在线时间
191 小时
注册时间
2010-6-22
帖子
233
跳转到指定楼层
1
发表于 2010-8-3 17:17:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
本帖最后由 仙芋 于 2010-8-3 17:39 编辑

如题
我想做到对像方动画播放时
伤害才马上出现

以下解答存有漏洞
http://rpg.blue/forum.php?mod=viewthread&tid=69079
就是行动方动画一开始,就显示伤害

Lv1.梦旅人

梦石
0
星屑
236
在线时间
191 小时
注册时间
2010-6-22
帖子
233
2
 楼主| 发表于 2010-8-7 16:04:59 | 只看该作者
没人有正解吗? :(
回复 支持 反对

使用道具 举报

Lv3.寻梦者

宛若

梦石
0
星屑
1568
在线时间
526 小时
注册时间
2007-8-19
帖子
1493

极短24参与开拓者

3
发表于 2010-8-7 18:18:40 | 只看该作者
  1. class Scene_Battle
  2.   alias diyrpg_update_phase4_step4 update_phase4_step4
  3.   def update_phase4_step4
  4.     diyrpg_update_phase4_step4
  5.     update_phase4_step5
  6.   end
  7. end
复制代码

点评

插入了还是一样  发表于 2010-8-8 13:00
[url=http://rpg.blue/thread-219730-1-1.html]http://unhero.sinaapp.com/wi.php[/url]
[color=Red]如你所见这是个死坑,没错这就是打我的脸用的[/color]
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
120
在线时间
92 小时
注册时间
2009-8-1
帖子
438
4
发表于 2010-8-7 20:02:52 | 只看该作者
我记得当时有一个代码是用闪烁判定伤害的,每闪烁一下就掉一下血,我觉得那个更适合你些。
哎呦,好像快要能发布一款游戏了,这次一定要低调!
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
236
在线时间
191 小时
注册时间
2010-6-22
帖子
233
5
 楼主| 发表于 2010-8-8 12:58:44 | 只看该作者
回复 tree52 的帖子
恩,我就是想要那个。可是找不到
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
120
在线时间
92 小时
注册时间
2009-8-1
帖子
438
6
发表于 2010-8-8 21:26:06 | 只看该作者
分两步走:
一、施法发起和施法击中同时显示动画,即修改Scene_Battle 4,你可以把下面代码替代掉,或者放在Main前面。
二、我说的闪烁判定伤害是“彩虹神剑”的脚本。
  两个脚本分别如下:
  1. #==============================================================================
  2. # ■ Scene_Battle (分割定义 4)
  3. #------------------------------------------------------------------------------
  4. #  处理战斗画面的类。
  5. #==============================================================================

  6. class Scene_Battle
  7.   #--------------------------------------------------------------------------
  8.   # ● 开始主回合
  9.   #--------------------------------------------------------------------------
  10.   def start_phase4
  11.     # 转移到回合 4
  12.     @phase = 4
  13.     # 回合数计数
  14.     $game_temp.battle_turn += 1
  15.     # 搜索全页的战斗事件
  16.     for index in 0...$data_troops[@troop_id].pages.size
  17.       # 获取事件页
  18.       page = $data_troops[@troop_id].pages[index]
  19.       # 本页的范围是 [回合] 的情况下
  20.       if page.span == 1
  21.         # 设置已经执行标志
  22.         $game_temp.battle_event_flags[index] = false
  23.       end
  24.     end
  25.     # 设置角色为非选择状态
  26.     @actor_index = -1
  27.     @active_battler = nil
  28.     # 有效化同伴指令窗口
  29.     @party_command_window.active = false
  30.     @party_command_window.visible = false
  31.     # 无效化角色指令窗口
  32.     @actor_command_window.active = false
  33.     @actor_command_window.visible = false
  34.     # 设置主回合标志
  35.     $game_temp.battle_main_phase = true
  36.     # 生成敌人行动
  37.     for enemy in $game_troop.enemies
  38.       enemy.make_action
  39.     end
  40.     # 生成行动顺序
  41.     make_action_orders
  42.     # 移动到步骤 1
  43.     @phase4_step = 1
  44.   end
  45.   #--------------------------------------------------------------------------
  46.   # ● 生成行动循序
  47.   #--------------------------------------------------------------------------
  48.   def make_action_orders
  49.     # 初始化序列 @action_battlers
  50.     @action_battlers = []
  51.     # 添加敌人到 @action_battlers 序列
  52.     for enemy in $game_troop.enemies
  53.       @action_battlers.push(enemy)
  54.     end
  55.     # 添加角色到 @action_battlers 序列
  56.     for actor in $game_party.actors
  57.       @action_battlers.push(actor)
  58.     end
  59.     # 确定全体的行动速度
  60.     for battler in @action_battlers
  61.       battler.make_action_speed
  62.     end
  63.     # 按照行动速度从大到小排列
  64.     @action_battlers.sort! {|a,b|
  65.       b.current_action.speed - a.current_action.speed }
  66.   end
  67.   #--------------------------------------------------------------------------
  68.   # ● 刷新画面 (主回合)
  69.   #--------------------------------------------------------------------------
  70.   def update_phase4
  71.     case @phase4_step
  72.     when 1
  73.       update_phase4_step1
  74.     when 2
  75.       update_phase4_step2
  76.     when 3
  77.       update_phase4_step3
  78.     when 4
  79.       update_phase4_step4
  80.     when 5
  81.       update_phase4_step5
  82.     when 6
  83.       update_phase4_step6
  84.     end
  85.   end
  86.   #--------------------------------------------------------------------------
  87.   # ● 刷新画面 (主回合步骤 1 : 准备行动)
  88.   #--------------------------------------------------------------------------
  89.   def update_phase4_step1
  90.     # 隐藏帮助窗口
  91.     @help_window.visible = false
  92.     # 判定胜败
  93.     if judge
  94.       # 胜利或者失败的情况下 : 过程结束
  95.       return
  96.     end
  97.     # 强制行动的战斗者不存在的情况下
  98.     if $game_temp.forcing_battler == nil
  99.       # 设置战斗事件
  100.       setup_battle_event
  101.       # 执行战斗事件中的情况下
  102.       if $game_system.battle_interpreter.running?
  103.         return
  104.       end
  105.     end
  106.     # 强制行动的战斗者存在的情况下
  107.     if $game_temp.forcing_battler != nil
  108.       # 在头部添加后移动
  109.       @action_battlers.delete($game_temp.forcing_battler)
  110.       @action_battlers.unshift($game_temp.forcing_battler)
  111.     end
  112.     # 未行动的战斗者不存在的情况下 (全员已经行动)
  113.     if @action_battlers.size == 0
  114.       # 开始同伴命令回合
  115.       start_phase2
  116.       return
  117.     end
  118.     # 初始化动画 ID 和公共事件 ID
  119.     @animation1_id = 0
  120.     @animation2_id = 0
  121.     @common_event_id = 0
  122.     # 未行动的战斗者移动到序列的头部
  123.     @active_battler = @action_battlers.shift
  124.     # 如果已经在战斗之外的情况下
  125.     if @active_battler.index == nil
  126.       return
  127.     end
  128.     # 连续伤害
  129.     if @active_battler.hp > 0 and @active_battler.slip_damage?
  130.       @active_battler.slip_damage_effect
  131.       @active_battler.damage_pop = true
  132.     end
  133.     # 自然解除状态
  134.     @active_battler.remove_states_auto
  135.     # 刷新状态窗口
  136.     @status_window.refresh
  137.     # 移至步骤 2
  138.     @phase4_step = 2
  139.   end
  140.   #--------------------------------------------------------------------------
  141.   # ● 刷新画面 (主回合步骤 2 : 开始行动)
  142.   #--------------------------------------------------------------------------
  143.   def update_phase4_step2
  144.     # 如果不是强制行动
  145.     unless @active_battler.current_action.forcing
  146.       # 限制为 [敌人为普通攻击] 或 [我方为普通攻击] 的情况下
  147.       if @active_battler.restriction == 2 or @active_battler.restriction == 3
  148.         # 设置行动为攻击
  149.         @active_battler.current_action.kind = 0
  150.         @active_battler.current_action.basic = 0
  151.       end
  152.       # 限制为 [不能行动] 的情况下
  153.       if @active_battler.restriction == 4
  154.         # 清除行动强制对像的战斗者
  155.         $game_temp.forcing_battler = nil
  156.         # 移至步骤 1
  157.         @phase4_step = 1
  158.         return
  159.       end
  160.     end
  161.     # 清除对像战斗者
  162.     @target_battlers = []
  163.     # 行动种类分支
  164.     case @active_battler.current_action.kind
  165.     when 0  # 基本
  166.       make_basic_action_result
  167.     when 1  # 特技
  168.       make_skill_action_result
  169.     when 2  # 物品
  170.       make_item_action_result
  171.     end
  172.     # 移至步骤 3
  173.     if @phase4_step == 2
  174.       @phase4_step = 3
  175.     end
  176.   end
  177.   #--------------------------------------------------------------------------
  178.   # ● 生成基本行动结果
  179.   #--------------------------------------------------------------------------
  180.   def make_basic_action_result
  181.     # 攻击的情况下
  182.     if @active_battler.current_action.basic == 0
  183.       # 设置攻击 ID
  184.       @animation1_id = @active_battler.animation1_id
  185.       @animation2_id = @active_battler.animation2_id
  186.       # 行动方的战斗者是敌人的情况下
  187.       if @active_battler.is_a?(Game_Enemy)
  188.         if @active_battler.restriction == 3
  189.           target = $game_troop.random_target_enemy
  190.         elsif @active_battler.restriction == 2
  191.           target = $game_party.random_target_actor
  192.         else
  193.           index = @active_battler.current_action.target_index
  194.           target = $game_party.smooth_target_actor(index)
  195.         end
  196.       end
  197.       # 行动方的战斗者是角色的情况下
  198.       if @active_battler.is_a?(Game_Actor)
  199.         if @active_battler.restriction == 3
  200.           target = $game_party.random_target_actor
  201.         elsif @active_battler.restriction == 2
  202.           target = $game_troop.random_target_enemy
  203.         else
  204.           index = @active_battler.current_action.target_index
  205.           target = $game_troop.smooth_target_enemy(index)
  206.         end
  207.       end
  208.       # 设置对像方的战斗者序列
  209.       @target_battlers = [target]
  210.       # 应用通常攻击效果
  211.       for target in @target_battlers
  212.         target.attack_effect(@active_battler)
  213.       end
  214.       return
  215.     end
  216.     # 防御的情况下
  217.     if @active_battler.current_action.basic == 1
  218.       # 帮助窗口显示"防御"
  219.       @help_window.set_text($data_system.words.guard, 1)
  220.       return
  221.     end
  222.     # 逃跑的情况下
  223.     if @active_battler.is_a?(Game_Enemy) and
  224.        @active_battler.current_action.basic == 2
  225.       #  帮助窗口显示"逃跑"
  226.       @help_window.set_text("逃跑", 1)
  227.       # 逃跑
  228.       @active_battler.escape
  229.       return
  230.     end
  231.     # 什么也不做的情况下
  232.     if @active_battler.current_action.basic == 3
  233.       # 清除强制行动对像的战斗者
  234.       $game_temp.forcing_battler = nil
  235.       # 移至步骤 1
  236.       @phase4_step = 1
  237.       return
  238.     end
  239.   end
  240.   #--------------------------------------------------------------------------
  241.   # ● 设置物品或特技对像方的战斗者
  242.   #     scope : 特技或者是物品的范围
  243.   #--------------------------------------------------------------------------
  244.   def set_target_battlers(scope)
  245.     # 行动方的战斗者是敌人的情况下
  246.     if @active_battler.is_a?(Game_Enemy)
  247.       # 效果范围分支
  248.       case scope
  249.       when 1  # 敌单体
  250.         index = @active_battler.current_action.target_index
  251.         @target_battlers.push($game_party.smooth_target_actor(index))
  252.       when 2  # 敌全体
  253.         for actor in $game_party.actors
  254.           if actor.exist?
  255.             @target_battlers.push(actor)
  256.           end
  257.         end
  258.       when 3  # 我方单体
  259.         index = @active_battler.current_action.target_index
  260.         @target_battlers.push($game_troop.smooth_target_enemy(index))
  261.       when 4  # 我方全体
  262.         for enemy in $game_troop.enemies
  263.           if enemy.exist?
  264.             @target_battlers.push(enemy)
  265.           end
  266.         end
  267.       when 5  # 我方单体 (HP 0)
  268.         index = @active_battler.current_action.target_index
  269.         enemy = $game_troop.enemies[index]
  270.         if enemy != nil and enemy.hp0?
  271.           @target_battlers.push(enemy)
  272.         end
  273.       when 6  # 我方全体 (HP 0)
  274.         for enemy in $game_troop.enemies
  275.           if enemy != nil and enemy.hp0?
  276.             @target_battlers.push(enemy)
  277.           end
  278.         end
  279.       when 7  # 使用者
  280.         @target_battlers.push(@active_battler)
  281.       end
  282.     end
  283.     # 行动方的战斗者是角色的情况下
  284.     if @active_battler.is_a?(Game_Actor)
  285.       # 效果范围分支
  286.       case scope
  287.       when 1  # 敌单体
  288.         index = @active_battler.current_action.target_index
  289.         @target_battlers.push($game_troop.smooth_target_enemy(index))
  290.       when 2  # 敌全体
  291.         for enemy in $game_troop.enemies
  292.           if enemy.exist?
  293.             @target_battlers.push(enemy)
  294.           end
  295.         end
  296.       when 3  # 我方单体
  297.         index = @active_battler.current_action.target_index
  298.         @target_battlers.push($game_party.smooth_target_actor(index))
  299.       when 4  # 我方全体
  300.         for actor in $game_party.actors
  301.           if actor.exist?
  302.             @target_battlers.push(actor)
  303.           end
  304.         end
  305.       when 5  # 我方单体 (HP 0)
  306.         index = @active_battler.current_action.target_index
  307.         actor = $game_party.actors[index]
  308.         if actor != nil and actor.hp0?
  309.           @target_battlers.push(actor)
  310.         end
  311.       when 6  # 我方全体 (HP 0)
  312.         for actor in $game_party.actors
  313.           if actor != nil and actor.hp0?
  314.             @target_battlers.push(actor)
  315.           end
  316.         end
  317.       when 7  # 使用者
  318.         @target_battlers.push(@active_battler)
  319.       end
  320.     end
  321.   end
  322.   #--------------------------------------------------------------------------
  323.   # ● 生成特技行动结果
  324.   #--------------------------------------------------------------------------
  325.   def make_skill_action_result
  326.     # 获取特技
  327.     @skill = $data_skills[@active_battler.current_action.skill_id]
  328.     # 如果不是强制行动
  329.     unless @active_battler.current_action.forcing
  330.       # 因为 SP 耗尽而无法使用的情况下
  331.       unless @active_battler.skill_can_use?(@skill.id)
  332.         # 清除强制行动对像的战斗者
  333.         $game_temp.forcing_battler = nil
  334.         # 移至步骤 1
  335.         @phase4_step = 1
  336.         return
  337.       end
  338.     end
  339.     # 消耗 SP
  340.     @active_battler.sp -= @skill.sp_cost
  341.     # 刷新状态窗口
  342.     @status_window.refresh
  343.     # 在帮助窗口显示特技名
  344.     @help_window.set_text(@skill.name, 1)
  345.     # 设置动画 ID
  346.     @animation1_id = @skill.animation1_id
  347.     @animation2_id = @skill.animation2_id
  348.     # 设置公共事件 ID
  349.     @common_event_id = @skill.common_event_id
  350.     # 设置对像侧战斗者
  351.     set_target_battlers(@skill.scope)
  352.     # 应用特技效果
  353.     for target in @target_battlers
  354.       target.skill_effect(@active_battler, @skill)
  355.     end
  356.   end
  357.   #--------------------------------------------------------------------------
  358.   # ● 生成物品行动结果
  359.   #--------------------------------------------------------------------------
  360.   def make_item_action_result
  361.     # 获取物品
  362.     @item = $data_items[@active_battler.current_action.item_id]
  363.     # 因为物品耗尽而无法使用的情况下
  364.     unless $game_party.item_can_use?(@item.id)
  365.       # 移至步骤 1
  366.       @phase4_step = 1
  367.       return
  368.     end
  369.     # 消耗品的情况下
  370.     if @item.consumable
  371.       # 使用的物品减 1
  372.       $game_party.lose_item(@item.id, 1)
  373.     end
  374.     # 在帮助窗口显示物品名
  375.     @help_window.set_text(@item.name, 1)
  376.     # 设置动画 ID
  377.     @animation1_id = @item.animation1_id
  378.     @animation2_id = @item.animation2_id
  379.     # 设置公共事件 ID
  380.     @common_event_id = @item.common_event_id
  381.     # 确定对像
  382.     index = @active_battler.current_action.target_index
  383.     target = $game_party.smooth_target_actor(index)
  384.     # 设置对像侧战斗者
  385.     set_target_battlers(@item.scope)
  386.     # 应用物品效果
  387.     for target in @target_battlers
  388.       target.item_effect(@item)
  389.     end
  390.   end
  391.   #--------------------------------------------------------------------------
  392.   # ● 刷新画面 参考学习“齐时战斗”(主回合步骤 3、4 : 行动方与对象方动画)
  393.   #--------------------------------------------------------------------------
  394.   def update_phase4_step3
  395.     # 行动方动画 (ID 为 0 的情况下是白色闪烁)
  396.     if @animation1_id == 0
  397.       @active_battler.white_flash = true
  398.     else
  399.       @active_battler.animation_id = @animation1_id
  400.       @active_battler.animation_hit = true
  401.     end
  402.     # 对像方动画
  403.     for target in @target_battlers
  404.       target.animation_id = @animation2_id
  405.       target.animation_hit = (target.damage != "Miss")
  406.     end
  407.     # 移至步骤 4
  408.     @phase4_step = 4
  409.   end
  410.   #--------------------------------------------------------------------------
  411.   # ● 刷新画面 (主回合步骤 4 : 对像方动画)
  412.   #--------------------------------------------------------------------------
  413.   def update_phase4_step4
  414.     # 限制动画长度、最低 8 帧
  415.     @wait_count = 8
  416.     # 移至步骤 5
  417.     @phase4_step = 5
  418.   end
  419.   #--------------------------------------------------------------------------
  420.   # ● 刷新画面 (主回合步骤 5 : 显示伤害)
  421.   #--------------------------------------------------------------------------
  422.   def update_phase4_step5
  423.     # 隐藏帮助窗口
  424.     @help_window.visible = false
  425.     # 刷新状态窗口
  426.     @status_window.refresh
  427.     # 显示伤害
  428.     for target in @target_battlers
  429.       if target.damage != nil
  430.         target.damage_pop = true
  431.       end
  432.     end
  433.     # 移至步骤 6
  434.     @phase4_step = 6
  435.   end
  436.   #--------------------------------------------------------------------------
  437.   # ● 刷新画面 (主回合步骤 6 : 刷新)
  438.   #--------------------------------------------------------------------------
  439.   def update_phase4_step6
  440.     # 清除强制行动对像的战斗者
  441.     $game_temp.forcing_battler = nil
  442.     # 公共事件 ID 有效的情况下
  443.     if @common_event_id > 0
  444.       # 设置事件
  445.       common_event = $data_common_events[@common_event_id]
  446.       $game_system.battle_interpreter.setup(common_event.list, 0)
  447.     end
  448.     # 移至步骤 1
  449.     @phase4_step = 1
  450.   end
  451. end
复制代码
  1. =begin
  2. ==============================================================================

  3. 彩虹神剑(伤害分段显示)显示总伤害版 v1.0b

  4. ==============================================================================

  5. 彩虹神剑 by 柳柳
  6. 显示总伤害修改 by 叶子

  7. ==============================================================================

  8. 6-20-2006 v1.0
  9. 在彩虹神剑的基础上增加了显示总伤害的功能,而且总伤害的数字是弹出伤害时逐渐增加的

  10. v1.0a
  11. 修正了显示伤害和实际伤害有差别的问题
  12. 修正了miss的情况下显示miss混乱的问题
  13. 修正了对己方技能重复显示伤害的问题
  14. 未修正播放目标动画第一帧时目标有时无端跳动的BUG

  15. v1.0b
  16. 修改了总伤害数字的位置和z坐标
  17. 未修正播放目标动画第一帧时目标有时无端跳动的BUG

  18. ==============================================================================
  19. =end
  20. # 核心的说明:
  21. # damage_pop 不再附带damage()的功能,这个放到animation里面去了

  22. module RPG
  23. #--------------------------------------------------------------------------
  24. # ● 常量设定
  25. #--------------------------------------------------------------------------
  26. # 是否显示总伤害
  27. SHOW_TOTAL_DAMAGE = true
  28. # 角色受攻击时是否跳一下
  29. BATTLER_JUMP = false

  30. class Sprite < ::Sprite
  31.    #==========================================
  32.    # 修改说明:
  33.    # @flash_shake用来制作挨打时候跳跃
  34.    # @_damage    用来记录每次打击之后弹出数字
  35.    # @_total_damage 记录总伤害
  36.    # @_total_damage_duration 总伤害持续帧
  37.    #==========================================
  38.    #alias 66RPG_rainbow_initialize : initialize
  39.    def initialize(viewport = nil)
  40.      #66RPG_rainbow_initialize(viewport)
  41.      super(viewport)
  42.      @_whiten_duration = 0
  43.      @_appear_duration = 0
  44.      @_escape_duration = 0
  45.      @_collapse_duration = 0
  46.      @_damage_duration = 0
  47.      @_animation_duration = 0
  48.      @_blink = false
  49.      # 挨打时候跳跃
  50.      @flash_shake = 0
  51.      # 伤害记录数组
  52.      @_damage = []
  53.      # 总伤害数字
  54.      @_total_damage = 0
  55.      # 总伤害持续帧
  56.      @_total_damage_duration = 0
  57.    end
  58.    def damage(value, critical, sp_damage = false)
  59.      if value.is_a?(Numeric)
  60.        damage_string = value.abs.to_s
  61.      else
  62.        damage_string = value.to_s
  63.      end
  64.      bitmap = Bitmap.new(200, 80)
  65.      bitmap.font.name = "Arial Black"
  66.      bitmap.font.size = 32
  67.       # 伤害值是数值的情况下
  68.       if value.is_a?(Numeric)
  69.         # 分割伤害值字符串
  70.         damage_array = damage_string.scan(/./)
  71.         damage_x = 81 - damage_string.size * 9
  72.         # 伤害值为负的情况下
  73.         if value < 0
  74.           # 调用回复数字表
  75.           rect_y = 32
  76.         else
  77.           # 调用伤害数字表
  78.           rect_y = 0
  79.         end
  80.         # 循环伤害值字符串

  81.        for char in damage_array
  82.          number = char.to_i
  83.           # 显示伤害数字
  84.          if sp_damage
  85.            bitmap.blt(damage_x, 32, RPG::Cache.picture("Damagesp"),
  86.            Rect.new(number * 18, rect_y, 18, 32))
  87.            damage_x += 18
  88.          else
  89.            bitmap.blt(damage_x, 32, RPG::Cache.picture("Damage"),
  90.            Rect.new(number * 18, rect_y, 18, 32))
  91.            damage_x += 18
  92.          end# 伤害值不是数值的情况
  93.         end
  94.       else
  95.         # 如果伤害值不是 Miss
  96.         unless value == "Miss"
  97.           # 系统默认描画字符串
  98.           bitmap.font.color.set(0, 0, 0)
  99.           bitmap.draw_text(-1, 27, 162, 36, damage_string, 1)
  100.           bitmap.draw_text(+1, 27, 162, 36, damage_string, 1)
  101.           bitmap.draw_text(-1, 29, 162, 36, damage_string, 1)
  102.           bitmap.draw_text(+1, 29, 162, 36, damage_string, 1)
  103.           bitmap.font.color.set(255, 255, 255)
  104.           bitmap.draw_text(0, 28, 162, 36, damage_string, 1)
  105.         # Miss 的情况下
  106.         else
  107.           # 显示未击中图画
  108.           bitmap.blt(36, 28, RPG::Cache.picture("Damage"), Rect.new(90, 64, 90, 32))
  109.         end
  110.       end
  111.       # 会心一击标志打开的情况
  112.       if critical
  113.         # 显示会心一击图画
  114.         bitmap.blt(36, 0, RPG::Cache.picture("Damage"), Rect.new(0, 64, 90, 32))
  115.       end
  116.      @_damage_sprite = ::Sprite.new(self.viewport)
  117.      @_damage_sprite.bitmap = bitmap
  118.      @_damage_sprite.ox = 80
  119.      @_damage_sprite.oy = 20
  120.      @_damage_sprite.x = self.x
  121.      @_damage_sprite.y = self.y - self.oy / 2
  122.      @_damage_sprite.z = 3000
  123.      @_damage_duration = 40
  124.      #=======================================
  125.      # 修改:推入新的伤害
  126.      #=======================================
  127.      @_damage.push([@_damage_sprite,@_damage_duration-10,0, rand(30) - 15, rand(3)])
  128.      # 总伤害处理
  129.      make_total_damage(value)
  130.    end
  131.    #--------------------------------------------------------------------------
  132.    # ● 总伤害处理
  133.    #--------------------------------------------------------------------------
  134.    def make_total_damage(value)
  135.      if value.is_a?(Numeric) and SHOW_TOTAL_DAMAGE and (@_animation.flame == 1)
  136.        @_total_damage += value
  137.      else
  138.        return
  139.      end
  140.      bitmap = Bitmap.new(300, 150)
  141.      bitmap.font.name = "Arial Black"
  142.      bitmap.font.size = 48
  143.      bitmap.font.color.set(0, 0, 0)
  144.      bitmap.draw_text(+2, 12+2, 160, 36, @_total_damage.abs.to_s, 1)
  145.      if @_total_damage < 0
  146.        bitmap.font.color.set(80, 255, 00)
  147.      else
  148.        bitmap.font.color.set(255, 140, 0)
  149.      end
  150.      bitmap.draw_text(0, 12, 160, 36, @_total_damage.abs.to_s, 1)
  151.      if @_total_damage_sprite.nil?
  152.        @_total_damage_sprite = ::Sprite.new(self.viewport)
  153.        @_total_damage_sprite.ox = 80
  154.        @_total_damage_sprite.oy = 20
  155.        @_total_damage_sprite.z = 3000
  156.      end
  157.      @_total_damage_sprite.bitmap = bitmap
  158.      @_total_damage_sprite.zoom_x = 1.5
  159.      @_total_damage_sprite.zoom_y = 1.5
  160.      @_total_damage_sprite.x = self.x
  161.      @_total_damage_sprite.y = self.y  - self.oy / 2 - 64
  162.      @_total_damage_sprite.z = 3001
  163.      @_total_damage_duration = 80
  164.    end
  165.    def animation(animation, hit, battler_damage="", battler_critical=false)
  166.      dispose_animation      
  167.      #=======================================
  168.      # 修改:记录伤害和critical
  169.      #=======================================
  170.      @battler_damage = battler_damage
  171.      @battler_critical = battler_critical
  172.      @_animation = animation
  173.      return if @_animation == nil
  174.      @_animation_hit = hit
  175.      @_animation_duration = @_animation.frame_max
  176.      animation_name = @_animation.animation_name
  177.      animation_hue = @_animation.animation_hue
  178.      bitmap = RPG::Cache.animation(animation_name, animation_hue)
  179.      #=======================================
  180.      # 修改:计算总闪光权限值
  181.      #=======================================
  182.      for timing in @_animation.timings
  183.        quanzhong = animation_process_timing(timing, @_animation_hit,true)
  184.        @all_quanzhong += quanzhong
  185.        # 记录最后一次闪光
  186.        @_last_frame = timing.frame if quanzhong != 0
  187.      end      
  188.      if @@_reference_count.include?(bitmap)
  189.        @@_reference_count[bitmap] += 1
  190.      else
  191.        @@_reference_count[bitmap] = 1
  192.      end
  193.      #=======================================
  194.      # 修改:行动方动画不显示伤害
  195.      #=======================================
  196.      if $scene.is_a?(Scene_Battle)
  197.        if $scene.animation1_id == @battler.animation_id
  198.          @battler_damage = ""
  199.        end
  200.      end
  201.      @_animation_sprites = []
  202.      if @_animation.position != 3 or not @@_animations.include?(animation)
  203.        for i in 0..15
  204.          sprite = ::Sprite.new(self.viewport)
  205.          sprite.bitmap = bitmap
  206.          sprite.visible = false
  207.          @_animation_sprites.push(sprite)
  208.        end
  209.        unless @@_animations.include?(animation)
  210.          @@_animations.push(animation)
  211.        end
  212.      end
  213.      update_animation
  214.    end
  215.    #=======================================
  216.    # 修改:更换清除伤害的算法,以防万一
  217.    #       本内容在脚本中没有使用过
  218.    #=======================================
  219.    def dispose_damage
  220.      for damage in @_damage.reverse
  221.        damage[0].bitmap.dispose
  222.        damage[0].dispose
  223.        @_damage.delete(damage)
  224.      end
  225.      @_total_damage = 0
  226.      @_last_frame = -1
  227.      if @_total_damage_sprite != nil
  228.        @_total_damage_duration = 0
  229.        @_total_damage_sprite.bitmap.dispose
  230.        @_total_damage_sprite.dispose
  231.        @_total_damage_sprite = nil
  232.      end
  233.    end
  234.    def dispose_animation
  235.      #=======================================
  236.      # 修改:清除记录的伤害,清除权重记录
  237.      #=======================================
  238.      @battler_damage = nil
  239.      @battler_critical = nil
  240.      @all_quanzhong = 1
  241.      @_total_damage = 0
  242.      @_last_frame = -1
  243.      if @_animation_sprites != nil
  244.        sprite = @_animation_sprites[0]
  245.        if sprite != nil
  246.          @@_reference_count[sprite.bitmap] -= 1
  247.          if @@_reference_count[sprite.bitmap] == 0
  248.            sprite.bitmap.dispose
  249.          end
  250.        end
  251.        for sprite in @_animation_sprites
  252.          sprite.dispose
  253.        end
  254.        @_animation_sprites = nil
  255.        @_animation = nil
  256.      end
  257.    end
  258.    def update
  259.      super
  260.      if @_whiten_duration > 0
  261.        @_whiten_duration -= 1
  262.        self.color.alpha = 128 - (16 - @_whiten_duration) * 10
  263.      end
  264.      if @_appear_duration > 0
  265.        @_appear_duration -= 1
  266.        self.opacity = (16 - @_appear_duration) * 16
  267.      end
  268.      if @_escape_duration > 0
  269.        @_escape_duration -= 1
  270.        self.opacity = 256 - (32 - @_escape_duration) * 10
  271.      end
  272.      if @_collapse_duration > 0
  273.        @_collapse_duration -= 1
  274.        self.opacity = 256 - (48 - @_collapse_duration) * 6
  275.      end
  276.      #=======================================
  277.      # 修改:更新算法,更新弹出
  278.      #=======================================
  279.      if @_damage_duration > 0
  280.        @_damage_duration -= 1
  281.        for damage in @_damage
  282.          damage[0].x = self.x + self.viewport.rect.x -
  283.                        self.ox + self.src_rect.width / 2 +
  284.                        (40 - damage[1]) * damage[3] / 10
  285.          damage[0].y -= damage[4]+damage[1]/10
  286.          damage[0].opacity = damage[1]*20
  287.          damage[1] -= 1
  288.          if damage[1]==0
  289.            damage[0].bitmap.dispose
  290.            damage[0].dispose
  291.            @_damage.delete(damage)
  292.            next
  293.          end
  294.        end
  295.      end
  296.      #=======================================
  297.      # 添加:弹出总伤害
  298.      #=======================================
  299.      if @_total_damage_duration > 0
  300.        @_total_damage_duration -= 1
  301.        @_total_damage_sprite.y -= 1 if @_total_damage_duration % 2 == 0
  302.        if @_total_damage_sprite.zoom_x > 1.0
  303.          @_total_damage_sprite.zoom_x -= 0.05
  304.        end
  305.        if @_total_damage_sprite.zoom_y > 1.0
  306.          @_total_damage_sprite.zoom_y -= 0.05
  307.        end
  308.        @_total_damage_sprite.opacity = 256 - (24 - @_total_damage_duration) * 16
  309.        if @_total_damage_duration <= 0
  310.          @_total_damage = 0
  311.          @_total_damage_duration = 0
  312.          @_total_damage_sprite.bitmap.dispose
  313.          @_total_damage_sprite.dispose
  314.          @_total_damage_sprite = nil
  315.        end
  316.      end
  317.      #=======================================
  318.      if @_animation != nil and (Graphics.frame_count % 2 == 0)
  319.        @_animation_duration -= 1
  320.        update_animation
  321.      end
  322.      if @_loop_animation != nil and (Graphics.frame_count % 2 == 0)
  323.        update_loop_animation
  324.        @_loop_animation_index += 1
  325.        @_loop_animation_index %= @_loop_animation.frame_max
  326.      end
  327.      if @_blink
  328.        @_blink_count = (@_blink_count + 1) % 32
  329.        if @_blink_count < 16
  330.          alpha = (16 - @_blink_count) * 6
  331.        else
  332.          alpha = (@_blink_count - 16) * 6
  333.        end
  334.        self.color.set(255, 255, 255, alpha)
  335.      end
  336.      @@_animations.clear
  337.    end
  338.    def update_animation
  339.      if @_animation_duration > 0
  340.        frame_index = @_animation.frame_max - @_animation_duration
  341.        cell_data = @_animation.frames[frame_index].cell_data
  342.        position = @_animation.position
  343.        animation_set_sprites(@_animation_sprites, cell_data, position)
  344.        #=======================================
  345.        # 修改:弹出伤害,权重计算
  346.        #=======================================
  347.        for timing in @_animation.timings
  348.          if timing.frame == frame_index
  349.            t = 1.0 * animation_process_timing(timing, @_animation_hit)            
  350.            #p t,"当前权重", @all_quanzhong,"总权重"
  351.            if @battler_damage.is_a?(Numeric) and t != 0
  352.              t *= @battler_damage
  353.              t /= @all_quanzhong
  354.              #p t,"当前伤害",@battler_damage,"总伤害"
  355.              t = t.to_i
  356.              # 最后一次闪光的话,伤害修正
  357.              if frame_index == @_last_frame
  358.                @_total_damage = @battler_damage - t
  359.              end
  360.              #p t,@battler_damage,@all_quanzhong
  361.              damage(t,@battler_critical)
  362.            # 防止重复播放miss
  363.            elsif !@battler_damage.is_a?(Numeric) and timing.flash_scope != 0
  364.              damage(@battler_damage,@battler_critical)
  365.            end
  366.          end
  367.        end
  368.      else
  369.        dispose_animation
  370.      end
  371.    end
  372.    #=======================================
  373.    # 修改:敌人跳跃的功能 + 添加返回数值
  374.    #=======================================
  375.     def animation_process_timing(timing, hit,dontflash=false)
  376.       if (timing.condition == 0) or
  377.          (timing.condition == 1 and hit == true) or
  378.          (timing.condition == 2 and hit == false)
  379.         unless dontflash
  380.           if timing.se.name != ""
  381.             se = timing.se
  382.             Audio.se_play("Audio/SE/" + se.name, se.volume, se.pitch)
  383.           end
  384.         end
  385.         case timing.flash_scope
  386.         when 1
  387.           unless dontflash
  388.             self.flash(timing.flash_color, timing.flash_duration * 2)
  389.             if @_total_damage >0
  390.               @flash_shake_switch = true
  391.               @flash_shake = 10
  392.             end
  393.           end
  394.           return timing.flash_color.alpha * timing.flash_duration
  395.         when 2
  396.           unless dontflash
  397.             if self.viewport != nil
  398.               self.viewport.flash(timing.flash_color, timing.flash_duration * 2)
  399.               return timing.flash_color.alpha * timing.flash_duration
  400.             end
  401.           end
  402.         when 3
  403.           unless dontflash
  404.             self.flash(nil, timing.flash_duration * 2)
  405.           end
  406.           return timing.flash_color.alpha * timing.flash_duration
  407.         end
  408.       end      
  409.       return 0
  410.     end   
  411. end
  412. end
  413. #==============================================================================
  414. # ■ Sprite_Battler
  415. #==============================================================================
  416. class Sprite_Battler < RPG::Sprite
  417. #--------------------------------------------------------------------------
  418. # ● 初始化对像
  419. #    添加跳跃记录
  420. #--------------------------------------------------------------------------
  421. def initialize(viewport, battler = nil)
  422.   super(viewport)
  423.   @battler = battler
  424.   @battler_visible = false
  425.   @flash_shake_switch = true
  426. end

  427. end

  428. #==============================================================================
  429. # ■ Scene_Battle
  430. #------------------------------------------------------------------------------
  431. #  处理战斗画面的类。
  432. #==============================================================================

  433. class Scene_Battle
  434. #--------------------------------------------------------------------------
  435. # ● 定义实例变量
  436. #--------------------------------------------------------------------------
  437. attr_reader   :animation1_id                    # 行动方动画ID
  438. end

复制代码
  这里备注一下,彩虹神剑的脚本你可以去搜索一下,我是copy了《灵儿续转》里面的脚本。
哎呦,好像快要能发布一款游戏了,这次一定要低调!
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
236
在线时间
191 小时
注册时间
2010-6-22
帖子
233
7
 楼主| 发表于 2010-8-9 12:49:08 | 只看该作者
回复 tree52 的帖子
插入了这个后,
全屏动画就变成了先掉血
后动画
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
64
在线时间
4352 小时
注册时间
2007-8-31
帖子
1982
8
发表于 2010-8-9 15:48:53 | 只看该作者
  1. class Scene_Battle
  2.   alias asperta_update_phase4_step4 update_phase4_step4
  3.   def update_phase4_step4
  4.     for target in @target_battlers
  5.       if target.damage != nil
  6.         target.damage_pop = true
  7.       end
  8.     end
  9.     asperta_update_phase4_step4
  10.   end
  11. end
复制代码
我真是王小二过年,一年不如一年。目前正在寻找状态中,努力找回当初的动力!
“底蕴制作者”—asperta最新博客开通!以后将在这里更新制作进度报告!
我的作品官网:http://www.asperta.org/
ASPERTA世界论坛:http://bbs.asperta.org/


回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
236
在线时间
191 小时
注册时间
2010-6-22
帖子
233
9
 楼主| 发表于 2010-8-9 16:52:36 | 只看该作者
回复 asperta 的帖子
插入Scene_Battle后也是一样
是因为我改过Scene_Battle吗?
以下是我的Scene_Battle脚本:
  1. #==============================================================================
  2. # ■ Scene_Battle (分割定义 1)
  3. #------------------------------------------------------------------------------
  4. #  处理战斗画面的类。
  5. #==============================================================================
  6. class Scene_Battle
  7.   #--------------------------------------------------------------------------
  8.   # ● 主处理
  9.   #--------------------------------------------------------------------------
  10.   def main
  11.     # 初始化战斗用的各种暂时数据
  12.     $game_temp.in_battle = true
  13.     $game_temp.battle_turn = 0
  14.     $game_temp.battle_event_flags.clear
  15.     $game_temp.battle_abort = false
  16.     $game_temp.battle_main_phase = false
  17.     $game_temp.battleback_name = $game_map.battleback_name
  18.     $game_temp.forcing_battler = nil
  19.     # 初始化战斗用事件解释器
  20.     $game_system.battle_interpreter.setup(nil, 0)
  21.     # 准备队伍
  22.     @troop_id = $game_temp.battle_troop_id
  23.     $game_troop.setup(@troop_id)
  24.     # 生成角色命令窗口
  25.     s1 = $data_system.words.attack
  26.     s2 = $data_system.words.skill
  27.     s3 = $data_system.words.guard
  28.     s4 = $data_system.words.item
  29.     s5 = "逃跑"
  30.     @actor_command_window = Window_Command.new(160, [s1, s2, s3, s4,s5])
  31.     @actor_command_window.y = 130
  32.     @actor_command_window.back_opacity = 160
  33.     @actor_command_window.active = false
  34.     @actor_command_window.visible = false
  35.     # 生成其它窗口
  36.     @party_command_window = Window_PartyCommand.new
  37.     @help_window = Window_Help.new
  38.     @help_window.back_opacity = 160
  39.     @help_window.visible = false
  40.     @status_window = Window_BattleStatus.new
  41.     @message_window = Window_Message.new
  42.     # 生成活动块
  43.     @spriteset = Spriteset_Battle.new
  44.     # 初始化等待计数
  45.     @wait_count = 0
  46.     # 执行过渡
  47.     if $data_system.battle_transition == ""
  48.       Graphics.transition(20)
  49.     else
  50.       Graphics.transition(40, "Graphics/Transitions/" +
  51.         $data_system.battle_transition)
  52.     end
  53.     # 开始自由战斗回合
  54.     start_phase1
  55.     # 主循环
  56.     loop do
  57.       # 刷新游戏画面
  58.       Graphics.update
  59.       # 刷新输入信息
  60.       Input.update
  61.       # 刷新画面
  62.       update
  63.       # 如果画面切换的话就中断循环
  64.       if $scene != self
  65.         break
  66.       end
  67.     end
  68.     # 刷新地图
  69.     $game_map.refresh
  70.     # 准备过渡
  71.     Graphics.freeze
  72.     # 释放窗口
  73.     @actor_command_window.dispose
  74.     @party_command_window.dispose
  75.     @help_window.dispose
  76.     @status_window.dispose
  77.     @message_window.dispose
  78.     if @skill_window != nil
  79.       @skill_window.dispose
  80.     end
  81.     if @item_window != nil
  82.       @item_window.dispose
  83.     end
  84.     if @result_window != nil
  85.       @result_window.dispose
  86.     end
  87.     # 释放活动块
  88.     @spriteset.dispose
  89.     # 标题画面切换中的情况
  90.     if $scene.is_a?(Scene_Title)
  91.       # 淡入淡出画面
  92.       Graphics.transition
  93.       Graphics.freeze
  94.     end
  95.     # 战斗测试或者游戏结束以外的画面切换中的情况
  96.     if $BTEST and not $scene.is_a?(Scene_Gameover)
  97.       $scene = nil
  98.     end
  99.   end
  100.   #--------------------------------------------------------------------------
  101.   # ● 胜负判定
  102.   #--------------------------------------------------------------------------
  103.   def judge
  104.     # 全灭判定是真、并且同伴人数为 0 的情况下
  105.     if $game_party.all_dead? or $game_party.actors.size == 0
  106.       # 允许失败的情况下
  107.       if $game_temp.battle_can_lose
  108.         # 还原为战斗开始前的 BGM
  109.         $game_system.bgm_play($game_temp.map_bgm)
  110.         # 战斗结束
  111.         battle_end(2)
  112.         # 返回 true
  113.         return true
  114.       end
  115.       # 设置游戏结束标志
  116.       $game_temp.gameover = true
  117.       # 返回 true
  118.       return true
  119.     end
  120.     # 如果存在任意 1 个敌人就返回 false
  121.     for enemy in $game_troop.enemies
  122.       if enemy.exist?
  123.         return false
  124.       end
  125.     end
  126.     # 开始结束战斗回合 (胜利)
  127.     start_phase5
  128.     # 返回 true
  129.     return true
  130.   end
  131.   #--------------------------------------------------------------------------
  132.   # ● 战斗结束
  133.   #     result : 结果 (0:胜利 1:失败 2:逃跑)
  134.   #--------------------------------------------------------------------------
  135.   def battle_end(result)
  136.     # 清除战斗中标志
  137.     $game_temp.in_battle = false
  138.     # 清除全体同伴的行动
  139.     $game_party.clear_actions
  140.     # 解除战斗用状态
  141.     for actor in $game_party.actors
  142.       actor.remove_states_battle
  143.     end
  144.     # 清除敌人
  145.     $game_troop.enemies.clear
  146.     # 调用战斗返回调用
  147.     if $game_temp.battle_proc != nil
  148.       $game_temp.battle_proc.call(result)
  149.       $game_temp.battle_proc = nil
  150.     end
  151.     # 切换到地图画面
  152.     $scene = Scene_Map.new
  153.   end
  154.   #--------------------------------------------------------------------------
  155.   # ● 设置战斗事件
  156.   #--------------------------------------------------------------------------
  157.   def setup_battle_event
  158.     # 正在执行战斗事件的情况下
  159.     if $game_system.battle_interpreter.running?
  160.       return
  161.     end
  162.     # 搜索全部页的战斗事件
  163.     for index in 0...$data_troops[@troop_id].pages.size
  164.       # 获取事件页
  165.       page = $data_troops[@troop_id].pages[index]
  166.       # 事件条件可以参考 c
  167.       c = page.condition
  168.       # 没有指定任何条件的情况下转到下一页
  169.       unless c.turn_valid or c.enemy_valid or
  170.              c.actor_valid or c.switch_valid
  171.         next
  172.       end
  173.       # 执行完毕的情况下转到下一页
  174.       if $game_temp.battle_event_flags[index]
  175.         next
  176.       end
  177.       # 确认回合条件
  178.       if c.turn_valid
  179.         n = $game_temp.battle_turn
  180.         a = c.turn_a
  181.         b = c.turn_b
  182.         if (b == 0 and n != a) or
  183.            (b > 0 and (n < 1 or n < a or n % b != a % b))
  184.           next
  185.         end
  186.       end
  187.       # 确认敌人条件
  188.       if c.enemy_valid
  189.         enemy = $game_troop.enemies[c.enemy_index]
  190.         if enemy == nil or enemy.hp * 100.0 / enemy.maxhp > c.enemy_hp
  191.           next
  192.         end
  193.       end
  194.       # 确认角色条件
  195.       if c.actor_valid
  196.         actor = $game_actors[c.actor_id]
  197.         if actor == nil or actor.hp * 100.0 / actor.maxhp > c.actor_hp
  198.           next
  199.         end
  200.       end
  201.       # 确认开关条件
  202.       if c.switch_valid
  203.         if $game_switches[c.switch_id] == false
  204.           next
  205.         end
  206.       end
  207.       # 设置事件
  208.       $game_system.battle_interpreter.setup(page.list, 0)
  209.       # 本页的范围是 [战斗] 或 [回合] 的情况下
  210.       if page.span <= 1
  211.         # 设置执行结束标志
  212.         $game_temp.battle_event_flags[index] = true
  213.       end
  214.       return
  215.     end
  216.   end
  217.   #--------------------------------------------------------------------------
  218.   # ● 刷新画面
  219.   #--------------------------------------------------------------------------
  220.   def update
  221.     # 执行战斗事件中的情况下
  222.     if $game_system.battle_interpreter.running?
  223.       # 刷新解释器
  224.       $game_system.battle_interpreter.update
  225.       # 强制行动的战斗者不存在的情况下
  226.       if $game_temp.forcing_battler == nil
  227.         # 执行战斗事件结束的情况下
  228.         unless $game_system.battle_interpreter.running?
  229.           # 继续战斗的情况下、再执行战斗事件的设置
  230.           unless judge
  231.             setup_battle_event
  232.           end
  233.         end
  234.         # 如果不是结束战斗回合的情况下
  235.         if @phase != 5
  236.           # 刷新状态窗口
  237.           @status_window.refresh
  238.         end
  239.       end
  240.     end
  241.     # 系统 (计时器)、刷新画面
  242.     $game_system.update
  243.     $game_screen.update
  244.     # 计时器为 0 的情况下
  245.     if $game_system.timer_working and $game_system.timer == 0
  246.       # 中断战斗
  247.       $game_temp.battle_abort = true
  248.     end
  249.     # 刷新窗口
  250.     @help_window.update
  251.     @party_command_window.update
  252.     @actor_command_window.update
  253.     @status_window.update
  254.     @message_window.update
  255.     # 刷新活动块
  256.     @spriteset.update
  257.     # 处理过渡中的情况下
  258.     if $game_temp.transition_processing
  259.       # 清除处理过渡中标志
  260.       $game_temp.transition_processing = false
  261.       # 执行过渡
  262.       if $game_temp.transition_name == ""
  263.         Graphics.transition(20)
  264.       else
  265.         Graphics.transition(40, "Graphics/Transitions/" +
  266.           $game_temp.transition_name)
  267.       end
  268.     end
  269.     # 显示信息窗口中的情况下
  270.     if $game_temp.message_window_showing
  271.       return
  272.     end
  273.     # 显示效果中的情况下
  274.     if @spriteset.effect?
  275.       return
  276.     end
  277.     # 游戏结束的情况下
  278.     if $game_temp.gameover
  279.       # 切换到游戏结束画面
  280.       $scene = Scene_Gameover.new
  281.       return
  282.     end
  283.     # 返回标题画面的情况下
  284.     if $game_temp.to_title
  285.       # 切换到标题画面
  286.       $scene = Scene_Title.new
  287.       return
  288.     end
  289.     # 中断战斗的情况下
  290.     if $game_temp.battle_abort
  291.       # 还原为战斗前的 BGM
  292.       $game_system.bgm_play($game_temp.map_bgm)
  293.       # 战斗结束
  294.       battle_end(1)
  295.       return
  296.     end
  297.     # 等待中的情况下
  298.     if @wait_count > 0
  299.       # 减少等待计数
  300.       @wait_count -= 1
  301.       return
  302.     end
  303.     # 强制行动的角色存在、
  304.     # 并且战斗事件正在执行的情况下
  305.     if $game_temp.forcing_battler == nil and
  306.        $game_system.battle_interpreter.running?
  307.       return
  308.     end
  309.     # 回合分支
  310.     case @phase
  311.     when 1  # 自由战斗回合
  312.       update_phase1
  313.     when 2  # 同伴命令回合
  314.       update_phase2
  315.     when 3  # 角色命令回合
  316.       update_phase3
  317.     when 4  # 主回合
  318.       update_phase4
  319.     when 5  # 战斗结束回合
  320.       update_phase5
  321.     end
  322.   end
  323. end



  324. #==============================================================================
  325. # ■ Scene_Battle (分割定义 3)
  326. #------------------------------------------------------------------------------
  327. #  处理战斗画面的类。
  328. #==============================================================================

  329. class Scene_Battle
  330.   #--------------------------------------------------------------------------
  331.   # ● 开始角色命令回合
  332.   #--------------------------------------------------------------------------
  333.   def start_phase3
  334.     # 转移到回合 3
  335.     @phase = 3
  336.     # 设置觉得为非选择状态
  337.     @actor_index = -1
  338.     @active_battler = nil
  339.     # 输入下一个角色的命令
  340.     phase3_next_actor
  341.   end
  342.   #--------------------------------------------------------------------------
  343.   # ● 转到输入下一个角色的命令
  344.   #--------------------------------------------------------------------------
  345.   def phase3_next_actor
  346.     # 循环
  347.     begin
  348.       # 角色的明灭效果 OFF
  349.       if @active_battler != nil
  350.         @active_battler.blink = false
  351.       end
  352.       # 最后的角色的情况
  353.       if @actor_index == $game_party.actors.size-1
  354.         # 开始主回合
  355.         start_phase4
  356.         return
  357.       end
  358.       # 推进角色索引
  359.       @actor_index += 1
  360.       @active_battler = $game_party.actors[@actor_index]
  361.       @active_battler.blink = true
  362.     # 如果角色是在无法接受指令的状态就再试
  363.     end until @active_battler.inputable?
  364.     # 设置角色的命令窗口
  365.     phase3_setup_command_window
  366.   end
  367.   #--------------------------------------------------------------------------
  368.   # ● 转向前一个角色的命令输入
  369.   #--------------------------------------------------------------------------
  370.   def phase3_prior_actor
  371.     # 循环
  372.     begin
  373.       # 角色的明灭效果 OFF
  374.       if @active_battler != nil
  375.         @active_battler.blink = false
  376.       end
  377.       # 最初的角色的情况下
  378.       if @actor_index == 0
  379.         # 开始同伴指令回合
  380.         start_phase2
  381.         return
  382.       end
  383.       # 返回角色索引
  384.       @actor_index -= 1
  385.       @active_battler = $game_party.actors[@actor_index]
  386.       @active_battler.blink = true
  387.     # 如果角色是在无法接受指令的状态就再试
  388.     end until @active_battler.inputable?
  389.     # 设置角色的命令窗口
  390.     phase3_setup_command_window
  391.   end
  392.   #--------------------------------------------------------------------------
  393.   # ● 设置角色指令窗口
  394.   #--------------------------------------------------------------------------
  395.   def phase3_setup_command_window
  396.     # 同伴指令窗口无效化
  397.     @party_command_window.active = false
  398.     @party_command_window.visible = false
  399.     # 角色指令窗口无效化
  400.     @actor_command_window.active = true
  401.     @actor_command_window.visible = true
  402.     # 设置角色指令窗口的位置
  403.     @actor_command_window.x = @actor_index * 160
  404.     # 设置索引为 0
  405.     @actor_command_window.index = 0
  406.   end
  407.   #--------------------------------------------------------------------------
  408.   # ● 刷新画面 (角色命令回合)
  409.   #--------------------------------------------------------------------------
  410.   def update_phase3
  411.     # 敌人光标有效的情况下
  412.     if @enemy_arrow != nil
  413.       update_phase3_enemy_select
  414.     # 角色光标有效的情况下
  415.     elsif @actor_arrow != nil
  416.       update_phase3_actor_select
  417.     # 特技窗口有效的情况下
  418.     elsif @skill_window != nil
  419.       update_phase3_skill_select
  420.     # 物品窗口有效的情况下
  421.     elsif @item_window != nil
  422.       update_phase3_item_select
  423.     # 角色指令窗口有效的情况下
  424.     elsif @actor_command_window.active
  425.       update_phase3_basic_command
  426.     end
  427.   end
  428.   #--------------------------------------------------------------------------
  429.   # ● 刷新画面 (角色命令回合 : 基本命令)
  430.   #--------------------------------------------------------------------------
  431.   def update_phase3_basic_command
  432.     # 按下 B 键的情况下
  433.     if Input.trigger?(Input::B)
  434.       # 演奏取消 SE
  435.       $game_system.se_play($data_system.cancel_se)
  436.       # 转向前一个角色的指令输入
  437.       phase3_prior_actor
  438.       return
  439.     end
  440.     # 按下 C 键的情况下
  441.     if Input.trigger?(Input::C)
  442.       # 角色指令窗口光标位置分之
  443.       case @actor_command_window.index
  444.       when 0  # 攻击
  445.         # 演奏确定 SE
  446.         $game_system.se_play($data_system.decision_se)
  447.         # 设置行动
  448.         @active_battler.current_action.kind = 0
  449.         @active_battler.current_action.basic = 0
  450.         # 开始选择敌人
  451.         start_enemy_select
  452.       when 1  # 特技
  453.         # 演奏确定 SE
  454.         $game_system.se_play($data_system.decision_se)
  455.         # 设置行动
  456.         @active_battler.current_action.kind = 1
  457.         # 开始选择特技
  458.         start_skill_select
  459.       when 2  # 防御
  460.         # 演奏确定 SE
  461.         $game_system.se_play($data_system.decision_se)
  462.         # 设置行动
  463.         @active_battler.current_action.kind = 0
  464.         @active_battler.current_action.basic = 1
  465.         # 转向下一位角色的指令输入
  466.         phase3_next_actor
  467.       when 3  # 物品
  468.         # 演奏确定 SE
  469.         $game_system.se_play($data_system.decision_se)
  470.         # 设置行动
  471.         @active_battler.current_action.kind = 2
  472.         # 开始选择物品
  473.         start_item_select
  474.       when 4
  475.         enemies_agi = 0
  476.         enemies_number = 0
  477.         for enemy in $game_troop.enemies
  478.       if enemy.exist?
  479.         enemies_agi += enemy.agi
  480.         enemies_number += 1
  481.         end
  482.         end
  483.       if enemies_number > 0
  484.         enemies_agi /= enemies_number
  485.         end
  486.         # 计算角色速度的平均值
  487.         actors_agi = 0
  488.         actors_number = 0
  489.         for actor in $game_party.actors
  490.         if actor.exist?
  491.         actors_agi += actor.agi
  492.         actors_number += 1
  493.         end
  494.         end
  495.      if actors_number > 0
  496.        actors_agi /= actors_number
  497.        end
  498.         # 逃跑成功判定
  499.         success = rand(100) < 50 * actors_agi / enemies_agi
  500.         # 成功逃跑的情况下
  501.         if success
  502.         # 演奏逃跑 SE
  503.         $game_system.se_play($data_system.escape_se)
  504.         # 还原为战斗开始前的 BGM
  505.         $game_system.bgm_play($game_temp.map_bgm)
  506.         # 战斗结束
  507.         $game_temp.battle_abort = true
  508.         # 逃跑失败的情况下
  509.         else
  510.         # 清除全体同伴的行动
  511.         $game_party.clear_actions
  512.         # 开始主回合
  513.         start_phase4
  514.         end
  515.       end
  516.       return
  517.     end
  518.   end
  519.   #--------------------------------------------------------------------------
  520.   # ● 刷新画面 (角色命令回合 : 选择特技)
  521.   #--------------------------------------------------------------------------
  522.   def update_phase3_skill_select
  523.     # 设置特技窗口为可视状态
  524.     @skill_window.visible = true
  525.     # 刷新特技窗口
  526.     @skill_window.update
  527.     # 按下 B 键的情况下
  528.     if Input.trigger?(Input::B)
  529.       # 演奏取消 SE
  530.       $game_system.se_play($data_system.cancel_se)
  531.       # 结束特技选择
  532.       end_skill_select
  533.       return
  534.     end
  535.     # 按下 C 键的情况下
  536.     if Input.trigger?(Input::C)
  537.       # 获取特技选择窗口现在选择的特技的数据
  538.       @skill = @skill_window.skill
  539.       # 无法使用的情况下
  540.       if @skill == nil or not @active_battler.skill_can_use?(@skill.id)
  541.         # 演奏冻结 SE
  542.         $game_system.se_play($data_system.buzzer_se)
  543.         return
  544.       end
  545.       # 演奏确定 SE
  546.       $game_system.se_play($data_system.decision_se)
  547.       # 设置行动
  548.       @active_battler.current_action.skill_id = @skill.id
  549.       # 设置特技窗口为不可见状态
  550.       @skill_window.visible = false
  551.       # 效果范围是敌单体的情况下
  552.       if @skill.scope == 1
  553.         # 开始选择敌人
  554.         start_enemy_select
  555.       # 效果范围是我方单体的情况下
  556.       elsif @skill.scope == 3 or @skill.scope == 5
  557.         # 开始选择角色
  558.         start_actor_select
  559.       # 效果范围不是单体的情况下
  560.       else
  561.         # 选择特技结束
  562.         end_skill_select
  563.         # 转到下一位角色的指令输入
  564.         phase3_next_actor
  565.       end
  566.       return
  567.     end
  568.   end
  569.   #--------------------------------------------------------------------------
  570.   # ● 刷新画面 (角色命令回合 : 选择物品)
  571.   #--------------------------------------------------------------------------
  572.   def update_phase3_item_select
  573.     # 设置物品窗口为可视状态
  574.     @item_window.visible = true
  575.     # 刷新物品窗口
  576.     @item_window.update
  577.     # 按下 B 键的情况下
  578.     if Input.trigger?(Input::B)
  579.       # 演奏取消 SE
  580.       $game_system.se_play($data_system.cancel_se)
  581.       # 选择物品结束
  582.       end_item_select
  583.       return
  584.     end
  585.     # 按下 C 键的情况下
  586.     if Input.trigger?(Input::C)
  587.       # 获取物品窗口现在选择的物品资料
  588.       @item = @item_window.item
  589.       # 无法使用的情况下
  590.       unless $game_party.item_can_use?(@item.id)
  591.         # 演奏冻结 SE
  592.         $game_system.se_play($data_system.buzzer_se)
  593.         return
  594.       end
  595.       # 演奏确定 SE
  596.       $game_system.se_play($data_system.decision_se)
  597.       # 设置行动
  598.       @active_battler.current_action.item_id = @item.id
  599.       # 设置物品窗口为不可见状态
  600.       @item_window.visible = false
  601.       # 效果范围是敌单体的情况下
  602.       if @item.scope == 1
  603.         # 开始选择敌人
  604.         start_enemy_select
  605.       # 效果范围是我方单体的情况下
  606.       elsif @item.scope == 3 or @item.scope == 5
  607.         # 开始选择角色
  608.         start_actor_select
  609.       # 效果范围不是单体的情况下
  610.       else
  611.         # 物品选择结束
  612.         end_item_select
  613.         # 转到下一位角色的指令输入
  614.         phase3_next_actor
  615.       end
  616.       return
  617.     end
  618.   end
  619.   #--------------------------------------------------------------------------
  620.   # ● 刷新画面画面 (角色命令回合 : 选择敌人)
  621.   #--------------------------------------------------------------------------
  622.   def update_phase3_enemy_select
  623.     # 刷新敌人箭头
  624.     @enemy_arrow.update
  625.     # 按下 B 键的情况下
  626.     if Input.trigger?(Input::B)
  627.       # 演奏取消 SE
  628.       $game_system.se_play($data_system.cancel_se)
  629.       # 选择敌人结束
  630.       end_enemy_select
  631.       return
  632.     end
  633.     # 按下 C 键的情况下
  634.     if Input.trigger?(Input::C)
  635.       # 演奏确定 SE
  636.       $game_system.se_play($data_system.decision_se)
  637.       # 设置行动
  638.       @active_battler.current_action.target_index = @enemy_arrow.index
  639.       # 选择敌人结束
  640.       end_enemy_select
  641.       # 显示特技窗口中的情况下
  642.       if @skill_window != nil
  643.         # 结束特技选择
  644.         end_skill_select
  645.       end
  646.       # 显示物品窗口的情况下
  647.       if @item_window != nil
  648.         # 结束物品选择
  649.         end_item_select
  650.       end
  651.       # 转到下一位角色的指令输入
  652.       phase3_next_actor
  653.     end
  654.   end
  655.   #--------------------------------------------------------------------------
  656.   # ● 画面更新 (角色指令回合 : 选择角色)
  657.   #--------------------------------------------------------------------------
  658.   def update_phase3_actor_select
  659.     # 刷新角色箭头
  660.     @actor_arrow.update
  661.     # 按下 B 键的情况下
  662.     if Input.trigger?(Input::B)
  663.       # 演奏取消 SE
  664.       $game_system.se_play($data_system.cancel_se)
  665.       # 选择角色结束
  666.       end_actor_select
  667.       return
  668.     end
  669.     # 按下 C 键的情况下
  670.     if Input.trigger?(Input::C)
  671.       # 演奏确定 SE
  672.       $game_system.se_play($data_system.decision_se)
  673.       # 设置行动
  674.       @active_battler.current_action.target_index = @actor_arrow.index
  675.       # 选择角色结束
  676.       end_actor_select
  677.       # 显示特技窗口中的情况下
  678.       if @skill_window != nil
  679.         # 结束特技选择
  680.         end_skill_select
  681.       end
  682.       # 显示物品窗口的情况下
  683.       if @item_window != nil
  684.         # 结束物品选择
  685.         end_item_select
  686.       end
  687.       # 转到下一位角色的指令输入
  688.       phase3_next_actor
  689.     end
  690.   end
  691.   #--------------------------------------------------------------------------
  692.   # ● 开始选择敌人
  693.   #--------------------------------------------------------------------------
  694.   def start_enemy_select
  695.     # 生成敌人箭头
  696.     @enemy_arrow = Arrow_Enemy.new(@spriteset.viewport1)
  697.     # 关联帮助窗口
  698.     @enemy_arrow.help_window = @help_window
  699.     # 无效化角色指令窗口
  700.     @actor_command_window.active = false
  701.     @actor_command_window.visible = false
  702.   end
  703.   #--------------------------------------------------------------------------
  704.   # ● 结束选择敌人
  705.   #--------------------------------------------------------------------------
  706.   def end_enemy_select
  707.     # 释放敌人箭头
  708.     @enemy_arrow.dispose
  709.     @enemy_arrow = nil
  710.     # 指令为 [战斗] 的情况下
  711.     if @actor_command_window.index == 0
  712.       # 有效化角色指令窗口
  713.       @actor_command_window.active = true
  714.       @actor_command_window.visible = true
  715.       # 隐藏帮助窗口
  716.       @help_window.visible = false
  717.     end
  718.   end
  719.   #--------------------------------------------------------------------------
  720.   # ● 开始选择角色
  721.   #--------------------------------------------------------------------------
  722.   def start_actor_select
  723.     # 生成角色箭头
  724.     @actor_arrow = Arrow_Actor.new(@spriteset.viewport2)
  725.     @actor_arrow.index = @actor_index
  726.     # 关联帮助窗口
  727.     @actor_arrow.help_window = @help_window
  728.     # 无效化角色指令窗口
  729.     @actor_command_window.active = false
  730.     @actor_command_window.visible = false
  731.   end
  732.   #--------------------------------------------------------------------------
  733.   # ● 结束选择角色
  734.   #--------------------------------------------------------------------------
  735.   def end_actor_select
  736.     # 释放角色箭头
  737.     @actor_arrow.dispose
  738.     @actor_arrow = nil
  739.   end
  740.   #--------------------------------------------------------------------------
  741.   # ● 开始选择特技
  742.   #--------------------------------------------------------------------------
  743.   def start_skill_select
  744.     # 生成特技窗口
  745.     @skill_window = Window_Skill.new(@active_battler)
  746.     # 关联帮助窗口
  747.     @skill_window.help_window = @help_window
  748.     # 无效化角色指令窗口
  749.     @actor_command_window.active = false
  750.     @actor_command_window.visible = false
  751.   end
  752.   #--------------------------------------------------------------------------
  753.   # ● 选择特技结束
  754.   #--------------------------------------------------------------------------
  755.   def end_skill_select
  756.     # 释放特技窗口
  757.     @skill_window.dispose
  758.     @skill_window = nil
  759.     # 隐藏帮助窗口
  760.     @help_window.visible = false
  761.     # 有效化角色指令窗口
  762.     @actor_command_window.active = true
  763.     @actor_command_window.visible = true
  764.   end
  765.   #--------------------------------------------------------------------------
  766.   # ● 开始选择物品
  767.   #--------------------------------------------------------------------------
  768.   def start_item_select
  769.     # 生成物品窗口
  770.     @item_window = Window_Item.new
  771.     # 关联帮助窗口
  772.     @item_window.help_window = @help_window
  773.     # 无效化角色指令窗口
  774.     @actor_command_window.active = false
  775.     @actor_command_window.visible = false
  776.   end
  777.   #--------------------------------------------------------------------------
  778.   # ● 结束选择物品
  779.   #--------------------------------------------------------------------------
  780.   def end_item_select
  781.     # 释放物品窗口
  782.     @item_window.dispose
  783.     @item_window = nil
  784.     # 隐藏帮助窗口
  785.     @help_window.visible = false
  786.     # 有效化角色指令窗口
  787.     @actor_command_window.active = true
  788.     @actor_command_window.visible = true
  789.   end
  790. end
复制代码
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-15 04:48

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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