RPGXP 스크립트
2013.09.24 08:10

자동으로 장애물을 피해가는 스크립트

조회 수 860 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄

9c8e14ff44826c91712fff9d5efce1cf-.jpg


#============================================================================== 
# ** Game_Player 
#------------------------------------------------------------------------------ 
#  장애물을 자동으로 피해가는 스크립트 - 준돌 


#  방향키를 지속적으로 누르고 있을경우 앞에 장애물을 
#  옆으로 틀어서 피해지나갑니다. 
#============================================================================== 

class Game_Player < Game_Character 
  #-------------------------------------------------------------------------- 
  # * Invariables 
  #-------------------------------------------------------------------------- 
  CENTER_X = (320 - 16) * 4  # Center screen x-coordinate * 4 
  CENTER_Y = (240 - 16) * 4  # Center screen y-coordinate * 4 
  #-------------------------------------------------------------------------- 
  # * Passable Determinants 
  #    x : x-coordinate 
  #    y : y-coordinate 
  #    d : direction (0,2,4,6,8) 
  #        * 0 = Determines if all directions are impassable (for jumping) 
  #-------------------------------------------------------------------------- 
  def passable?(x, y, d) 
    # Get new coordinates 
    new_x = x + (d == 6 ? 1 : d == 4 ? -1 : 0) 
    new_y = y + (d == 2 ? 1 : d == 8 ? -1 : 0) 
    # If coordinates are outside of map 
    unless $game_map.valid?(new_x, new_y) 
      # Impassable 
      return false 
    end 
    # If debug mode is ON and ctrl key was pressed 
    if $DEBUG and Input.press?(Input::CTRL) 
      # Passable 
      return true 
    end 
    super 
  end 
  #-------------------------------------------------------------------------- 
  # * Set Map Display Position to Center of Screen 
  #-------------------------------------------------------------------------- 
  def center(x, y) 
    max_x = ($game_map.width - 20) * 128 
    max_y = ($game_map.height - 15) * 128 
    $game_map.display_x = [0, [x * 128 - CENTER_X, max_x].min].max 
    $game_map.display_y = [0, [y * 128 - CENTER_Y, max_y].min].max 
  end 
  #-------------------------------------------------------------------------- 
  # * Move to Designated Position 
  #    x : x-coordinate 
  #    y : y-coordinate 
  #-------------------------------------------------------------------------- 
  def moveto(x, y) 
    super 
    # Centering 
    center(x, y) 
    # Make encounter count 
    make_encounter_count 
  end 
  #-------------------------------------------------------------------------- 
  # * Increaase Steps 
  #-------------------------------------------------------------------------- 
  def increase_steps 
    super 
    # If move route is not forcing 
    unless @move_route_forcing 
      # Increase steps 
      $game_party.increase_steps 
      # Number of steps are an even number 
      if $game_party.steps % 2 == 0 
        # Slip damage check 
        $game_party.check_map_slip_damage 
      end 
    end 
  end 
  #-------------------------------------------------------------------------- 
  # * Get Encounter Count 
  #-------------------------------------------------------------------------- 
  def encounter_count 
    return @encounter_count 
  end 
  #-------------------------------------------------------------------------- 
  # * Make Encounter Count 
  #-------------------------------------------------------------------------- 
  def make_encounter_count 
    # Image of two dice rolling 
    if $game_map.map_id != 0 
      n = $game_map.encounter_step 
      @encounter_count = rand(n) + rand(n) + 1 
    end 
  end 
  #-------------------------------------------------------------------------- 
  # * Refresh 
  #-------------------------------------------------------------------------- 
  def refresh 
    # If party members = 0 
    if $game_party.actors.size == 0 
      # Clear character file name and hue 
      @character_name = "" 
      @character_hue = 0 
      # End method 
      return 
    end 
    # Get lead actor 
    actor = $game_party.actors[0] 
    # Set character file name and hue 
    @character_name = actor.character_name 
    @character_hue = actor.character_hue 
    # Initialize opacity level and blending method 
    @opacity = 255 
    @blend_type = 0 
  end 
  #-------------------------------------------------------------------------- 
  # * Same Position Starting Determinant 
  #-------------------------------------------------------------------------- 
  def check_event_trigger_here(triggers) 
    result = false 
    # If event is running 
    if $game_system.map_interpreter.running? 
      return result 
    end 
    # All event loops 
    for event in $game_map.events.values 
      # If event coordinates and triggers are consistent 
      if event.x == @x and event.y == @y and triggers.include?(event.trigger) 
        # If starting determinant is same position event (other than jumping) 
        if not event.jumping? and event.over_trigger? 
          event.start 
          result = true 
        end 
      end 
    end 
    return result 
  end 
  #-------------------------------------------------------------------------- 
  # * Front Envent Starting Determinant 
  #-------------------------------------------------------------------------- 
  def check_event_trigger_there(triggers) 
    result = false 
    # If event is running 
    if $game_system.map_interpreter.running? 
      return result 
    end 
    # Calculate front event coordinates 
    new_x = @x + (@direction == 6 ? 1 : @direction == 4 ? -1 : 0) 
    new_y = @y + (@direction == 2 ? 1 : @direction == 8 ? -1 : 0) 
    # All event loops 
    for event in $game_map.events.values 
      # If event coordinates and triggers are consistent 
      if event.x == new_x and event.y == new_y and 
        triggers.include?(event.trigger) 
        # If starting determinant is front event (other than jumping) 
        if not event.jumping? and not event.over_trigger? 
          event.start 
          result = true 
        end 
      end 
    end 
    # If fitting event is not found 
    if result == false 
      # If front tile is a counter 
      if $game_map.counter?(new_x, new_y) 
        # Calculate 1 tile inside coordinates 
        new_x += (@direction == 6 ? 1 : @direction == 4 ? -1 : 0) 
        new_y += (@direction == 2 ? 1 : @direction == 8 ? -1 : 0) 
        # All event loops 
        for event in $game_map.events.values 
          # If event coordinates and triggers are consistent 
          if event.x == new_x and event.y == new_y and 
            triggers.include?(event.trigger) 
            # If starting determinant is front event (other than jumping) 
            if not event.jumping? and not event.over_trigger? 
              event.start 
              result = true 
            end 
          end 
        end 
      end 
    end 
    return result 
  end 
  #-------------------------------------------------------------------------- 
  # * Touch Event Starting Determinant 
  #-------------------------------------------------------------------------- 
  def check_event_trigger_touch(x, y) 
    result = false 
    # If event is running 
    if $game_system.map_interpreter.running? 
      return result 
    end 
    # All event loops 
    for event in $game_map.events.values 
      # If event coordinates and triggers are consistent 
      if event.x == x and event.y == y and [1,2].include?(event.trigger) 
        # If starting determinant is front event (other than jumping) 
        if not event.jumping? and not event.over_trigger? 
          event.start 
          result = true 
        end 
      end 
    end 
    return result 
  end 
  #-------------------------------------------------------------------------- 
  # * Frame Update 
  #-------------------------------------------------------------------------- 
  def turn_ai_side 
    case @direction 
    when 2 
      if not passable?(@x, @y, 4) 
      turn_left_90 
      elsif not passable?(@x, @y, 6) 
      turn_right_90 
      else 
        rand(2) == 0 ? turn_right_90 : turn_left_90 
      end 
    when 4 
      if not passable?(@x, @y, 2) 
      turn_right_90 
      elsif not passable?(@x, @y, 8) 
      turn_left_90 
      else 
        rand(2) == 0 ? turn_right_90 : turn_left_90 
      end 
    when 6 
      if not passable?(@x, @y, 2) 
      turn_left_90 
      elsif not passable?(@x, @y, 8) 
      turn_right_90 
      else 
        rand(2) == 0 ? turn_right_90 : turn_left_90 
      end 
    when 8 
      if not passable?(@x, @y, 4) 
      turn_right_90 
      elsif not passable?(@x, @y, 6) 
      turn_left_90 
      else 
        rand(2) == 0 ? turn_right_90 : turn_left_90 
      end 
    end 
  end 
  def update 
    # Remember whether or not moving in local variables 
    last_moving = moving? 
    # If moving, event running, move route forcing, and message window 
    # display are all not occurring 
    unless moving? or $game_system.map_interpreter.running? or 
          @move_route_forcing or $game_temp.message_window_showing 
      # Move player in the direction the directional button is being pressed 
      case Input.dir4 
      when 2 
        move_down 
      when 4 
        move_left 
      when 6 
        move_right 
      when 8 
        move_up 
      end 
    end 
    # Remember coordinates in local variables 
    last_real_x = @real_x 
    last_real_y = @real_y 
    super 
    # If character moves down and is positioned lower than the center 
    # of the screen 
    if @real_y > last_real_y and @real_y - $game_map.display_y > CENTER_Y 
      # Scroll map down 
      $game_map.scroll_down(@real_y - last_real_y) 
    end 
    # If character moves left and is positioned more let on-screen than 
    # center 
    if @real_x < last_real_x and @real_x - $game_map.display_x < CENTER_X 
      # Scroll map left 
      $game_map.scroll_left(last_real_x - @real_x) 
    end 
    # If character moves right and is positioned more right on-screen than 
    # center 
    if @real_x > last_real_x and @real_x - $game_map.display_x > CENTER_X 
      # Scroll map right 
      $game_map.scroll_right(@real_x - last_real_x) 
    end 
    # If character moves up and is positioned higher than the center 
    # of the screen 
    if @real_y < last_real_y and @real_y - $game_map.display_y < CENTER_Y 
      # Scroll map up 
      $game_map.scroll_up(last_real_y - @real_y) 
    end 
    # If not moving 
    unless moving? 
      tc_event = false 
      d = @direction 
      new_x = @x + (d == 6 ? 1 : d == 4 ? -1 : 0) 
      new_y = @y + (d == 2 ? 1 : d == 8 ? -1 : 0) 
      for event in $game_map.events.values 
        tc_event = true if (event.x == new_x and event.y == new_y and [1,2].include?(event.trigger)) 
      end 
      if tc_event == false 
        case Input.dir4 
        when 2 
          if not passable?(@x, @y, d) 
            turn_ai_side 
            move_forward if Input.press? (Input::DOWN) 
          end 
        when 4 
          if not passable?(@x, @y, d) 
            turn_ai_side 
            move_forward if Input.press? (Input::LEFT) 
          end 
        when 6 
          if not passable?(@x, @y, d) 
            turn_ai_side 
            move_forward if Input.press? (Input::RIGHT) 
          end 
        when 8 
          if not passable?(@x, @y, d) 
            turn_ai_side 
            move_forward if Input.press? (Input::UP) 
          end 
        end 
      end 
      # If player was moving last time 
      if last_moving 
        # Event determinant is via touch of same position event 
        result = check_event_trigger_here([1,2]) 
        # If event which started does not exist 
        if result == false 
          # Disregard if debug mode is ON and ctrl key was pressed 
          unless $DEBUG and Input.press?(Input::CTRL) 
            # Encounter countdown 
            if @encounter_count > 0 
              @encounter_count -= 1 
            end 
          end 
        end 
      end 
      # If C button was pressed 
      if Input.trigger?(Input::C) 
        # Same position and front event determinant 
        check_event_trigger_here([0]) 
        check_event_trigger_there([0,1,2]) 
      end 
    end 
  end 
