查看: 2319|回复: 4

[已经解决] 怎么实现当角色死亡时自动离队

[复制链接]
梦石
0
星屑
5474
在线时间
1668 小时
注册时间
2016-8-1
回帖
376
发表于 2018-2-9 18:22:57 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 穿越时空之剑 于 2018-2-9 19:08 编辑

我倒是找到了一个角色死亡后执行公共事件的脚本,但是只在战斗画面有效…求教怎么实现在地图画面上角色死亡时也能自动离队。(就是当角色被附加无法战斗状态时,角色自动离队)
阳光下的真实
梦石
0
星屑
5474
在线时间
1668 小时
注册时间
2016-8-1
回帖
376
 楼主| 发表于 2018-2-9 18:40:51 | 显示全部楼层
这是脚本
死亡公共事件脚本#==============================================================================
#
# ▼ Yanfly Engine Ace - 死亡公共事件 v1.01
# -- 最后更新: 2012.02.03
# -- 使用难度: 普通
# -- 需要脚本: 无
#
#==============================================================================

$imported = {} if $imported.nil?
$imported["YEA-DeathCommonEvents"] = true

#==============================================================================
# ▼ Updates
# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
# 2012.02.03 - New Feature: Wipe Out Event constant added.
# 2012.01.24 - Started Script and Finished.
#
#==============================================================================
# ▼ 介绍
# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
# 本脚本可以在某角色/职业/敌人死亡后触发一个公共事件并显示倒下效果。公共事件会在
# 目标死亡后立即触发,而不是等到剩下角色/敌人的动作全部完成时才触发。
#
#==============================================================================
# ▼ 安装方式
# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
# 打开脚本编辑器,将本脚本拷贝/复制到一个在▼ 插件脚本之下▼ Main之上的新
# 脚本页/槽中.记得保存你的工程以使脚本生效.
#
# -----------------------------------------------------------------------------
# 角色备注 - 在数据库-角色中可以使用的备注.
# -----------------------------------------------------------------------------
# <死亡事件: x>
# 该角色死亡后触发x号公共事件.备注的优先级:角色 > 职业
#
# -----------------------------------------------------------------------------
# 职业备注 - 在数据库-职业中可以使用的备注.
# -----------------------------------------------------------------------------
# <死亡事件: x>
# 该职业死亡后触发x号公共事件.备注的优先级:角色 > 职业
#
# -----------------------------------------------------------------------------
# 敌人备注 - 在数据库-敌人中可以使用的备注.
# -----------------------------------------------------------------------------
# <死亡事件: x>
# 该敌人死亡后触发x号公共事件.
#
#==============================================================================
# ▼ 兼容性
# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
# 本脚本仅为RPG Maker VX Ace编写.极不可能在无任何修改的情况下运行于RPG Maker VX.
#
#==============================================================================

module YEA
  module DEATH_EVENTS
   
    #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
    # - 队伍死亡公共事件 -
    #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
    # 全部队伍成员无法战斗后触发的公共事件,若你不想使用此功能,设定为0就好.
    #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
    WIPE_OUT_EVENT = 0
   
  end # DEATH_EVENTS
end # YEA

#==============================================================================
# ▼ 编辑以下内容可能会出现电脑损坏、死机,电脑主人脑袋爆炸、昏迷、死亡或口臭
# 所以编辑了后果自负。
#==============================================================================

module YEA
  module REGEXP
  module BASEITEM
   
    DEATH_EVENT = /<(?:DEATH_EVENT|死亡事件):[ ](\d+)>/i
   
  end # BASEITEM
  end # REGEXP
end # YEA

#==============================================================================
# ■ DataManager
#==============================================================================

module DataManager
  
  #--------------------------------------------------------------------------
  # alias method: load_database
  #--------------------------------------------------------------------------
  class <<self; alias load_database_dce load_database; end
  def self.load_database
    load_database_dce
    load_notetags_dce
  end
  
  #--------------------------------------------------------------------------
  # new method: load_notetags_dce
  #--------------------------------------------------------------------------
  def self.load_notetags_dce
    groups = [$data_actors, $data_classes, $data_enemies]
    for group in groups
      for obj in group
        next if obj.nil?
        obj.load_notetags_dce
      end
    end
  end
  
end # DataManager

#==============================================================================
# ■ BattleManager
#==============================================================================

module BattleManager
  
  #--------------------------------------------------------------------------
  # alias method: load_database
  #--------------------------------------------------------------------------
  class <<self; alias process_defeat_dce process_defeat; end
  def self.process_defeat
    if SceneManager.scene_is?(Scene_Battle)
      SceneManager.scene.process_party_wipe_event
    end
    return unless $game_party.all_dead?
    process_defeat_dce
  end
  
end # BattleManager

#==============================================================================
# ■ RPG::BaseItem
#==============================================================================

class RPG::BaseItem
  
  #--------------------------------------------------------------------------
  # public instance variables
  #--------------------------------------------------------------------------
  attr_accessor :death_event_id
  
  #--------------------------------------------------------------------------
  # common cache: load_notetags_dce
  #--------------------------------------------------------------------------
  def load_notetags_dce
    @death_event_id = 0
    #---
    self.note.split(/[\r\n]+/).each { |line|
      case line
      #---
      when YEA::REGEXP::BASEITEM::DEATH_EVENT
        @death_event_id = $1.to_i
      #---
      end
    } # self.note.split
    #---
  end
  
end # RPG::BaseItem

#==============================================================================
# ■ Game_Battler
#==============================================================================

class Game_Battler < Game_BattlerBase
  
  #--------------------------------------------------------------------------
  # new method: death_event_id
  #--------------------------------------------------------------------------
  def death_event_id
    return 0
  end
  
