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
57 이동 및 탈것 VX의 기존 대쉬 기능 없애기 8 BAYONET 2008.05.18 2552
56 전투 2003식 사이드뷰 적들도 가까이와서 공격함 ㅇㅇ 51 배군 2008.05.02 6750
55 메뉴 일본에서 만든 멋있는메뉴변경 스크립트 (한글 VX에서 쓰시면 자동으로 바뀜) 45 유칸지 2008.04.09 8861
54 전투 VX]Mog Battleback XP 1.0 11 file WMN 2008.04.06 3868
53 직업 [VX] Blue Mage by Fomar0153 9 WMN 2008.04.06 2785
52 기타 [VX] Anti-Lag 1.2c by Anaryu[예제첨부] 3 file WMN 2008.04.06 2371
51 변수/스위치 VX Script Fix - Variable Operation (by Yeyinde) 8 WMN 2008.04.06 2267
» 기타 2 Players Engine 11 레이니케 2008.03.28 2294
49 이름입력 [rpg vx]한글 스크립트(저번 것보단 업그레이드 된 것입니다.^^) 17 file 레시온 2008.03.28 4736
48 그래픽 밤낮 변환 VX용 26 독도2005 2008.03.23 4314
47 메뉴 메뉴 배경화면 바꾸는 스크립트 9 독도2005 2008.03.23 4520
46 그래픽 먼가이상한데... 밤낮 변환 vx 44 작은악마 2008.03.18 3414
45 이름입력 한글 이름 입력 스크립트입니다.^^ 14 레시온 2008.03.18 4382
44 파티 최대 파티 늘리는 스크립트 59 file 아방스 2008.03.09 5431
43 메뉴 CogWheel Style Menu Bars 6 아방스 2008.03.09 2777
42 기타 rpg vx 렉 줄이는 스크립트 34 아방스 2008.03.09 4814
41 파티 파티 변경 시스템 21 file 아방스 2008.03.09 3945
40 파티 전투중 파티 변경 스크립트 21 아방스 2008.03.09 3476
39 기타 간단한 스크립트의 사용법 6 아방스 2008.03.09 4552
38 HUD 맵 이름을 띠우는 스크립트 [메시지창] 24 아방스 2008.03.09 4748
Board Pagination Prev 1 ... 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 Next
/ 32