查看: 2248|回复: 2

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

[复制链接]
梦石
0
星屑
35248
在线时间
4171 小时
注册时间
2007-12-15
回帖
9489
发表于 2017-2-9 11:20:46 | 显示全部楼层 |阅读模式

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

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

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

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

全动画脚本中,出手方动画与对象方动画同时显示
显示动画的时候,如果存在多段攻击,敌人死亡的时间是按照最后一段命中时候计算的,会造成如下效果
01.png
命中方动画未播放完就已经更改不透明度逐渐消失。

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

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

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

反击技脚本如下


[pre lang="ruby"]#==========================================================================
# 本脚本来自www.66RPG.com,由ikki转载。使用请保留此信息
#=========================================================================

# ▼▲▼ XRXS27. 特殊効果 SuperEX「反击」 ver.1.05 ▼▲▼
# by シムナフ, ピニョン

#========================================================================
# □ 自定义设定
#========================================================================
class Game_Battler
  # 反击的状态名
  STATE_COUNTER_NAME = '反击'
end

#========================================================================
# ◇ 说明文档
#=======================================================================
#****Warning! 重新定义了 Game_Actor#skill_can_use? ****

#使用方法
#对于身中“反击”状态的角色,当收到单独的攻击的时候会自动反击
#反击的模式可以在下面设定

#-cr (counter react)下面设定可以反击的挨打设定,
# 比如设定一个状态名为“反击 -crm”,则受到魔法攻击的时候会自动反击
#-crp  (physical)=>遭到通常攻击,物理攻击的时候反击
#-crm  (masic)=>遭到魔法攻击的时候反击
#-cre7 (element)=>遭到属性ID编号为7的攻击的时候反击。

#-ca (counter act)下面设定反击行为
#比如设置一个状态名叫做“反击 -cas19”,那么受到攻击的时候就会用19号特技反击。
#-cas1 (skill)=>使用编号为1的技能
#-cai1 (item)=>使用编号为1的物品。
#-caa  (attack)=>使用物理攻击反击。
#-cae  (escape)=>逃跑,敌人使用

#-cac  (copy)=>受けたスキルをそのまま反击。未テスト(笑
#何もつけない場合は通常攻撃反击になります。(不懂……?@_@?)

#注意和即时战斗的共同使用问题……

#举例:设置一个状态,使得遭遇物理攻击的时候使用物品4,“反击 -crp -cai4”

#========================================================================
# ■ Game_Battler (分割定義 1)
#========================================================================