end # Game_Battler

#==============================================================================
# ■ Game_Actor
#==============================================================================

class Game_Actor < Game_Battler
  
  #--------------------------------------------------------------------------
  # new method: death_event_id
  #--------------------------------------------------------------------------
  def death_event_id
    return self.actor.death_event_id unless self.actor.death_event_id == 0
    return self.class.death_event_id
  end
  
  #--------------------------------------------------------------------------
  # alias method: perform_collapse_effect
  #--------------------------------------------------------------------------
  alias game_actor_perform_collapse_effect_dce perform_collapse_effect
  def perform_collapse_effect
    game_actor_perform_collapse_effect_dce
    return unless SceneManager.scene_is?(Scene_Battle)
    SceneManager.scene.process_death_event(self)
  end
  
end # Game_Actor

#==============================================================================
# ■ Game_Enemy
#==============================================================================

class Game_Enemy < Game_Battler
  
  #--------------------------------------------------------------------------
  # new method: death_event_id
  #--------------------------------------------------------------------------
  def death_event_id
    if $imported["YEA-Doppelganger"] && !self.class.nil?
      return self.class.death_event_id unless self.class.death_event_id == 0
    end
    return self.enemy.death_event_id
  end
  
  #--------------------------------------------------------------------------
  # alias method: perform_collapse_effect
  #--------------------------------------------------------------------------
  alias game_enemy_perform_collapse_effect_dce perform_collapse_effect
  def perform_collapse_effect
    game_enemy_perform_collapse_effect_dce
    return unless SceneManager.scene_is?(Scene_Battle)
    SceneManager.scene.process_death_event(self)
  end
  
end # Game_Enemy

#==============================================================================
# ■ Scene_Battle
#==============================================================================

class Scene_Battle < Scene_Base
  
  #--------------------------------------------------------------------------
  # new method: process_death_event
  #--------------------------------------------------------------------------
  def process_death_event(target)
    return unless target.dead?
    return if target.death_event_id == 0
    $game_temp.reserve_common_event(target.death_event_id)
    process_death_common_event
  end
  
  #--------------------------------------------------------------------------
  # new method: process_party_wipe_event
  #--------------------------------------------------------------------------
  def process_party_wipe_event
    return unless $game_party.all_dead?
    return if YEA::DEATH_EVENTS::WIPE_OUT_EVENT <= 0
    $game_temp.reserve_common_event(YEA::DEATH_EVENTS::WIPE_OUT_EVENT)
    process_death_common_event
  end
  
  #--------------------------------------------------------------------------
  # new method: process_death_common_event
  #--------------------------------------------------------------------------
  def process_death_common_event
    while !scene_changing?
      $game_troop.interpreter.update
      $game_troop.setup_battle_event
      wait_for_message
      wait_for_effect if $game_troop.all_dead?
      process_forced_action
      break unless $game_troop.interpreter.running?
      update_for_wait
    end
  end
  
end # Scene_Battle

#==============================================================================
#
# ▼ End of File
#
#==============================================================================

或者是我数据库设置的有问题?
图片 1.png 2.png

阳光下的真实
回复

使用道具 举报

梦石
0
星屑
9292
在线时间
2504 小时
注册时间
2011-5-20
回帖
14521

开拓者

发表于 2018-2-9 23:36:11 | 显示全部楼层
本帖最后由 chd114 于 2018-2-9 23:47 编辑

可以從Game_BattlerBase入手

  1.   #--------------------------------------------------------------------------
  2.   # ● 更改 HP
  3.   #--------------------------------------------------------------------------
  4.   def hp=(hp)
  5.     @hp = hp
  6.     refresh
  7.   end
复制代码

在這裡面判定hp是否扣光並且是角色
如果是角色就可以$game_party.remove_actor(self.id)

這樣的話改成

  1.   #--------------------------------------------------------------------------
  2.   # ● 更改 HP
  3.   #--------------------------------------------------------------------------
  4.   def hp=(hp)
  5.     @hp = hp
  6.     $game_party.remove_actor(id) if actor? and hp<=0
  7.     refresh
  8.   end
复制代码

就可以了


注意,在地图上通过事件指令减少生命时,需要把【允许导致无法战斗】勾选

评分

参与人数 1赞 +1 收起 理由
穿越时空之剑 + 1 谢谢

查看全部评分

[img]http://service.t.sina.com.cn/widget/qmd/5339802982/c02e16bd/7.png
回复

使用道具 举报

梦石
0
星屑
5474
在线时间
1668 小时
注册时间
2016-8-1
回帖
376
 楼主| 发表于 2018-2-10 00:48:13 | 显示全部楼层
感谢chd114的帮助,最终我照猫画虎从Game_Battler中附加新的状态入手,如果被附加的状态是无法战斗状态并且被附加状态的是角色时,角色离队。这样结合脚本死亡公共事件的话无论是战斗中还是地图中角色死亡都可以自动离队了。
  1.   #--------------------------------------------------------------------------
  2.   # ● 附加新的状态
  3.   #--------------------------------------------------------------------------
  4.   def add_new_state(state_id)
  5.     $game_party.remove_actor(id) if actor? and state_id == death_state_id
  6.     @states.push(state_id)
  7.     on_restrict if restriction > 0
  8.     sort_states
  9.     refresh
  10.   end
复制代码

点评

刚才发现全灭时会有bug,不会出现GAMEOVER画面,游戏也无法进行。也许应该使用unless限制一下主角不能离队…  发表于 2018-2-10 00:59
阳光下的真实
回复

使用道具 举报

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

本版积分规则

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

在本版发帖返回顶部