VX 스크립트

2 Players Engine
Version
1.0
by Woratana

출저는 http://www.rpgrevolution.com/

#================================================
# [VX] 2 Players Engine
#------------------------------------------------
# By Woratana [woratana@hotmail.com]
# Version: 1.0
# Date: 14/03/2008 *HAPPY PIE DAY! lol*
#
# CREDIT: Original XP Version by Hima

=begin

+[FEATURES]+
- Create Player 2 that you can control, interact with other events in map,
as same as Main Player.

- Editable Input Buttons for Player 2

- Player 2 can walk & Run 8 directions

+[HOW TO USE]+
To Create Player 2, use call script:
$game_player2 = Game_Player2.new
$game_player2.create(x, y, actor id, follow?)

x and y = X and Y that you want new player to appear

actor id = Character from ID of Actor that you want to use for new player
(ID from Database)

follow? = true (Screen follow new player), false (not follow new player)
*NOT RECOMMEND TO USE FOLLOW*

To Delete Player 2, use call script:
$game_player2.delete

=end
#==============================================================================

class Game_Player2 < Game_Character
  #--------------------------------------------------------------------------
  # START SETUP SCRIPT PART
  # * Constants: INPUT BUTTONS FOR Game_Player 2
  #--------------------------------------------------------------------------
  DOWN = Input::Y # S in Keyboard
  LEFT = Input::X # A in Keyboard
  RIGHT = Input::Z # D in Keyboard
  UP = Input::R # W in Keyboard
  ENTER = Input::L # Q in Keyboard
  RUN = Input::A # Shift in Keyboard
  #--------------------------------------------------------------------------
  # END SETUP SCRIPT PART
  #--------------------------------------------------------------------------
  
  CENTER_X = (544 / 2 - 16) * 8     # Screen center X coordinate * 8
  CENTER_Y = (416 / 2 - 16) * 8     # Screen center Y coordinate * 8
  #--------------------------------------------------------------------------
  # * Public Instance Variables
  #--------------------------------------------------------------------------
  attr_reader   :vehicle_type       # type of vehicle currenting being ridden
  attr_accessor :character_name
  #--------------------------------------------------------------------------
  # * Create and Set Player 2 Location
  #--------------------------------------------------------------------------
  def create(x,y,id,need_center = false)
    @actor_id = id
    moveto(x,y)
    @need_center = need_center
    refresh
  end
  #--------------------------------------------------------------------------
  # * Clear Player 2
  #--------------------------------------------------------------------------
  def delete
    @actor_id = nil
    refresh
    $game_player2 = nil
  end
  #--------------------------------------------------------------------------
  # * Object Initialization
  #--------------------------------------------------------------------------
  def initialize
    super
    @vehicle_type = -1
    @vehicle_getting_on = false     # Boarding vehicle flag
    @vehicle_getting_off = false    # Getting off vehicle flag
    @transferring = false           # Player transfer flag
    @new_map_id = 0                 # Destination map ID
    @new_x = 0                      # Destination X coordinate
    @new_y = 0                      # Destination Y coordinate
    @new_direction = 0              # Post-movement direction
    @walking_bgm = nil              # For walking BGM memory
  end
  #--------------------------------------------------------------------------
  # * Determine if Stopping
  #--------------------------------------------------------------------------
  def stopping?
    return false if @vehicle_getting_on
    return false if @vehicle_getting_off
    return super
  end
  #--------------------------------------------------------------------------
  # * Player Transfer Reservation
  #     map_id    : Map ID
  #     x : x-coordinate
  #     y         : y coordinate
  #     direction : post-movement direction
  #--------------------------------------------------------------------------
  def reserve_transfer(map_id, x, y, direction)
    @transferring = true
    @new_map_id = map_id
    @new_x = x
    @new_y = y
    @new_direction = direction
  end
  #--------------------------------------------------------------------------
  # * Determine if Player Transfer is Reserved
  #--------------------------------------------------------------------------
  def transfer?
    return @transferring
  end
  #--------------------------------------------------------------------------
  # * Execute Player Transfer
  #--------------------------------------------------------------------------
  def perform_transfer
    return unless @transferring
    @transferring = false
    set_direction(@new_direction)
    if $game_map.map_id != @new_map_id
      $game_map.setup(@new_map_id)     # Move to other map
    end
    moveto(@new_x, @new_y)
  end
  #--------------------------------------------------------------------------
  # * Determine if Map is Passable
  #     x : x-coordinate
  #     y : y-coordinate
  #--------------------------------------------------------------------------
  def map_passable?(x, y)
    case @vehicle_type
    when 0  # Boat
      return $game_map.boat_passable?(x, y)
    when 1  # Ship
      return $game_map.ship_passable?(x, y)
    when 2  # Airship
      return true
    else    # Walking
      return $game_map.passable?(x, y)
    end
  end
  #--------------------------------------------------------------------------
  # * Determine if Walking is Possible
  #     x : x-coordinate
  #     y : y-coordinate
  #--------------------------------------------------------------------------
  def can_walk?(x, y)
    last_vehicle_type = @vehicle_type   # Remove vehicle type
    @vehicle_type = -1                  # Temporarily set to walking
    result = passable?(x, y)            # Determine if passable
    @vehicle_type = last_vehicle_type   # Restore vehicle type
    return result
  end
  #--------------------------------------------------------------------------
  # * Determine if Airship can Land
  #     x : x-coordinate
  #     y : y-coordinate
  #--------------------------------------------------------------------------
  def airship_land_ok?(x, y)
    unless $game_map.airship_land_ok?(x, y)
      return false    # The tile passable attribute is unlandable
    end
    unless $game_map.events_xy(x, y).empty?
      return false    # Cannot land where there is an event
    end
    return true       # Can land
  end
  #--------------------------------------------------------------------------
  # * Determine if Riding in Some Kind of Vehicle
  #--------------------------------------------------------------------------
  def in_vehicle?
    return @vehicle_type >= 0
  end
  #--------------------------------------------------------------------------
  # * Determine if Riding in Airship
  #--------------------------------------------------------------------------
  def in_airship?
    return @vehicle_type == 2
  end
  #--------------------------------------------------------------------------
  # * Determine if Dashing
  #--------------------------------------------------------------------------
  def dash?
    return false if @move_route_forcing
    return false if $game_map.disable_dash?
    return false if in_vehicle?
    return Input.press?(RUN)
  end
  #--------------------------------------------------------------------------
  # * Determine if Debug Pass-through State
  #--------------------------------------------------------------------------
  def debug_through?
    return false unless $TEST
    return Input.press?(Input::CTRL)
  end
  #--------------------------------------------------------------------------
  # * Set Map Display Position to Center of Screen
  #     x : x-coordinate
  #     y : y-coordinate
  #--------------------------------------------------------------------------
  def center(x, y)
    display_x = x * 256 - CENTER_X                    # Calculate coordinates
    unless $game_map.loop_horizontal?                 # No loop horizontally?
      max_x = ($game_map.width - 17) * 256            # Calculate max value
      display_x = [0, [display_x, max_x].min].max     # Adjust coordinates
    end
    display_y = y * 256 - CENTER_Y                    # Calculate coordinates
    unless $game_map.loop_vertical?                   # No loop vertically?
      max_y = ($game_map.height - 13) * 256           # Calculate max value
      display_y = [0, [display_y, max_y].min].max     # Adjust coordinates
    end
    $game_map.set_display_pos(display_x, display_y)   # Change map location
  end
  #--------------------------------------------------------------------------
  # * Move to Designated Position
  #     x : x-coordinate
  #     y : y-coordinate
  #--------------------------------------------------------------------------
  def moveto(x, y)
    super
    # center(x, y)
    make_encounter_count                              # Initialize encounter
    if in_vehicle?                                    # Riding in vehicle
      vehicle = $game_map.vehicles[@vehicle_type]     # Get vehicle
      vehicle.refresh                                 # Refresh
    end
  end
  #--------------------------------------------------------------------------
  # * Increase Steps
  #--------------------------------------------------------------------------
  def increase_steps
    super
    return if @move_route_forcing
    return if in_vehicle?
    $game_party.increase_steps
    $game_party.on_player_walk
  end
  #--------------------------------------------------------------------------
  # * Get Encounter Count
  #--------------------------------------------------------------------------
  def encounter_count
    return @encounter_count
  end
  #--------------------------------------------------------------------------
  # * Make Encounter Count
  #--------------------------------------------------------------------------
  def make_encounter_count
    if $game_map.map_id != 0
      n = $game_map.encounter_step
      @encounter_count = rand(n) + rand(n) + 1  # As if rolling 2 dice
    end
  end
  #--------------------------------------------------------------------------
  # * Determine if in Area
  #     area : Area data (RPG::Area)
  #--------------------------------------------------------------------------
  def in_area?(area)
    return false if area == nil
    return false if $game_map.map_id != area.map_id
    return false if @x < area.rect.x
    return false if @y < area.rect.y
    return false if @x >= area.rect.x + area.rect.width
    return false if @y >= area.rect.y + area.rect.height
    return true
  end
  #--------------------------------------------------------------------------
  # * Create Group ID for Troop Encountered
  #--------------------------------------------------------------------------
  def make_encounter_troop_id
    encounter_list = $game_map.encounter_list.clone
    for area in $data_areas.values
      encounter_list += area.encounter_list if in_area?(area)
    end
    if encounter_list.empty?
      make_encounter_count
      return 0
    end
    return encounter_list[rand(encounter_list.size)]
  end
  #--------------------------------------------------------------------------
  # * Refresh
  #--------------------------------------------------------------------------
  def refresh
    if @actor_id != nil and $game_actors[@actor_id] != nil
      actor = $game_actors[@actor_id]   # Get front actor
      @character_name = actor.character_name
      @character_index = actor.character_index
    else
      @character_name = ""
      end
  end
  #--------------------------------------------------------------------------
  # * Determine if Same Position Event is Triggered
  #     triggers : Trigger array
  #--------------------------------------------------------------------------
  def check_event_trigger_here(triggers)
    return false if $game_map.interpreter.running?
    result = false
    for event in $game_map.events_xy(@x, @y)
      if triggers.include?(event.trigger) and event.priority_type != 1
        event.start
        result = true if event.starting
      end
    end
    return result
  end
  #--------------------------------------------------------------------------
  # * Determine if Front Event is Triggered
  #     triggers : Trigger array
  #--------------------------------------------------------------------------
  def check_event_trigger_there(triggers)
    return false if $game_map.interpreter.running?
    result = false
    front_x = $game_map.x_with_direction(@x, @direction)
    front_y = $game_map.y_with_direction(@y, @direction)
    for event in $game_map.events_xy(front_x, front_y)
      if triggers.include?(event.trigger) and event.priority_type == 1
        event.start
        result = true
      end
    end
    if result == false and $game_map.counter?(front_x, front_y)
      front_x = $game_map.x_with_direction(front_x, @direction)
      front_y = $game_map.y_with_direction(front_y, @direction)
      for event in $game_map.events_xy(front_x, front_y)
        if triggers.include?(event.trigger) and event.priority_type == 1
          event.start
          result = true
        end
      end
    end
    return result
  end
  #--------------------------------------------------------------------------
  # * Determine if Touch Event is Triggered
  #     x : x-coordinate
  #     y : y-coordinate
  #--------------------------------------------------------------------------
  def check_event_trigger_touch(x, y)
    return false if $game_map.interpreter.running?
    result = false
    for event in $game_map.events_xy(x, y)
      if [1,2].include?(event.trigger) and event.priority_type == 1
        event.start
        result = true
      end
    end
    return result
  end
  #--------------------------------------------------------------------------
  # * Processing of Movement via input from the Directional Buttons
  #--------------------------------------------------------------------------
  def move_by_input
    return unless movable?
    return if $game_map.interpreter.running?
    if Input.press?(DOWN)
      move_down
    end
    if Input.press?(LEFT)
      move_left
    end
    if Input.press?(RIGHT)
      move_right
    end
    if Input.press?(UP)
      move_up
    end
  end
  #--------------------------------------------------------------------------
  # * Determine if Movement is Possible
  #--------------------------------------------------------------------------
  def movable?
    return false if moving?                     # Moving
    return false if @move_route_forcing         # On forced move route
    return false if @vehicle_getting_on         # Boarding vehicle
    return false if @vehicle_getting_off        # Getting off vehicle
    return false if $game_message.visible       # Displaying a message
    return false if in_airship? and not $game_map.airship.movable?
    return true
  end
  #--------------------------------------------------------------------------
  # * Frame Update
  #--------------------------------------------------------------------------
  def update
    last_real_x = @real_x
    last_real_y = @real_y
    last_moving = moving?
    move_by_input
    super
    update_scroll(last_real_x, last_real_y) if @need_center
    update_vehicle
    update_nonmoving(last_moving)
  end
  #--------------------------------------------------------------------------
  # * Update Scroll
  #--------------------------------------------------------------------------
  def update_scroll(last_real_x, last_real_y)
    ax1 = $game_map.adjust_x(last_real_x)
    ay1 = $game_map.adjust_y(last_real_y)
    ax2 = $game_map.adjust_x(@real_x)
    ay2 = $game_map.adjust_y(@real_y)
    if ay2 > ay1 and ay2 > CENTER_Y
      $game_map.scroll_down(ay2 - ay1)
    end
    if ax2 < ax1 and ax2 < CENTER_X
      $game_map.scroll_left(ax1 - ax2)
    end
    if ax2 > ax1 and ax2 > CENTER_X
      $game_map.scroll_right(ax2 - ax1)
    end
    if ay2 < ay1 and ay2 < CENTER_Y
      $game_map.scroll_up(ay1 - ay2)
    end
  end
  #--------------------------------------------------------------------------
  # * Update Vehicle
  #--------------------------------------------------------------------------
  def update_vehicle
    return unless in_vehicle?
    vehicle = $game_map.vehicles[@vehicle_type]
    if @vehicle_getting_on                    # Boarding?
      if not moving?
        @direction = vehicle.direction        # Change direction
        @move_speed = vehicle.speed           # Change movement speed
        @vehicle_getting_on = false           # Finish boarding operation
        @transparent = true                   # Transparency
      end
    elsif @vehicle_getting_off                # Getting off?
      if not moving? and vehicle.altitude == 0
        @vehicle_getting_off = false          # Finish getting off operation
        @vehicle_type = -1                    # Erase vehicle type
        @transparent = false                  # Remove transparency
      end
    else                                      # Riding in vehicle
      vehicle.sync_with_player                # Move at the same time as player
    end
  end
  #--------------------------------------------------------------------------
  # * Processing when not moving
  #     last_moving : Was it moving previously?
  #--------------------------------------------------------------------------
  def update_nonmoving(last_moving)
    return if $game_map.interpreter.running?
    return if moving?
    return if check_touch_event if last_moving
    if not $game_message.visible and Input.trigger?(ENTER)
      return if get_on_off_vehicle
      return if check_action_event
    end
    update_encounter if last_moving
  end
  #--------------------------------------------------------------------------
  # * Update Encounter
  #--------------------------------------------------------------------------
  def update_encounter
    return if $TEST and Input.press?(Input::CTRL)   # During test play?
    return if in_vehicle?                           # Riding in vehicle?
    if $game_map.bush?(@x, @y)                      # If in bush
      @encounter_count -= 2                         # Reduce encounters by 2
    else                                            # If not in bush
      @encounter_count -= 1                         # Reduce encounters by 1
    end
  end
  #--------------------------------------------------------------------------
  # * Determine Event Start Caused by Touch (overlap)
  #--------------------------------------------------------------------------
  def check_touch_event
    return false if in_airship?
    return check_event_trigger_here([1,2])
  end
  #--------------------------------------------------------------------------
  # * Determine Event Start Caused by [OK] Button
  #--------------------------------------------------------------------------
  def check_action_event
    return false if in_airship?
    return true if check_event_trigger_here([0])
    return check_event_trigger_there([0,1,2])
  end
  #--------------------------------------------------------------------------
  # * Getting On and Off Vehicles
  #--------------------------------------------------------------------------
  def get_on_off_vehicle
    return false unless movable?
    if in_vehicle?
      return get_off_vehicle
    else
      return get_on_vehicle
    end
  end
  #--------------------------------------------------------------------------
  # * Board Vehicle
  #    Assumes that the player is not currently in a vehicle.
  #--------------------------------------------------------------------------
  def get_on_vehicle
    front_x = $game_map.x_with_direction(@x, @direction)
    front_y = $game_map.y_with_direction(@y, @direction)
    if $game_map.airship.pos?(@x, @y)       # Is it overlapping with airship?
      get_on_airship
      return true
    elsif $game_map.ship.pos?(front_x, front_y)   # Is there a ship in front?
      get_on_ship
      return true
    elsif $game_map.boat.pos?(front_x, front_y)   # Is there a boat in front?
      get_on_boat
      return true
    end
    return false
  end
  #--------------------------------------------------------------------------
  # * Board Boat
  #--------------------------------------------------------------------------
  def get_on_boat
    @vehicle_getting_on = true        # Boarding flag
    @vehicle_type = 0                 # Set vehicle type
    force_move_forward                # Move one step forward
    @walking_bgm = RPG::BGM::last     # Memorize walking BGM
    $game_map.boat.get_on             # Boarding processing
  end
  #--------------------------------------------------------------------------
  # * Board Ship
  #--------------------------------------------------------------------------
  def get_on_ship
    @vehicle_getting_on = true        # Board
    @vehicle_type = 1                 # Set vehicle type
    force_move_forward                # Move one step forward
    @walking_bgm = RPG::BGM::last     # Memorize walking BGM
    $game_map.ship.get_on             # Boarding processing
  end
  #--------------------------------------------------------------------------
  # * Board Airship
  #--------------------------------------------------------------------------
  def get_on_airship
    @vehicle_getting_on = true        # Start boarding operation
    @vehicle_type = 2                 # Set vehicle type
    @through = true                   # Passage ON
    @walking_bgm = RPG::BGM::last     # Memorize walking BGM
    $game_map.airship.get_on          # Boarding processing
  end
  #--------------------------------------------------------------------------
  # * Get Off Vehicle
  #    Assumes that the player is currently riding in a vehicle.
  #--------------------------------------------------------------------------
  def get_off_vehicle
    if in_airship?                                # Airship
      return unless airship_land_ok?(@x, @y)      # Can't land?
    else                                          # Boat/ship
      front_x = $game_map.x_with_direction(@x, @direction)
      front_y = $game_map.y_with_direction(@y, @direction)
      return unless can_walk?(front_x, front_y)   # Can't touch land?
    end
    $game_map.vehicles[@vehicle_type].get_off     # Get off processing
    if in_airship?                                # Airship
      @direction = 2                              # Face down
    else                                          # Boat/ship
      force_move_forward                          # Move one step forward
      @transparent = false                        # Remove transparency
    end
    @vehicle_getting_off = true                   # Start getting off operation
    @move_speed = 4                               # Return move speed
    @through = false                              # Passage OFF
    @walking_bgm.play                             # Restore walking BGM
    make_encounter_count                          # Initialize encounter
  end
  #--------------------------------------------------------------------------
  # * Force One Step Forward
  #--------------------------------------------------------------------------
  def force_move_forward
    @through = true         # Passage ON
    move_forward            # Move one step forward
    @through = false        # Passage OFF
  end
