查看: 2283|回复: 10

[已经解决] 如何修改脚本使在地图画面角色死亡后更换行走图?

[复制链接]
梦石
0
星屑
125
在线时间
171 小时
注册时间
2014-4-14
回帖
135
发表于 2016-8-19 09:45:18 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 2357691704 于 2016-8-19 10:26 编辑

用了人物跟随。求脚本:地图画面角色死亡后更换行走图。
当 角色 hp<= 0时更换为尸体行走图,else还原行走图。貌似要在Sprite_Character修改,但我弄了很久还是不会,求大神帮助。

点评

这种时候不把跟随脚本顺便贴出来咩……  发表于 2016-8-19 12:45
Vanyogin
梦石
0
星屑
125
在线时间
171 小时
注册时间
2014-4-14
回帖
135
 楼主| 发表于 2016-8-19 13:40:05 | 显示全部楼层
与跟随脚本无关。我说明用了跟随脚本是表明必要性,如果没用跟随脚本的话,根本不需要更换角色行走图,只需要跟换领队就行了。
Vanyogin
回复

使用道具 举报

梦石
0
星屑
9716
在线时间
2775 小时
注册时间
2008-9-5
回帖
3458

开拓者短篇八RM组冠军短篇九导演组亚军白银编剧

发表于 2016-8-19 15:05:57 | 显示全部楼层
本帖最后由 cinderelmini 于 2016-8-19 16:59 编辑
2357691704 发表于 2016-8-19 13:40
与跟随脚本无关。我说明用了跟随脚本是表明必要性,如果没用跟随脚本的话,根本不需要更换角色行走图,只需 ...


正因如此才需要跟随脚本的内容来确认里面用了哪个类作为队友的Character对象,以此来修改行走图名字,
进而Sprite_Character会自己根据Character的行走图名字更改图像而没必要去黑这个类。
【以下是更改领队死亡时行走图的做法】

  1. class Game_Player < Game_Character
  2.   alias sny46_160819_refresh refresh
  3.   alias sny46_160819_update update
  4.   def leader
  5.     return $game_party.actors[0]
  6.   end
  7.   def check_dead_refresh
  8.     return if @dead_flag == leader.dead?
  9.     @character_name = leader.character_name + (leader.dead? ? "_Dead" : "")
  10.     @character_hue = leader.character_hue
  11.     @dead_flag = leader.dead?
  12.   end
  13.   def refresh
  14.     sny46_160819_refresh
  15.     check_dead_refresh
  16.   end
  17.   def update
  18.     sny46_160819_update
  19.     check_dead_refresh
  20.   end
  21. end
复制代码


【以下这部分是队友的】
  1. module Train_Actor
  2.   class Game_Party_Actor < Game_Character
  3.     alias sny46_160819_ta_setup setup
  4.     def setup(actor)
  5.       sny46_160819_ta_setup(actor)
  6.       @actor = actor
  7.       if @actor and @origin_character_name.nil?
  8.         @origin_character_name = @actor.character_name
  9.       end
  10.       check_dead_refresh
  11.     end
  12.     def check_dead_refresh
  13.       if @actor
  14.         return if @dead_flag == @actor.dead?
  15.         character_name = @origin_character_name + (@actor.dead? ? "_Dead" : "")
  16.         @actor.set_graphic(character_name, @actor.character_hue, @actor.battler_name, @actor.battler_hue)
  17.         @tempneme = @actor.name
  18.         @dead_flag = @actor.dead?
  19.       else
  20.         @character_name = ""
  21.         @character_hue = 0
  22.         @tempneme = ""
  23.       end
  24.     end
  25.     alias sny46_160819_ta_update update
  26.     def update
  27.       sny46_160819_ta_update
  28.       check_dead_refresh
  29.     end
  30.   end
  31. end
复制代码

点评

太感谢了,你辛苦了。谢谢帮忙。  发表于 2016-8-19 17:29

评分

参与人数 1梦石 +1 收起 理由
RyanBern + 1 认可答案

查看全部评分

回复

使用道具 举报

梦石
0
星屑
125
在线时间
171 小时
注册时间
2014-4-14
回帖
135
 楼主| 发表于 2016-8-19 15:53:51 | 显示全部楼层
