메뉴 건너뛰기

창조도시 기록보관소

스크립트 기차 파티 스크립트

2007.11.05 11:12

창조도시 조회 수:781 추천:2

extra_vars1 RPGXP 
extra_vars2 캐럭터관련 
extra_vars3
extra_vars4 103764 
extra_vars5 1197599523 
extra_vars6
extra_vars7  
extra_vars8  
extra_vars9  
extra_vars10  
extra_vars11  
extra_vars12  
섹션 : Main 위에 Member_Train 이라고 새로 작성 해주세요

그리고 아래 스크립트를 넣어줍시다



#==============================================================================
# ■ Member_Train
#------------------------------------------------------------------------------
#  동료를 기차처럼 나란히 따라오게 만드는 클레스입니다.
#==============================================================================

module Train_Actor

# ●투명상태용 스윗치 설정
# true 라면 스윗치 제어를 실시한다
# TRANSPARENT_SWITCH = true
TRANSPARENT_SWITCH = false

# ●투명상태용 스윗치 번호
# TRANSPARENT_SWITCH 가 true 로 , 이 번호의 스윗치가 ON라면 투명하게 된다
TRANSPARENT_SWITCHES_INDEX = 20

# ●엑터의 최대수
# 장래적으로 많은 사람 파티를 생기게 되면…
TRAIN_ACTOR_SIZE_MAX = 4 #여기에 쓰인 숫자만큼까지의 동료가 따라다닐 수 있습니다.

# 정수
#Input::DOWN  = 2
#Input::LEFT  = 4
#Input::RIGHT = 6
#Input::UP    = 8
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
    else
      @character_name = ""
      @character_hue = 0
    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
  #--------------------------------------------------------------------------
  # ● 아래에 이동
  #     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
  #--------------------------------------------------------------------------
  # ● 좌하에 이동
  #--------------------------------------------------------------------------
  def move_lower_left
    # 방향 고정이 아닌 경우
    unless @direction_fix
      # 오른쪽 방향이었던 경우는 왼쪽을 , 오름새였던 경우는 아래를 향한다
      @direction = (@direction == Input::RIGHT ? Input::LEFT : @direction == Input::UP ? Input::DOWN : @direction)
    end
    # 하→왼쪽 , 좌→하의 어느 쪽인가의 코스가 통행 가능한 경우
    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))
      # 좌표를 갱신
      @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 (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))
      # 좌표를 갱신
      @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 (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))
      # 좌표를 갱신
      @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 (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))
      # 좌표를 갱신
      @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[i].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[i])
    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[i] != nil
        case @move_list[i].type
          when Input::DOWN
            @characters[i].move_down(@move_list[i].args[0])
          when Input::LEFT
            @characters[i].move_left(@move_list[i].args[0])
          when Input::RIGHT
            @characters[i].move_right(@move_list[i].args[0])
          when Input::UP
            @characters[i].move_up(@move_list[i].args[0])
          when DOWN_LEFT
            @characters[i].move_lower_left
          when DOWN_RIGHT
            @characters[i].move_lower_right
          when UP_LEFT
            @characters[i].move_upper_left
          when UP_RIGHT
            @characters[i].move_upper_right
          when JUMP
            @characters[i].jump(@move_list[i].args[0],@move_list[i].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[i] = 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 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

# Train_Actor
번호 제목 글쓴이 날짜 조회 수
50 물가에가면 캐릭터를 반사시켜주는 스크립트 [11] file 창조도시 2007.11.05 3649
49 대화창에 이름&얼굴 띄우기 새로운방식. [2] file 창조도시 2007.11.05 2377
48 대화창에 이름&얼굴 띄우기 새로운방식. file 창조도시 2007.11.05 1536
47 새로운 게임 시작/로드 시 미묘한 연출 추가. 창조도시 2007.11.05 1332
46 vx 한글이름입력 [1] file 가가상 2008.03.03 1111
45 대화창에 얼굴 띄우기& 대화창 명령어 모음. [2] file 창조도시 2007.11.05 1110
44 맵 이름을 화면 상단에 띄우기. [1] file 창조도시 2007.11.05 1107
43 최초 시작화면에 제작자 정보를 띄워보자. [7] 창조도시 2007.11.05 1060
42 창고 시스템 [3] 창조도시 2007.11.05 1040
41 아이템창을 아이템 분류별로 나누어 지게 개조. [5] file 창조도시 2007.11.05 1026
40 액터선택지이벤트제작 간편화 스크립트 [1] Evangelista 2009.01.14 1024
39 이벤트커맨드 스크립트 관련 설명 [3] Evangelista 2009.01.27 1000
38 에너미 아이템 변화 스크립트 [1] Evangelista 2009.05.27 955
37 이벤트커맨드 스크립트 사용법 모음 [2] Evangelista 2009.01.27 937
36 이벤트커맨드 스크립트 관련 설명 Evangelista 2009.01.27 893
35 한글이름입력기 v1.76 창조도시 2007.11.05 873
34 창고 시스템 창조도시 2007.11.05 859
33 그림자문자 사용하기.. 바탕색이 무슨색이건 상관없이 글자가 잘보인다!!! 창조도시 2007.11.05 812
32 대각선 방향 이동추가로 8방향 이동 만들기. [1] 창조도시 2007.11.05 787
» 기차 파티 스크립트 [2] 창조도시 2007.11.05 781