end

class Scene_Title < Scene_Base
  alias wor_twopla_scetit_cregam create_game_objects
  def create_game_objects
    wor_twopla_scetit_cregam
    $game_player2 = nil
  end
end

class Scene_Map < Scene_Base
  alias wor_twopla_scemap_upd update
  def update
    wor_twopla_scemap_upd
    $game_player2.update if $game_player2 != nil
  end
end

class Spriteset_Map
  alias wor_twopla_sprmap_crecha create_characters
  alias wor_twopla_sprmap_updcha update_characters
  def create_characters
    wor_twopla_sprmap_crecha
    @character_sprites.push(Sprite_Character.new(@viewport1, $game_player))
    @chara_two_pushed = false
  end
  
  def update_characters
    if !(@chara_two_pushed) and $game_player2 != nil
      @character_sprites.push(Sprite_Character.new(@viewport1, $game_player2))
      @chara_two_pushed = true
    elsif @chara_two_pushed and $game_player2 == nil
      for i in 0..@character_sprites.size
        if @character_sprites[i].character.is_a?(Game_Player2)
          @character_sprites[i].character.character_name = ""
          @character_sprites[i].update
          @character_sprites.delete_at(i)
          break
        end
      end
      @chara_two_pushed = false
    end
    wor_twopla_sprmap_updcha
  end