class Game_Battler
  #-----------------------------------------------------------------------
  # ● オブジェクト初期化
  #-----------------------------------------------------------------------
  def states=(states)
    @states = states
  end
  
  #-----------------------------------------------------------------------
  # ● オブジェクト初期化
  #-----------------------------------------------------------------------
  alias original_initialize_before_counter_action initialize
  def initialize
    original_initialize_before_counter_action()
    @counter_action = Game_BattleAction.new
  end
  
  #-----------------------------------------------------------------------
  # ●
  #-----------------------------------------------------------------------
  alias original_current_action_before_counter_action current_action
  def current_action
      if @counter_action.cleared?
        return original_current_action_before_counter_action()
      else
        return @counter_action
      end
  end

  #-----------------------------------------------------------------------
  # ●
  #-----------------------------------------------------------------------
  def counter_action
    return @counter_action
  end
  #-----------------------------------------------------------------------
  # ●
  #-----------------------------------------------------------------------
  def counter_acting?
    if !@counter_action.cleared?
      return true
    else
      return false
    end
  end
  #-----------------------------------------------------------------------
  # ● 戦闘不能判定
  #-----------------------------------------------------------------------
  #alias original_dead_before_counter_action dead?
  #def dead?
  #  if self.counter_acting?
  #    return false
  #  else
  #    return original_dead_before_counter_action()
  #  end
  #end
  
  #----------------------------------------------------------------------
  # ●
  #----------------------------------------------------------------------
  def counter_action_for(attacker, skill = nil)
    #カウンターからのカウンターは発生しない
    if attacker.counter_acting?
      return
    end
    #動けない場合存在しない場合は発生しない
    #if !self.movable? || !self.exist?
    #  return
    #end
    if attacker.is_a?(Game_Actor)
      if self.is_a?(Game_Actor)#味方からの攻撃はカウンター不可
        return
      end
      ind = $game_party.get_index_by(attacker)
      s_ind = $game_troop.get_index_by(self)
    elsif attacker.is_a?(Game_Enemy)
      if self.is_a?(Game_Enemy)#味方からの攻撃はカウンター不可
        return
      end
      ind = $game_troop.get_index_by(attacker)
      s_ind = $game_party.get_index_by(self)
    end
    if ind.nil? || s_ind.nil?
      return
    end
   
    act_kind = 'a'
    act_id = 0
   
    for id in @states
      if $data_states[id].name =~ /^#{STATE_COUNTER_NAME}/
        react_cond = false
        react_succ = false
        for opt in $data_states[id].options
          if opt =~ /^cr([pmedns])([0-9]*)/
            kind = $1
            id = $2.to_i
            react_cond = true
            case kind
            when 'p'
              if skill.nil? || skill.atk_f >= 100
                react_succ = true
              end
            when 'm'
              if !skill.nil? && skill.int_f >= 100
                react_succ = true
              end
            when 'e'
              if id.nil? || id.zero?
                next
              elsif skill.nil? #武器の攻撃属性
                if attacker.is_a?(Game_Actor) && !$data_weapons[@weapon_id].nil?
                  if $data_weapons[@weapon_id].element_set.include?(id)
                    react_succ = true
                  end
                end
              elsif skill.element_set.include?(id)#スキルの攻撃属性
                react_succ = true
              end

            when 'n'#相手攻撃無効カウンター
              no_attack = true
            when 's'#回避時カウンター
              miss_attack = true
            when 'd'#死亡カウンター
              if self.dead? && self.movable?
                react_succ = true
              end
            end
            
          elsif opt =~ /^ca([asime])([0-9]*)/
            act_kind = $1
            act_id = $2.to_i
            act_cond = true
          end
        end
        
        if (!react_cond || react_succ)#反击条件が無い・もしくは条件に一致
          counter = true#カウンター成功
          break
        else
          next
        end
        
      end
    end
   
    if !counter#カウンター成功していなかった場合
      return
    end


    # 相手攻撃無効カウンターありならダメージ戻し
    if no_attack == true
      if self.damage != "被对手闪开了!"
        self.hp += self.damage
        self.damage = "反击!!"
        self.critical = false
        @state_changed = false
        self.states = @old_states
      end
    end

    # 回避時カウンターありでミスじゃないときはさよなら
    if miss_attack == true and self.damage != "被对手闪开了!"
      return
    end


    if act_kind == 'c'
      if skill.nil?
        act_kind = 'a'
      else
        act_kind = 's'
        act_id = skill.id
      end
    end
   
    case act_kind
    when 's'#skill kind:1 basic0
      s = $data_skills[act_id]
      if s.nil? || ![0,1].include?(s.occasion) || !self.skill_can_use?(act_id)
        return
      end
      self.counter_action.skill_id = act_id
      self.counter_action.kind = 1
      if [1,2].include?(s.scope)#1,2で敵単体、敵全体。
        self.counter_action.target_index = ind
      else
        self.counter_action.target_index = s_ind
      end
    when 'i'#item kind:2 basic:0
      i = $data_items[act_id]
      if !self.is_a?(Game_Actor) || i.nil? || ![0,1].include?(i.occasion) || !$game_party.item_can_use?(act_id)
        return
      end
      self.counter_action.item_id = act_id
      self.counter_action.kind = 2
      if [1,2].include?(i.scope)#1,2で敵単体、敵全体。
        self.counter_action.target_index = ind
      else
        self.counter_action.target_index = s_ind
      end
    when 'a'#通常攻撃 kind:0 basic:0
      self.counter_action.kind = 0
      self.counter_action.target_index = ind
      self.counter_action.basic = 0
    when 'e'#escape kind:0 basic:2
      if !self.is_a?(Game_Enemy)
        return
      end
      self.counter_action.kind = 0
      self.counter_action.target_index = ind
      self.counter_action.basic = 2      
    end
    return
   
  end
  
  #----------------------------------------------------------------------
  # ● 通常攻撃の効果適用
  #     attacker : 攻撃者 (バトラー)
  #----------------------------------------------------------------------
  alias original_attack_effect_before_counter_action attack_effect
  def attack_effect(attacker)
    @old_states = self.states.clone
    val = original_attack_effect_before_counter_action(attacker)
    self.counter_action_for(attacker)
    return val
  end  
  
  #----------------------------------------------------------------------
  # ● スキルの効果適用
  #     user  : スキルの使用者 (バトラー)
  #     skill : スキル
  #----------------------------------------------------------------------
  alias original_skill_effect_before_counter_action skill_effect
  def skill_effect(attacker, skill)
    @old_states = self.states.clone
    val = original_skill_effect_before_counter_action(attacker, skill)
    self.counter_action_for(attacker, skill)
    return val
  end
  
end

#=======================================================================
# ■ Game_Actor
#--------------------------------------------------------------------------
#  アクターを扱うクラスです。このクラスは Game_Actors クラス ($game_actors)
# の内部で使用され、Game_Party クラス ($game_party) からも参照されます。
#=======================================================================

class Game_Actor < Game_Battler
  #----------------------------------------------------------------------
  # ● スキルの使用可能判定
  #     skill_id : スキル ID
  #----------------------------------------------------------------------
  def skill_can_use?(skill_id)
    #if not skill_learn?(skill_id)
    #  return false
    #end
    return super
  end