cinderelmini 发表于 2016-8-19 15:05
正因如此才需要跟随脚本的内容来确认里面用了哪个类作为队友的Character对象,以此来修改行走图名字,
进 ...

好像我表达得不好呢,我要的是任何同伴死亡都会更改行走图。不过还是谢谢了。

点评

所以才说需要队员跟随脚本来确认在相应的地方修改一下代码……………………………………  发表于 2016-8-19 15:54
Vanyogin
回复

使用道具 举报

梦石
0
星屑
125
在线时间
171 小时
注册时间
2014-4-14
回帖
135
 楼主| 发表于 2016-8-19 16:02:37 | 显示全部楼层
cinderelmini 发表于 2016-8-19 15:05
正因如此才需要跟随脚本的内容来确认里面用了哪个类作为队友的Character对象,以此来修改行走图名字,
进 ...

这是我用的人物跟随脚本。
[pre lang="ruby"]#===================================================================
# 本脚本来自www.66RPG.com,使用和转载请保留此信息
#===================================================================
# ————————————————————————————————————
#人物跟随
module Train_Actor
  #是否使用停止跟随的方法,也就是说,这里false改为true的时候,如果TRANSPARENT_SWITCHES_INDEX
  #开关打开,跟随的人物就消失了(其实只是变成透明而已)
  TRANSPARENT_SWITCH = false
  TRANSPARENT_SWITCHES_INDEX = 20
  #举例:第一个为true,第二个为20,则打开20号开关,后面的人都没了。
  #跟随人数的最大数目,可以更改为2、3什么的。
  TRAIN_ACTOR_SIZE_MAX = 4
  # 定数
  DOWN_LEFT = 1
  DOWN_RIGHT = 3
  UP_LEFT = 7
  UP_RIGHT = 9
  JUMP = 5
  
  class Game_Party_Actor < Game_Character
    def initialize
        super()
        @through = true
    end
      
    def setup(actor)
        #角色的文件名称和色相设定
        if actor != nil
           @character_name = actor.character_name
           @character_hue = actor.character_hue
           @tempneme = actor.name           
        else
           @character_name = ""
           @character_hue = 0
           @tempneme = ""      
        end
        #透明度和合成方法,初始化
        @opacity = 255
        @blend_type = 0
    end

    def screen_z(height = 0)
        if $game_player.x == @x and $game_player.y == @y
           return $game_player.screen_z(height) - 1
        end
        super(height)
    end
   
    def name
        return @tempneme
    end
   
    #--------------------------------------------------------------------------
    # ● 下に移動
    # turn_enabled : 当场的方向变更许可的旗帜
    #--------------------------------------------------------------------------
    def move_down(turn_enabled = true)
        # 下を向く
        if turn_enabled
           turn_down
        end
        # 通行可能な場合
        if passable?(@x, @y, Input::DOWN)
           # 下を向く
           turn_down
           # 座標を更新
           @y += 1
        end
    end
