查看: 1859|回复: 0

[已经过期] 人物跟隨腳本,優先度問題請求修正~

[复制链接]
梦石
0
星屑
50
在线时间
448 小时
注册时间
2011-10-9
回帖
138
发表于 2014-7-5 21:53:56 | 显示全部楼层 |阅读模式

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

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

×
問題陳述:

在此腳本中,跟隨者的優先度是在「與角色相等」的事件之下
也就是說,跟隨者會被物件給遮蓋
例如路邊的水花、車輛還是怪物等,非常的奇怪
優先度:主角=事件>跟隨者

但當把跟隨者的Z值+1時
又變成會把主角擋住的情形,例如過地圖後
優先度:主角=事件<跟隨者

有無方法讓跟隨者的優先度,在普通級別的事件之上、又在主角之下?
變成:主角>跟隨者>事件    這樣?


謝謝,腳本如下:


[pre lang="ruby" line="1"]if true
#==============================================================================
    # ■ 人物跟隨
    #------------------------------------------------------------------------------
    #
    #   本腳本來自www.66RPG.com,使用和轉載請保留此信息
    #
    #   作者:fukuyama   
    #
    #   移植:ONEWateR
    #
    #==============================================================================
    module Train_Actor

    #是否使用停止跟隨的方法,也就是說,這裡false改為true的時候,如果TRANSPARENT_SWITCHES_INDEX
    #開關打開,跟隨的人物就消失了(其實只是變成透明而已)

    TRANSPARENT_SWITCH = true
    TRANSPARENT_SWITCHES_INDEX = 7 #顯示跟隨人物開關編號
    #舉例:第一個為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_index = actor.character_index
    @character_name = actor.character_name
    @priority_type = 1
    else
    @character_name = ""
    @character_index = 0
    @priority_type = 1
    end
    # 不透明度と合成方法を初期化
    @opacity = 255
    @blend_type = 0
   
   
   
   
   
#-----------------------------------------------------------------------------------   
    def screen_z
    if @priority_type == 2
      result = 200
    elsif @priority_type == 0
      result = 60
    elsif @tile_id > 0
      pass = $game_map.passages[@tile_id]
      if pass & 0x10 == 0x10    # [☆]
        result = 160
      else
        result = 40
      end
    else
      result = 100
    end
    return result - 1
  end   