end

class Game_Map
  alias wor_twopla_gammap_passable passable?
  def passable?(x, y, flag = 0x01)
    if $game_player2 != nil and flag
      return false if $game_player2.x == x and $game_player2.y == y
    end
    wor_twopla_gammap_passable(x, y, flag)
  end
end

사용법은 http://www.rpgrevolution.com/forums/?showtopic=10516 이곳을 참고해주세요<

데모 다운받기

Comment '11'
  • ?
    레시온 2008.03.29 00:53
    헉;;; 신기하네요;;;ㅋㅋㅋㅋ
  • ?
    작은악마 2008.03.29 13:40
    하지는 않아봣지만 2p라;;
  • ?
    레이니케 2008.03.30 16:27
    근데 솔직히 이벤트등으로 만드는걸 더 추천해요..
    그다지 좋지는 않더라구요;;
  • ?
    Cyan 2008.03.30 16:44
    ㅋㅋ
    하하 그렇군요
  • ?
    꿈꾸는소년 2008.03.31 12:01
    허거덕!
  • ?
    WMN 2008.04.06 17:27

    2p..

    역시 좋은자료 갑사합니다



  • ?
    유니온 2008.04.12 21:37

    뭐죠? 2P플레이가 가능해지는건가요?

  • ?
    흑기사 2008.05.06 00:47
     
    2P라 ... 음 음 음 음 음 음 음 음 음 음 음 ㅡㅡ 음이군요.^^
    ㅡㅡ는 아무것도아님 걍올려봤어요....
  • ?
    엘시아 2008.05.18 23:51
    와 신기하네요~ ㅋㅋ
  • ?
    시라소몬 2008.05.24 19:06
    2p 라궁?! 2p가 된다니...
  • profile
    카와이 2009.01.13 14:04
    이벤트로도 가능한것