end 

#-------------------------------------------------------------- 





오랜만에 스크립트를 올리네요 ^^; 
예제를 올릴려고 했는데... 제가 1.02a버전으로 옮겨서 
스크립트만 올렸습니다 
적용하시려면 스크립트란에서 Game_Player 섹션을 
이스크립트로 갈아치우시거나 
main위에 찔러넣으시면 됩니다. 


이스크립트는 
그림과 같이 방향키를 꾸욱 누르고있으면 
장해물을 오른쪽이나 왼쪽으로 돌아서 피해갑니다 
하지만 앞과 오른쪽이 동시에 막혀있으면 
자동으로 왼쪽으로 틀어서 쓸대없는 방향전환은 하지 않습니다 

그리고 이벤트실행을 해야하는데 
스크립트와 충돌하여 이벤트를 피해가는일이 벌어지지 않도록 
처리해두었습니다... 


그럼 많이 이용해주세요 ^^ 

열제~


출처: 게임공작소

?

List of Articles
번호 분류 제목 글쓴이 날짜 조회 수 추천 수
228 RPGVX Ace 스크립트 지속데미지 스크립트(MBS) 天下太平 2016.02.14 1516 0
227 RPGXP 스크립트 죽었을경우 마을로이동 스크립트 1 청담 2013.09.24 1065 0
226 RPGXP 스크립트 정지 모션 스크립트 2 2013.09.26 713 1
225 RPGMV 플러그인 점프 액션 플러그인. 3 file plam 2015.11.07 1216 0
224 RPGMV 플러그인 전투속도 고속화 플러그인. 1 file 파란별빛 2015.10.24 1097 0
223 RPGMV 플러그인 전투 도중 멤버교체가 가능해지는 플러그인 2 file Wailer 2016.01.13 1298 0
222 RPGXP 스크립트 전메뉴 반투명화 2 2013.10.01 768 0
221 RPGXP 스크립트 장비제련 스크립트 청담 2013.09.24 1024 0
220 RPGXP 스크립트 장비 레벨 제한 2 2013.10.01 903 1
» RPGXP 스크립트 자동으로 장애물을 피해가는 스크립트 청담 2013.09.24 860 0
218 RPGXP 스크립트 자동 세이브 스크립트 1 청담 2013.09.24 841 0
217 RPGXP 스크립트 일시정지 스크립트 2 청담 2013.09.29 929 0
216 RPGVX 스크립트 이벤트커맨드 스크립트 조건분기법 모음 1 Evangelista 2009.11.18 2589 2
215 RPGVX 스크립트 이벤트커맨드 스크립트 조건분기법 모음 1 Evangelista 2009.11.18 2533 2
214 RPGVX 스크립트 이벤트커맨드 스크립트 사용법 모음 2 Evangelista 2009.07.21 2530 2
213 RPGVX 스크립트 이벤트커맨드 스크립트 사용법 모음 2 Evangelista 2009.07.21 2645 2
212 RPGVX 스크립트 이벤트커맨드 스크립트 관련 설명 3 Evangelista 2009.01.29 2163 3
211 RPGVX 스크립트 이벤트커맨드 스크립트 관련 설명 3 Evangelista 2009.01.29 2655 3
210 RPGMV 플러그인 이벤트(엑스트라) 좌표 콘트롤 플러그인(Move Route Extras - Version 1.1) 1 plam 2015.11.07 858 0
209 RPGMV 플러그인 이벤트 자동 추적 플러그인 2 file 러닝은빛 2016.04.27 2704 3
Board Pagination Prev 1 2 3 4 5 6 7 8 9 10 ... 15 Next
/ 15






[개인정보취급방침] | [이용약관] | [제휴문의] | [후원창구] | [인디사이드연혁]

Copyright © 1999 - 2016 INdiSide.com/(주)씨엘쓰리디 All Rights Reserved.
인디사이드 운영자 : 천무(이지선) | kernys(김원배) | 사신지(김병국)