#-----------------------------------------------------------------------------------  
   
   
   
   
   
   
    end
    #--------------------------------------------------------------------------
    # ● 下に移動
    # turn_enabled : その場での向き変更を許可するフラグ
    #--------------------------------------------------------------------------
    def move_down(turn_enabled = true)
    # 下を向く
    if turn_enabled
    turn_down
    end
    # 通行可能な場合
    if new_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 new_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 new_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 new_passable?(@x, @y, Input::UP)
    # 上を向く
    turn_up
    # 座標を更新
    @y -= 1
    end
    end
    #--------------------------------------------------------------------------
    # ● 左下に移動
    #--------------------------------------------------------------------------
    def move_lower_left
    # 向き固定でない場合
    unless @direction_fix
    # 右向きだった場合は左を、上向きだった場合は下を向く
    @direction = (@direction == Input::RIGHT ? Input::LEFT : @direction == Input::UP ? Input::DOWN : @direction)
    end
    # 下→左、左→下 のどちらかのコースが通行可能な場合
    if (new_passable?(@x, @y, Input::DOWN) and new_passable?(@x, @y + 1, Input::LEFT)) or
    (new_passable?(@x, @y, Input::LEFT) and new_passable?(@x - 1, @y, Input::DOWN))
    # 座標を更新
    @x -= 1
    @y += 1
    end
    end
    #--------------------------------------------------------------------------
    # ● 右下に移動
    #--------------------------------------------------------------------------
    def move_lower_right
    # 向き固定でない場合
    unless @direction_fix
    # 左向きだった場合は右を、上向きだった場合は下を向く
    @direction = (@direction == Input::LEFT ? Input::RIGHT : @direction == Input::UP ? Input::DOWN : @direction)
    end
    # 下→右、右→下 のどちらかのコースが通行可能な場合
    if (new_passable?(@x, @y, Input::DOWN) and new_passable?(@x, @y + 1, Input::RIGHT)) or
    (new_passable?(@x, @y, Input::RIGHT) and new_passable?(@x + 1, @y, Input::DOWN))
    # 座標を更新
    @x += 1
    @y += 1
    end
    end
    #--------------------------------------------------------------------------
    # ● 左上に移動
    #--------------------------------------------------------------------------
    def move_upper_left
    # 向き固定でない場合
    unless @direction_fix
    # 右向きだった場合は左を、下向きだった場合は上を向く
    @direction = (@direction == Input::RIGHT ? Input::LEFT : @direction == Input::DOWN ? Input::UP : @direction)
    end
    # 上→左、左→上 のどちらかのコースが通行可能な場合
    if (new_passable?(@x, @y, Input::UP) and new_passable?(@x, @y - 1, Input::LEFT)) or
    (new_passable?(@x, @y, Input::LEFT) and new_passable?(@x - 1, @y, Input::UP))
    # 座標を更新
    @x -= 1
    @y -= 1
    end
    end
    #--------------------------------------------------------------------------
    # ● 右上に移動
    #--------------------------------------------------------------------------
    def move_upper_right
    # 向き固定でない場合
    unless @direction_fix
    # 左向きだった場合は右を、下向きだった場合は上を向く
    @direction = (@direction == Input::LEFT ? Input::RIGHT : @direction == Input::DOWN ? Input::UP : @direction)
    end
    # 上→右、右→上 のどちらかのコースが通行可能な場合
    if (new_passable?(@x, @y, Input::UP) and new_passable?(@x, @y - 1, Input::RIGHT)) or
    (new_passable?(@x, @y, Input::RIGHT) and new_passable?(@x + 1, @y, Input::UP))
    # 座標を更新
    @x += 1
    @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($game_party.members)
    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
    if $game_player.dash?
    character.move_speed = $game_player.move_speed*1.1#1.25
    else
    character.move_speed = $game_player.move_speed
    end
    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 DOWN_LEFT
    @characters.move_lower_left
    when DOWN_RIGHT
    @characters.move_lower_right
    when UP_LEFT
    @characters.move_upper_left
    when UP_RIGHT
    @characters.move_upper_right
    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 move_lower_left_party_actors
    move_party_actors
    add_move_list(DOWN_LEFT)
    end
    def move_lower_right_party_actors
    move_party_actors
    add_move_list(DOWN_RIGHT)
    end
    def move_upper_left_party_actors
    move_party_actors
    add_move_list(UP_LEFT)
    end
    def move_upper_right_party_actors
    move_party_actors
    add_move_list(UP_RIGHT)
    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 new_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 new_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 new_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 new_passable?(@x, @y, Input::UP)
    $game_party.move_up_party_actors(turn_enabled)
    end
    super(turn_enabled)
    end
    def move_lower_left
    # 下→左、左→下 のどちらかのコースが通行可能な場合
    if (new_passable?(@x, @y, Input::DOWN) and new_passable?(@x, @y + 1, Input::LEFT)) or
    (new_passable?(@x, @y, Input::LEFT) and new_passable?(@x - 1, @y, Input::DOWN))
    $game_party.move_lower_left_party_actors
    end
    super
    end
    def move_lower_right
    # 下→右、右→下 のどちらかのコースが通行可能な場合
    if (new_passable?(@x, @y, Input::DOWN) and new_passable?(@x, @y + 1, Input::RIGHT)) or
    (new_passable?(@x, @y, Input::RIGHT) and new_passable?(@x + 1, @y, Input::DOWN))
    $game_party.move_lower_right_party_actors
    end
    super
    end
    def move_upper_left
    # 上→左、左→上 のどちらかのコースが通行可能な場合
    if (new_passable?(@x, @y, Input::UP) and new_passable?(@x, @y - 1, Input::LEFT)) or
    (new_passable?(@x, @y, Input::LEFT) and new_passable?(@x - 1, @y, Input::UP))
    $game_party.move_upper_left_party_actors
    end
    super
    end
    def move_upper_right
    # 上→右、右→上 のどちらかのコースが通行可能な場合
    if (new_passable?(@x, @y, Input::UP) and new_passable?(@x, @y - 1, Input::RIGHT)) or
    (new_passable?(@x, @y, Input::RIGHT) and new_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 new_passable?(new_x, new_y, 0)
    $game_party.jump_party_actors(x_plus, y_plus)
    end
    super(x_plus, y_plus)
    end
    attr_accessor :move_speed
    attr_accessor :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
    class Game_Character
    def new_passable?(x, y, d)
    new_x = x + (d == 6 ? 1 : d == 4 ? -1 : 0)
    new_y = y + (d == 2 ? 1 : d == 8 ? -1 : 0)
    unless $game_map.valid?(new_x, new_y)
    return false
    end
    x = $game_map.round_x(x)                        # 橫方向循環修正
    y = $game_map.round_y(y)                        # 縱方向循環修正
    return false unless $game_map.valid?(x, y)      # 地圖外?
    return true if @through or debug_through?       # 穿越 ON?
    return false unless map_passable?(new_x, new_y)         # 地圖不能通行?
    return false if collide_with_characters?(new_x, new_y)  # 與角色衝突?
    return true                                     # 可以通行
    end
  end
  end[/pre]
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

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

在本版发帖返回顶部