List of Articles
번호 분류 제목 글쓴이 날짜 조회 수
공지 스크립트 자료 게시물 작성시 주의사항 3 습작 2012.12.24 5398
130 기타 게임 해상도를 조절 하는 스크립트 19 아방스 2008.01.21 4780
129 기타 VX에서 포그 그래픽을 사용하자 16 아방스 2008.01.31 3895
128 기타 텍스트 파일 읽어 오는 스크립트 11 아방스 2008.03.04 2877
127 기타 간단한 스크립트의 사용법 6 아방스 2008.03.09 4552
126 기타 rpg vx 렉 줄이는 스크립트 34 아방스 2008.03.09 4813
» 기타 2 Players Engine 11 레이니케 2008.03.28 2294
124 기타 [VX] Anti-Lag 1.2c by Anaryu[예제첨부] 3 file WMN 2008.04.06 2371
123 기타 빛 이펙트 71 file DEVIL<Li Patanis Roni Kraudus> 2008.06.06 5860
122 기타 [KGC]한계돌파 9 방콕족의생활 2008.06.13 3599
121 기타 RPG 2000이나 RPG 2003처럼 전체화면으로 나오게 하는 스크립트(대박) 21 Man... 2008.10.28 4821
120 기타 TagNote v2.0 5 Man... 2008.10.28 1996
119 기타 Crissaegrim Farm BETA 1.0.0 10 Man... 2008.11.22 3093
118 기타 디스크 체인져 VX!! (업데이트..) 30 file Tofuman 2008.12.02 3168
117 기타 이벤트 위치 저장 스크립트 10 Tofuman 2008.12.11 2096
116 기타 책 읽기 스크립트. 19 허걱 2009.01.31 4490
115 기타 Staff Roll 13 file 허걱 2009.01.31 3523
114 기타 VX서비스팩1 6 훈덕 2009.02.03 2806
113 기타 작은 게이지바 표시 스크립트 44 file 허걱 2009.02.05 5979
112 기타 Base Project 15 아방스 2009.02.05 3063
111 기타 라이트 이펙트 스크립트 12 file 아방스 2009.02.07 3262
Board Pagination Prev 1 2 3 4 5 6 7 Next
/ 7