#--------------------------------------------------------------------------
# ● 左に移動
# turn_enabled : 当场的方向变更许可的旗帜
#--------------------------------------------------------------------------
def move_left(turn_enabled = true)
# 左を向く
if turn_enabled
turn_left
end
# 通行可能な場合
if passable?(@x, @y, Input::LEFT)
# 左を向く
turn_left
# 座標を更新
@x -= 1
end
end
#--------------------------------------------------------------------------
# ● 右に移動
# turn_enabled : 当场的方向变更许可的旗帜
#--------------------------------------------------------------------------
def move_right(turn_enabled = true)
# 右を向く
if turn_enabled
turn_right
end
# 通行可能な場合
if passable?(@x, @y, Input::RIGHT)
# 右を向く
turn_right
# 座標を更新
@x += 1
end
end
#--------------------------------------------------------------------------
# ● 上に移動
# turn_enabled : 当场的方向变更许可的旗帜
#--------------------------------------------------------------------------
def move_up(turn_enabled = true)
# 上を向く
if turn_enabled
turn_up
end
# 通行可能な場合
if passable?(@x, @y, Input::UP)
# 上を向く
turn_up
# 座標を更新
@y -= 1
end
end
##############################
attr_writer :move_speed
attr_writer :step_anime
end
module Spriteset_Map_Module
def setup_actor_character_sprites?
return @setup_actor_character_sprites_flag != nil
end
def setup_actor_character_sprites(characters)
if !setup_actor_character_sprites?
index_game_player = 0
@character_sprites.each_index do |i|
if @character_sprites.character.instance_of?(Game_Player)
index_game_player = i
break
end
end
for character in characters.reverse
@character_sprites.unshift(
Sprite_Character.new(@viewport1, character)
)
end
@setup_actor_character_sprites_flag = true
end
end
end
module Scene_Map_Module
def setup_actor_character_sprites(characters)
@spriteset.setup_actor_character_sprites(characters)
end
end
module Game_Party_Module
def set_transparent_actors(transparent)
@transparent = transparent
end
def setup_actor_character_sprites
if @characters == nil
@characters = []
for i in 1 ... TRAIN_ACTOR_SIZE_MAX
@characters.push(Game_Party_Actor.new)
end
end
for i in 1 ... TRAIN_ACTOR_SIZE_MAX
@characters[i - 1].setup(actors)
end
if $scene.class.method_defined?('setup_actor_character_sprites')
$scene.setup_actor_character_sprites(@characters)
end
end
def update_party_actors
setup_actor_character_sprites
transparent = $game_player.transparent
if transparent == false
if TRANSPARENT_SWITCH
transparent = $game_switches[TRANSPARENT_SWITCHES_INDEX]
end
end
for character in @characters
character.transparent = transparent
character.move_speed = $game_player.move_speed
character.step_anime = $game_player.step_anime
character.update
end
end
def moveto_party_actors( x, y )
setup_actor_character_sprites
for character in @characters
character.moveto( x, y )
end
if @move_list == nil
@move_list = []
end
move_list_setup
end
def move_party_actors
if @move_list == nil
@move_list = []
move_list_setup
end
@move_list.each_index do |i|
if @characters != nil
case @move_list.type
when Input::DOWN
@characters.move_down(@move_list.args[0])
when Input::LEFT
@characters.move_left(@move_list.args[0])
when Input::RIGHT
@characters.move_right(@move_list.args[0])
when Input::UP
@characters.move_up(@move_list.args[0])
when JUMP
@characters.jump(@move_list.args[0],@move_list.args[1])
end
end
end
end
class Move_List_Element
def initialize(type,args)
@type = type
@args = args
end
def type() return @type end
def args() return @args end
end
def move_list_setup
for i in 0 .. TRAIN_ACTOR_SIZE_MAX
@move_list = nil
end
end
def add_move_list(type,*args)
@move_list.unshift(Move_List_Element.new(type,args)).pop
end
def move_down_party_actors(turn_enabled = true)
move_party_actors
add_move_list(Input::DOWN,turn_enabled)
end
def move_left_party_actors(turn_enabled = true)
move_party_actors
add_move_list(Input::LEFT,turn_enabled)
end
def move_right_party_actors(turn_enabled = true)
move_party_actors
add_move_list(Input::RIGHT,turn_enabled)
end
def move_up_party_actors(turn_enabled = true)
move_party_actors
add_move_list(Input::UP,turn_enabled)
end
def jump_party_actors(x_plus, y_plus)
move_party_actors
add_move_list(JUMP,x_plus, y_plus)
end
end
module Game_Player_Module
def update
$game_party.update_party_actors
super
end
def moveto( x, y )
$game_party.moveto_party_actors( x, y )
super( x, y )
end
def move_down(turn_enabled = true)
if passable?(@x, @y, Input::DOWN)
$game_party.move_down_party_actors(turn_enabled)
end
super(turn_enabled)
end
def move_left(turn_enabled = true)
if passable?(@x, @y, Input::LEFT)
$game_party.move_left_party_actors(turn_enabled)
end
super(turn_enabled)
end
def move_right(turn_enabled = true)
if passable?(@x, @y, Input::RIGHT)
$game_party.move_right_party_actors(turn_enabled)
end
super(turn_enabled)
end
def move_up(turn_enabled = true)
if passable?(@x, @y, Input::UP)
$game_party.move_up_party_actors(turn_enabled)
end
super(turn_enabled)
end
def move_lower_left
# 下→左、左→下 一方通行的路线可能的情况
if (passable?(@x, @y, Input::DOWN) and passable?(@x, @y + 1, Input::LEFT)) or
(passable?(@x, @y, Input::LEFT) and passable?(@x - 1, @y, Input::DOWN))
$game_party.move_lower_left_party_actors
end
super
end
def move_lower_right
# 下→右、右→下 一方通行的路线可能的情况
if (passable?(@x, @y, Input::DOWN) and passable?(@x, @y + 1, Input::RIGHT)) or
(passable?(@x, @y, Input::RIGHT) and passable?(@x + 1, @y, Input::DOWN))
$game_party.move_lower_right_party_actors
end
super
end
def move_upper_left
# 上→左、左→上 一方通行的路线可能的情况
if (passable?(@x, @y, Input::UP) and passable?(@x, @y - 1, Input::LEFT)) or
(passable?(@x, @y, Input::LEFT) and passable?(@x - 1, @y, Input::UP))
$game_party.move_upper_left_party_actors
end
super
end
def move_upper_right
# 上→右、右→上 一方通行的路线可能的情况
if (passable?(@x, @y, Input::UP) and passable?(@x, @y - 1, Input::RIGHT)) or
(passable?(@x, @y, Input::RIGHT) and passable?(@x + 1, @y, Input::UP))
$game_party.move_upper_right_party_actors
end
super
end
def jump(x_plus, y_plus)
#新坐标计算
new_x = @x + x_plus
new_y = @y + y_plus
#算值(0,0)的情况,先有跳跃通行的情况
if (x_plus == 0 and y_plus == 0) or passable?(new_x, new_y, 0)
$game_party.jump_party_actors(x_plus, y_plus)
end
super(x_plus, y_plus)
end
attr_reader :move_speed
attr_reader :step_anime
end
end
# module Train_Actor
class Game_Party
include Train_Actor::Game_Party_Module
end
class Game_Player
include Train_Actor::Game_Player_Module
end
class Spriteset_Map
include Train_Actor::Spriteset_Map_Module
end
class Scene_Map
include Train_Actor::Scene_Map_Module
end

