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

Project1

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

[已经过期] 对象方动画,敌人死亡时间判定问题

[复制链接]

Lv5.捕梦者

梦石
0
星屑
35209
在线时间
4170 小时
注册时间
2007-12-15
帖子
10072
跳转到指定楼层
1
发表于 2017-2-9 11:20:46 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

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

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

x
本帖最后由 89444640 于 2017-2-9 11:42 编辑

脚本中关于敌人死亡明灭变化这里没改过。我也不知道在哪里- -b
由于重新优试反击技能动作才注意到此现象。

全动画脚本中,出手方动画与对象方动画同时显示
显示动画的时候,如果存在多段攻击,敌人死亡的时间是按照最后一段命中时候计算的,会造成如下效果

命中方动画未播放完就已经更改不透明度逐渐消失。

此为反击攻击 两段判定(就是敌方闪烁两次)
如果伤害超过敌方剩余hp,都是按照第一段攻击时候判断敌方是否死亡发生渐变
于是就造成了,命中动画随着敌方渐变一起消失,命中动画根本播不完就消失了。

在普通战斗中也是如此,只不过以前没注意到
敌人死亡的事件是按照动画的最后一次闪烁来判断的。
一旦判断为敌方死亡,就会叠加一个逐渐消失的效果
可这个时候对象方动画并没有播放完毕,也就是说还有人物收招动作或者剩余的不产生攻击闪烁的魔法。

在哪里可以更改这个效果,使得只有在对象方动画全部播放完后,如果敌人死亡,才开始用默认的死亡方法变红后消失这样显示,而不是对象方动画播放中就逐渐消失了。
我的想法是,可否这样写脚本,判断播放对象方动画的最后一帧,无论有多少帧都按照最后一帧来计算,这样虽然看上去不是敌人立刻死亡有些不妥,但是可以保证对象方动画全部播放完成。
希望能帮我实现这个效果,多谢各位诸位的帮助

反击技脚本如下