end

#========================================================================
# ■ Game_BattleAction
#-------------------------------------------------------------------------
#  アクション (戦闘中の行動) を扱うクラスです。このクラスは Game_Battler クラ
# スの内部で使用されます。
#========================================================================

class Game_BattleAction
  
  alias :xp_original_initialize :initialize
  def initialize
    xp_original_initialize()
    @turn_move_times = 0
  end
  #-----------------------------------------------------------------------
  # ● クリア判定
  #-----------------------------------------------------------------------
  def cleared?
    if @speed == 0 && @kind == 0 && @basic == 3 && @skill_id == 0 && @item_id == 0 && @target_index == -1 && @forcing == false
      return true
    else
      return false
    end
  end
  
end


#=========================================================================
# ■ Game_Party
#--------------------------------------------------------------------------
#  パーティを扱うクラスです。ゴールドやアイテムなどの情報が含まれます。このク
# ラスのインスタンスは $game_party で参照されます。
#=========================================================================

class Game_Party
  #----------------------------------------------------------------------
  # ●
  #----------------------------------------------------------------------
  def get_index_by(actor)
    for i in 0...@actors.size()
      if @actors.equal?(actor)
        return i
      end
    end
    return nil
  end
end


#==========================================================================
# ■ Game_Troop
#--------------------------------------------------------------------------
#  トループを扱うクラスです。このクラスのインスタンスは $game_troop で参照さ
# れます。
#==========================================================================

class Game_Troop
  #----------------------------------------------------------------------
  # ●
  #----------------------------------------------------------------------
  def get_index_by(enemy)
    for i in 0...@enemies.size()
      if @enemies.equal?(enemy)
        return i
      end
    end
    return nil
  end
end

#==========================================================================
# ■ Scene_Battle (分割定義 4)
#--------------------------------------------------------------------------
#  バトル画面の処理を行うクラスです。
#==========================================================================

class Scene_Battle
  
  #----------------------------------------------------------------------
  # ● フレーム更新 (メインフェーズ ステップ 6 : リフレッシュ)
  #----------------------------------------------------------------------
  alias original_update_phase4_step6_before_counter_action update_phase4_step6
  def update_phase4_step6
    original_update_phase4_step6_before_counter_action()
    clear_counter_action(@active_battler)
    activate_counter_action(@action_battlers)
  end
  #----------------------------------------------------------------------
  #
  #----------------------------------------------------------------------
  def clear_counter_action(active_battler)
    #既にカウンターを行ったバトラーのカウンターアクションをクリア
    if active_battler.nil?
      return
    end
    if !active_battler.counter_acting?
      return
    end
    active_battler.counter_action.clear
    return
  end
  #----------------------------------------------------------------------
  #
  #----------------------------------------------------------------------
  def activate_counter_action(action_battlers)   
    #カウンター状態になったバトラーを一回だけアクションバトラーズにアンシフト
    if !action_battlers[0].nil?
      if action_battlers[0].counter_acting?#既にカウンター行動待機バトラーが居た場合
        return
      end
    end
    counter_battlers = []
    $game_party.actors.each{|a|
      if a.counter_acting?
        counter_battlers.push(a)
      end
    }
    $game_troop.enemies.each{|e|
      if e.counter_acting?
        counter_battlers.push(e)
      end
    }
    counter_battlers = counter_battlers.sort_by{|b| b.agi}
    counter_battlers.each{ |b|
      action_battlers.unshift(b)
    }
    #p action_battlers.collect{|b| b.name}
    return
  end
end


#=============================
#CPバトル対応。
#ターンバトルの人は必要なし。
#=============================
class Game_Battler
  if method_defined?(:cp)
    alias original_cp_before_counter_action cp
    def cp
      if self.counter_acting?
        return 65535
      else
        return original_cp_before_counter_action()
      end
    end
  end
  if method_defined?(:cp=)
    alias original_cp_before_counter_action= cp=
    def cp=(n)
      if self.counter_acting?
        return
      else
        self.original_cp_before_counter_action = n
      end
    end
  end
end
#=============================
#ここまで。
#=============================


  #---------------------------------------------------------------------
  #
  #---------------------------------------------------------------------

module RPG
  class State
    def name
      if @new_name.nil?
        name_setting()
      end
      return @new_name
    end
   
    def options
      if @options.nil?
        name_setting()
      end
      return @options
    end
   
    def name_setting
      names = @name.split(/ +-/)
      @new_name = names.shift
      if @new_name.nil?
        @new_name = ''
      end
      @options = names
      if @options.nil?
        @options = []
      end
    end
   
  end
end
[/pre]

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

使用道具 举报

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

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

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

使用道具 举报

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

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部