#==================================================================
# 本脚本来自www.66RPG.com,使用和转载请保留此信息
#==================================================================
[/pre]


我觉得要修改Sprite_Character的原因是因为我用的战斗死亡更改死亡战斗图就是修改Sprite_battler的
[pre lang="ruby"]#==============================================================================
# ■ Sprite_Battler
#------------------------------------------------------------------------------
#  战斗显示用活动块。Game_Battler 类的实例监视、
# 活动块的状态的监视。
#==============================================================================

class Sprite_Battler < RPG::Sprite
  #--------------------------------------------------------------------------
  # ● 定义实例变量
  #--------------------------------------------------------------------------
  attr_accessor :battler                  # 战斗者
  #--------------------------------------------------------------------------
  # ● 初始化对像
  #     viewport : 显示端口
  #     battler  : 战斗者 (Game_Battler)
  #--------------------------------------------------------------------------
  def initialize(viewport, battler = nil)
    super(viewport)
    @battler = battler
    @battler_visible = false
  end
  #--------------------------------------------------------------------------
  # ● 释放
  #--------------------------------------------------------------------------
  def dispose
    if self.bitmap != nil
      self.bitmap.dispose
    end
    super
  end
  #--------------------------------------------------------------------------
  # ● 刷新画面
  #--------------------------------------------------------------------------
  def update
    super
    # 战斗者为 nil 的情况下
    if @battler == nil
      self.bitmap = nil
      loop_animation(nil)
      return
    end
    # 文件名和色相与当前情况有差异的情况下
    if (@battler.battler_name != @battler_name or
       @battler.battler_hue != @battler_hue)
      # 获取、设置位图
      @battler_name = @battler.battler_name
      @battler_hue = @battler.battler_hue
      self.bitmap = RPG::Cache.battler(@battler_name, @battler_hue)
      @width = bitmap.width
      @height = bitmap.height
      self.ox = @width / 2
      self.oy = @height
  ###########################################################################
      if @battler.dead?
        #更改角色战斗图为死亡战斗图
        self.bitmap = RPG::Cache.battler(@battler.id.to_s + "死亡", @battler_hue)
        @width = bitmap.width
        @height = bitmap.height
        self.ox = @width / 2
        self.oy = @height
      # 如果是战斗不能或者是隐藏状态就把透明度设置成 0
      if (@battler.dead? or @battler.hidden) and @battler.is_a?(Game_Enemy)
        self.opacity = 0
      end
    end
  end
  ############################################################################
    # 动画 ID 与当前的情况有差异的情况下
    if @battler.damage == nil and
       @battler.state_animation_id != @state_animation_id
      @state_animation_id = @battler.state_animation_id
      loop_animation($data_animations[@state_animation_id])
    end
    # 应该被显示的角色的情况下
    if @battler.is_a?(Game_Actor) and @battler_visible
      # 不是主状态的时候稍稍降低点透明度
      if $game_temp.battle_main_phase
        self.opacity += 3 if self.opacity < 255
      else
        self.opacity -= 3 if self.opacity > 207
      end
    end
    # 明灭
    if @battler.blink
      blink_on
    else
      blink_off
    end
    # 不可见的情况下
    unless @battler_visible
      # 出现
      if not @battler.hidden and not @battler.dead? and
  ###########################################################################
         (@battler.damage == nil or @battler.damage_pop)
        if @battler.is_a?(Game_Enemy)
          appear
        else
          ########还原战斗图########
          self.bitmap = RPG::Cache.battler(@battler_name, @battler_hue)
          @width = bitmap.width
          @height = bitmap.height
          self.ox = @width / 2
          self.oy = @height
        end
        @battler_visible = true
      end
    end
    ##########################################################################
    # 可见的情况下
    if @battler_visible
      # 逃跑
      if @battler.hidden
        $game_system.se_play($data_system.escape_se)
        escape
        @battler_visible = false
      end
      # 白色闪烁
      if @battler.white_flash
        whiten
        @battler.white_flash = false
      end
      # 动画
      if @battler.animation_id != 0
        animation = $data_animations[@battler.animation_id]
        animation(animation, @battler.animation_hit)
        @battler.animation_id = 0
      end
      # 伤害
      if @battler.damage_pop
        damage(@battler.damage, @battler.critical)
        @battler.damage = nil
        @battler.critical = false
        @battler.damage_pop = false
      end
  ###########################################################################
      # korapusu
      if @battler.damage == nil and @battler.dead?
        if @battler.is_a?(Game_Enemy)
          $game_system.se_play($data_system.enemy_collapse_se)
          collapse
        else
          $game_system.se_play($data_system.actor_collapse_se)
          # 角色战斗图变为死亡战斗图
          self.bitmap = RPG::Cache.battler(@battler.id.to_s + "死亡", @battler_hue)
          @width = bitmap.width
          @height = bitmap.height
          self.ox = @width / 2
          self.oy = @height
        end
        @battler_visible = false
      end
    end
    #########################################################################
    # 设置活动块的坐标
    self.x = @battler.screen_x
    self.y = @battler.screen_y
    self.z = @battler.screen_z
  end
end
[/pre]

点评

在Sprite_Character里改不是不可以,但是update部分的代码必须要重构,如此一来兼容性的问题很大。  发表于 2016-8-19 16:56
3L的代码已经更新,Main前或者放在队友系统的下面都可以。  发表于 2016-8-19 16:55
Vanyogin
回复

使用道具 举报

梦石
0
星屑
50
在线时间
19 小时
注册时间
2016-6-14
回帖
4
发表于 2017-7-6 11:33:02 | 显示全部楼层
cinderelmini 发表于 2016-8-19 15:05
正因如此才需要跟随脚本的内容来确认里面用了哪个类作为队友的Character对象,以此来修改行走图名字,
进 ...

我想问下,这个是XP的,我用VA的话,要怎么改才好?
回复

使用道具 举报

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

本版积分规则

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

在本版发帖返回顶部