RUBY 代码复制
  1. #==========================================================================
  2. # 本脚本来自[url]www.66RPG.com[/url],由ikki转载。使用请保留此信息
  3. #=========================================================================
  4.  
  5. # ▼▲▼ XRXS27. 特殊効果 SuperEX「反击」 ver.1.05 ▼▲▼
  6. # by シムナフ, ピニョン
  7.  
  8. #========================================================================
  9. # □ 自定义设定
  10. #========================================================================
  11. class Game_Battler
  12.   # 反击的状态名
  13.   STATE_COUNTER_NAME = '反击'
  14. end
  15.  
  16. #========================================================================
  17. # ◇ 说明文档
  18. #=======================================================================
  19. #****Warning! 重新定义了 Game_Actor#skill_can_use? ****
  20.  
  21. #使用方法
  22. #对于身中“反击”状态的角色,当收到单独的攻击的时候会自动反击
  23. #反击的模式可以在下面设定
  24.  
  25. #-cr (counter react)下面设定可以反击的挨打设定,
  26. # 比如设定一个状态名为“反击 -crm”,则受到魔法攻击的时候会自动反击
  27. #-crp  (physical)=>遭到通常攻击,物理攻击的时候反击
  28. #-crm  (masic)=>遭到魔法攻击的时候反击
  29. #-cre7 (element)=>遭到属性ID编号为7的攻击的时候反击。
  30.  
  31. #-ca (counter act)下面设定反击行为
  32. #比如设置一个状态名叫做“反击 -cas19”,那么受到攻击的时候就会用19号特技反击。
  33. #-cas1 (skill)=>使用编号为1的技能
  34. #-cai1 (item)=>使用编号为1的物品。
  35. #-caa  (attack)=>使用物理攻击反击。
  36. #-cae  (escape)=>逃跑,敌人使用
  37.  
  38. #-cac  (copy)=>受けたスキルをそのまま反击。未テスト(笑
  39. #何もつけない場合は通常攻撃反击になります。(不懂……?@_@?)
  40.  
  41. #注意和即时战斗的共同使用问题……
  42.  
  43. #举例:设置一个状态,使得遭遇物理攻击的时候使用物品4,“反击 -crp -cai4”
  44.  
  45. #========================================================================
  46. # ■ Game_Battler (分割定義 1)
  47. #========================================================================
  48.  
  49. class Game_Battler
  50.   #-----------------------------------------------------------------------
  51.   # ● オブジェクト初期化
  52.   #-----------------------------------------------------------------------
  53.   def states=(states)
  54.     @states = states
  55.   end
  56.  
  57.   #-----------------------------------------------------------------------
  58.   # ● オブジェクト初期化
  59.   #-----------------------------------------------------------------------
  60.   alias original_initialize_before_counter_action initialize
  61.   def initialize
  62.     original_initialize_before_counter_action()
  63.     @counter_action = Game_BattleAction.new
  64.   end
  65.  
  66.   #-----------------------------------------------------------------------
  67.   # ●
  68.   #-----------------------------------------------------------------------
  69.   alias original_current_action_before_counter_action current_action
  70.   def current_action
  71.       if @counter_action.cleared?
  72.         return original_current_action_before_counter_action()
  73.       else
  74.         return @counter_action
  75.       end
  76.   end
  77.  
  78.   #-----------------------------------------------------------------------
  79.   # ●
  80.   #-----------------------------------------------------------------------
  81.   def counter_action
  82.     return @counter_action
  83.   end
  84.   #-----------------------------------------------------------------------
  85.   # ●
  86.   #-----------------------------------------------------------------------
  87.   def counter_acting?
  88.     if !@counter_action.cleared?
  89.       return true
  90.     else
  91.       return false
  92.     end
  93.   end
  94.   #-----------------------------------------------------------------------
  95.   # ● 戦闘不能判定
  96.   #-----------------------------------------------------------------------
  97.   #alias original_dead_before_counter_action dead?
  98.   #def dead?
  99.   #  if self.counter_acting?
  100.   #    return false
  101.   #  else
  102.   #    return original_dead_before_counter_action()
  103.   #  end
  104.   #end
  105.  
  106.   #----------------------------------------------------------------------
  107.   # ●
  108.   #----------------------------------------------------------------------
  109.   def counter_action_for(attacker, skill = nil)
  110.     #カウンターからのカウンターは発生しない
  111.     if attacker.counter_acting?
  112.       return
  113.     end
  114.     #動けない場合存在しない場合は発生しない
  115.     #if !self.movable? || !self.exist?
  116.     #  return
  117.     #end
  118.     if attacker.is_a?(Game_Actor)
  119.       if self.is_a?(Game_Actor)#味方からの攻撃はカウンター不可
  120.         return
  121.       end
  122.       ind = $game_party.get_index_by(attacker)
  123.       s_ind = $game_troop.get_index_by(self)
  124.     elsif attacker.is_a?(Game_Enemy)
  125.       if self.is_a?(Game_Enemy)#味方からの攻撃はカウンター不可
  126.         return
  127.       end
  128.       ind = $game_troop.get_index_by(attacker)
  129.       s_ind = $game_party.get_index_by(self)
  130.     end
  131.     if ind.nil? || s_ind.nil?
  132.       return
  133.     end
  134.  
  135.     act_kind = 'a'
  136.     act_id = 0
  137.  
  138.     for id in @states
  139.       if $data_states[id].name =~ /^#{STATE_COUNTER_NAME}/
  140.         react_cond = false
  141.         react_succ = false
  142.         for opt in $data_states[id].options
  143.           if opt =~ /^cr([pmedns])([0-9]*)/
  144.             kind = $1
  145.             id = $2.to_i
  146.             react_cond = true
  147.             case kind
  148.             when 'p'
  149.               if skill.nil? || skill.atk_f >= 100
  150.                 react_succ = true
  151.               end
  152.             when 'm'
  153.               if !skill.nil? && skill.int_f >= 100
  154.                 react_succ = true
  155.               end
  156.             when 'e'
  157.               if id.nil? || id.zero?
  158.                 next
  159.               elsif skill.nil? #武器の攻撃属性
  160.                 if attacker.is_a?(Game_Actor) && !$data_weapons[@weapon_id].nil?
  161.                   if $data_weapons[@weapon_id].element_set.include?(id)
  162.                     react_succ = true
  163.                   end
  164.                 end
  165.               elsif skill.element_set.include?(id)#スキルの攻撃属性
  166.                 react_succ = true
  167.               end
  168.  
  169.             when 'n'#相手攻撃無効カウンター
  170.               no_attack = true
  171.             when 's'#回避時カウンター
  172.               miss_attack = true
  173.             when 'd'#死亡カウンター
  174.               if self.dead? && self.movable?
  175.                 react_succ = true
  176.               end
  177.             end
  178.  
  179.           elsif opt =~ /^ca([asime])([0-9]*)/
  180.             act_kind = $1
  181.             act_id = $2.to_i
  182.             act_cond = true
  183.           end
  184.         end
  185.  
  186.         if (!react_cond || react_succ)#反击条件が無い・もしくは条件に一致
  187.           counter = true#カウンター成功
  188.           break
  189.         else
  190.           next
  191.         end
  192.  
  193.       end
  194.     end
  195.  
  196.     if !counter#カウンター成功していなかった場合
  197.       return
  198.     end
  199.  
  200.  
  201.     # 相手攻撃無効カウンターありならダメージ戻し
  202.     if no_attack == true
  203.       if self.damage != "被对手闪开了!"
  204.         self.hp += self.damage
  205.         self.damage = "反击!!"
  206.         self.critical = false
  207.         @state_changed = false
  208.         self.states = @old_states
  209.       end
  210.     end
  211.  
  212.     # 回避時カウンターありでミスじゃないときはさよなら
  213.     if miss_attack == true and self.damage != "被对手闪开了!"
  214.       return
  215.     end
  216.  
  217.  
  218.     if act_kind == 'c'
  219.       if skill.nil?
  220.         act_kind = 'a'
  221.       else
  222.         act_kind = 's'
  223.         act_id = skill.id
  224.       end
  225.     end
  226.  
  227.     case act_kind
  228.     when 's'#skill kind:1 basic0
  229.       s = $data_skills[act_id]
  230.       if s.nil? || ![0,1].include?(s.occasion) || !self.skill_can_use?(act_id)
  231.         return
  232.       end
  233.       self.counter_action.skill_id = act_id
  234.       self.counter_action.kind = 1
  235.       if [1,2].include?(s.scope)#1,2で敵単体、敵全体。
  236.         self.counter_action.target_index = ind
  237.       else
  238.         self.counter_action.target_index = s_ind
  239.       end
  240.     when 'i'#item kind:2 basic:0
  241.       i = $data_items[act_id]
  242.       if !self.is_a?(Game_Actor) || i.nil? || ![0,1].include?(i.occasion) || !$game_party.item_can_use?(act_id)
  243.         return
  244.       end
  245.       self.counter_action.item_id = act_id
  246.       self.counter_action.kind = 2
  247.       if [1,2].include?(i.scope)#1,2で敵単体、敵全体。
  248.         self.counter_action.target_index = ind
  249.       else
  250.         self.counter_action.target_index = s_ind
  251.       end
  252.     when 'a'#通常攻撃 kind:0 basic:0
  253.       self.counter_action.kind = 0
  254.       self.counter_action.target_index = ind
  255.       self.counter_action.basic = 0
  256.     when 'e'#escape kind:0 basic:2
  257.       if !self.is_a?(Game_Enemy)
  258.         return
  259.       end
  260.       self.counter_action.kind = 0
  261.       self.counter_action.target_index = ind
  262.       self.counter_action.basic = 2      
  263.     end
  264.     return
  265.  
  266.   end
  267.  
  268.   #----------------------------------------------------------------------
  269.   # ● 通常攻撃の効果適用
  270.   #     attacker : 攻撃者 (バトラー)
  271.   #----------------------------------------------------------------------
  272.   alias original_attack_effect_before_counter_action attack_effect
  273.   def attack_effect(attacker)
  274.     @old_states = self.states.clone
  275.     val = original_attack_effect_before_counter_action(attacker)
  276.     self.counter_action_for(attacker)
  277.     return val
  278.   end  
  279.  
  280.   #----------------------------------------------------------------------
  281.   # ● スキルの効果適用
  282.   #     user  : スキルの使用者 (バトラー)
  283.   #     skill : スキル
  284.   #----------------------------------------------------------------------
  285.   alias original_skill_effect_before_counter_action skill_effect
  286.   def skill_effect(attacker, skill)
  287.     @old_states = self.states.clone
  288.     val = original_skill_effect_before_counter_action(attacker, skill)
  289.     self.counter_action_for(attacker, skill)
  290.     return val
  291.   end
  292.  
  293. end
  294.  
  295. #=======================================================================
  296. # ■ Game_Actor
  297. #--------------------------------------------------------------------------
  298. #  アクターを扱うクラスです。このクラスは Game_Actors クラス ($game_actors)
  299. # の内部で使用され、Game_Party クラス ($game_party) からも参照されます。
  300. #=======================================================================
  301.  
  302. class Game_Actor < Game_Battler
  303.   #----------------------------------------------------------------------
  304.   # ● スキルの使用可能判定
  305.   #     skill_id : スキル ID
  306.   #----------------------------------------------------------------------
  307.   def skill_can_use?(skill_id)
  308.     #if not skill_learn?(skill_id)
  309.     #  return false
  310.     #end
  311.     return super
  312.   end
  313. end
  314.  
  315. #========================================================================
  316. # ■ Game_BattleAction
  317. #-------------------------------------------------------------------------
  318. #  アクション (戦闘中の行動) を扱うクラスです。このクラスは Game_Battler クラ
  319. # スの内部で使用されます。
  320. #========================================================================
  321.  
  322. class Game_BattleAction
  323.  
  324.   alias :xp_original_initialize :initialize
  325.   def initialize
  326.     xp_original_initialize()
  327.     @turn_move_times = 0
  328.   end
  329.   #-----------------------------------------------------------------------
  330.   # ● クリア判定
  331.   #-----------------------------------------------------------------------
  332.   def cleared?
  333.     if @speed == 0 && @kind == 0 && @basic == 3 && @skill_id == 0 && @item_id == 0 && @target_index == -1 && @forcing == false
  334.       return true
  335.     else
  336.       return false
  337.     end
  338.   end
  339.  
  340. end
  341.  
  342.  
  343. #=========================================================================
  344. # ■ Game_Party
  345. #--------------------------------------------------------------------------
  346. #  パーティを扱うクラスです。ゴールドやアイテムなどの情報が含まれます。このク
  347. # ラスのインスタンスは $game_party で参照されます。
  348. #=========================================================================
  349.  
  350. class Game_Party
  351.   #----------------------------------------------------------------------
  352.   # ●
  353.   #----------------------------------------------------------------------
  354.   def get_index_by(actor)
  355.     for i in [email]0...@actors.size[/email]()
  356.       if @actors[i].equal?(actor)
  357.         return i
  358.       end
  359.     end
  360.     return nil
  361.   end
  362. end
  363.  
  364.  
  365. #==========================================================================
  366. # ■ Game_Troop
  367. #--------------------------------------------------------------------------
  368. #  トループを扱うクラスです。このクラスのインスタンスは $game_troop で参照さ
  369. # れます。
  370. #==========================================================================
  371.  
  372. class Game_Troop
  373.   #----------------------------------------------------------------------
  374.   # ●
  375.   #----------------------------------------------------------------------
  376.   def get_index_by(enemy)
  377.     for i in [email]0...@enemies.size[/email]()
  378.       if @enemies[i].equal?(enemy)
  379.         return i
  380.       end
  381.     end
  382.     return nil
  383.   end
  384. end
  385.  
  386. #==========================================================================
  387. # ■ Scene_Battle (分割定義 4)
  388. #--------------------------------------------------------------------------
  389. #  バトル画面の処理を行うクラスです。
  390. #==========================================================================
  391.  
  392. class Scene_Battle
  393.  
  394.   #----------------------------------------------------------------------
  395.   # ● フレーム更新 (メインフェーズ ステップ 6 : リフレッシュ)
  396.   #----------------------------------------------------------------------
  397.   alias original_update_phase4_step6_before_counter_action update_phase4_step6
  398.   def update_phase4_step6
  399.     original_update_phase4_step6_before_counter_action()
  400.     clear_counter_action(@active_battler)
  401.     activate_counter_action(@action_battlers)
  402.   end
  403.   #----------------------------------------------------------------------
  404.   #
  405.   #----------------------------------------------------------------------
  406.   def clear_counter_action(active_battler)
  407.     #既にカウンターを行ったバトラーのカウンターアクションをクリア
  408.     if active_battler.nil?
  409.       return
  410.     end
  411.     if !active_battler.counter_acting?
  412.       return
  413.     end
  414.     active_battler.counter_action.clear
  415.     return
  416.   end
  417.   #----------------------------------------------------------------------
  418.   #
  419.   #----------------------------------------------------------------------
  420.   def activate_counter_action(action_battlers)   
  421.     #カウンター状態になったバトラーを一回だけアクションバトラーズにアンシフト
  422.     if !action_battlers[0].nil?
  423.       if action_battlers[0].counter_acting?#既にカウンター行動待機バトラーが居た場合
  424.         return
  425.       end
  426.     end
  427.     counter_battlers = []
  428.     $game_party.actors.each{|a|
  429.       if a.counter_acting?
  430.         counter_battlers.push(a)
  431.       end
  432.     }
  433.     $game_troop.enemies.each{|e|
  434.       if e.counter_acting?
  435.         counter_battlers.push(e)
  436.       end
  437.     }
  438.     counter_battlers = counter_battlers.sort_by{|b| b.agi}
  439.     counter_battlers.each{ |b|
  440.       action_battlers.unshift(b)
  441.     }
  442.     #p action_battlers.collect{|b| b.name}
  443.     return
  444.   end
  445. end
  446.  
  447.  
  448. #=============================
  449. #CPバトル対応。
  450. #ターンバトルの人は必要なし。
  451. #=============================
  452. class Game_Battler
  453.   if method_defined?(:cp)
  454.     alias original_cp_before_counter_action cp
  455.     def cp
  456.       if self.counter_acting?
  457.         return 65535
  458.       else
  459.         return original_cp_before_counter_action()
  460.       end
  461.     end
  462.   end
  463.   if method_defined?(:cp=)
  464.     alias original_cp_before_counter_action= cp=
  465.     def cp=(n)
  466.       if self.counter_acting?
  467.         return
  468.       else
  469.         self.original_cp_before_counter_action = n
  470.       end
  471.     end
  472.   end
  473. end
  474. #=============================
  475. #ここまで。
  476. #=============================
  477.  
  478.  
  479.   #---------------------------------------------------------------------
  480.   #
  481.   #---------------------------------------------------------------------
  482.  
  483. module RPG
  484.   class State
  485.     def name
  486.       if @new_name.nil?
  487.         name_setting()
  488.       end
  489.       return @new_name
  490.     end
  491.  
  492.     def options
  493.       if @options.nil?
  494.         name_setting()
  495.       end
  496.       return @options
  497.     end
  498.  
  499.     def name_setting
  500.       names = @name.split(/ +-/)
  501.       @new_name = names.shift
  502.       if @new_name.nil?
  503.         @new_name = ''
  504.       end
  505.       @options = names
  506.       if @options.nil?
  507.         @options = []
  508.       end
  509.     end
  510.  
  511.   end
  512. end

Lv2.观梦者

会吐槽的画师

梦石
0
星屑
782
在线时间
3431 小时
注册时间
2011-6-10
帖子
6535
2
发表于 2017-2-9 13:15:45 | 只看该作者
在VX的横版ATB里有一个很矛盾的设定:
A 如果把死亡设定为“技能动画打完再判定”,那么会出现一些“空血没死”的bug
B 如果把死亡设定为“没血那一刻就判定”,那么会出现“群攻多段hit里死一个就停滞的情况”
最合理的方法是把死亡判定移动到回合的层面 而不是单次技能伤害的层面
长名公主玩家群:372588926 攻略娱乐应有尽有
了解更多新RM游戏,游戏制作请加入RPGmaker支援群:113622890
回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
35209
在线时间
4170 小时
注册时间
2007-12-15
帖子
10072
3
 楼主| 发表于 2017-2-9 14:28:26 | 只看该作者
上贺茂润 发表于 2017-2-9 13:15
在VX的横版ATB里有一个很矛盾的设定:
A 如果把死亡设定为“技能动画打完再判定”,那么会出现一些“空血没 ...

移动到回合的层面,如果是半即时还好,出招完毕后立即判定是否死亡。
我印象里面FF6是按照出手的瞬间就判断敌人是否死亡,如果死亡则不允许下个角色进行任何攻击操作,但是敌人会在攻击动画结束后才判定死亡并消失。但是那个战斗时半即时了

如果是回合制的话会出现一个A出手完毕敌人A已经死了,但是B出手全屏动画A虽然死了但是依然会显示有伤害还是不显示伤害?
显示不对因为已经死了 不显示也不对明明图像还没有消失怎么会没伤害
所似乎回合制的,还得在对象方动画结束后判定是否死亡才较为合理
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-12-29 16:42

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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