XP 스크립트

#==============================================================================
# ■ 오토 매핑
#------------------------------------------------------------------------------
# ver 1.00(05/04/27) by 상입오두막 http://aea.to/hako/
#==============================================================================
=begin
 ■ 주로 사용하는 메소드
 
 automaps[id]       : id 차례의 오토 맵을 참조.
 
 visible            : 진정한이라고 하고 표시.
 scope              : 묘화 범위.
 complete           : 모두 통행 한 상태로 한다.
 delete             : 통행 기록을 지운다.
 move(x, y[, center]) : (x, y)에 이동. center가 진정한이라고 하고 원점 중심.
=end

class Game_AutoMap
  #--------------------------------------------------------------------------
  # ● 정수
  #--------------------------------------------------------------------------
  # 오토 맵의 작성을 허가하는 맵 ID의 배열
  AUTOMAPS_ID = [1, 2, 3, 4, 5]
  # 1 타일 근처의 한 변의 길이(pixel 단위)
  TILE_SIZE = 5
  # 통행이 끝난 상태라고 판단되는 범위의 크기(타일 단위)
  SCOPE = 0
end

class Sprite_AutoMap < Sprite
  #--------------------------------------------------------------------------
  # ● 정수
  #--------------------------------------------------------------------------
  # ※불투명도(알파치)를 0으로 하면(자) 무효가 됩니다.
  #-----------------------------------------------
  # 통행이 끝난 에리어의 색(Red, Green, Blue[, Alpha])
  COLOR_FLOOR = Color.new(100, 100, 255, 120)
  # 미통행/통행 불가의 에리어의 색
  COLOR_WALL = Color.new(0, 0, 50, 100)
  # 플레이어 심볼의 색
  COLOR_PLAYER = Color.new(255, 255, 0, 255)
  #-----------------------------------------------
  # 통행이 끝난 에리어에 붙이는 픽쳐 파일, 불투명도
  PASSED_FILE = ["filename", 0]
  # 미통행/통행 불가 에리어에 붙이는 픽쳐 파일, 불투명도
  IMPASSABLE_FILE = ["filename", 0]
  # 플레이어 심볼로서 표시하는 픽쳐 파일, 불투명도
  PLAYER_FILE = ["filename", 0]
end

#==============================================================================
# ■ Interpreter
#==============================================================================
class Interpreter
  #--------------------------------------------------------------------------
  # ● 오토 맵의 데이터를 취득
  #--------------------------------------------------------------------------
  def automaps
    $game_screen.automaps
  end
end

#==============================================================================
# ■ Game_Screen
#==============================================================================
class Game_Screen
  attr_accessor :automaps   # Game_AutoMap 오브젝트를 격납하는 Hash
  alias automapping_100_initialize initialize
  def initialize
    @automaps = {}
    automapping_100_initialize
  end
end

#==============================================================================
# ■ Game_AutoMap
#==============================================================================
class Game_AutoMap
  attr_accessor :player_pos   # 플레이어 좌표
  attr_accessor :showing      # 오토 맵 표시 플래그
  attr_accessor :scope        # 묘화 범위(플레이어로부터의 거리)
  attr_accessor :recording    # 오토 맵 기록 개시 플래그
  attr_reader :calling        # 외부 오토 맵 호출 플래그
  attr_reader :drawn_floor    # 오토 맵의 묘화 정보
  attr_reader :x              # 표시 위치 x
  attr_reader :y              # 표시 위치 y
  attr_reader :tile_size    # 타일의 크기
  attr_reader :width          # 맵의 폭
  attr_reader :height         # 맵의 높이
  attr_reader :passable       # 통행 가능 좌표
  attr_reader :id             # 맵의 ID
  attr_reader :name           # 맵의 이름
  attr_reader :permission     # 오토 맵 작성 허가 플래그
  #--------------------------------------------------------------------------
  # ● 오브젝트 초기화(새로운 맵으로 이동했을 때 실행)
  #--------------------------------------------------------------------------
  def initialize
    @permission = AUTOMAPS_ID.include? ($game_map.map_id)
    return if not @permission
    @recording = false
    @showing = false
    @calling = false
    @player_pos  = [-1, -1]
    @drawn_floor = Table.new($game_map.width, $game_map.height)
    @x = 0
    @y = 0
    @scope = SCOPE
    @tile_size = TILE_SIZE
    @width = $game_map.width
    @height = $game_map.height
    @passable = Table.new(@width, @height)
    for x in 0..@width
      for y in 0..@height
        if $game_map.passable? (x, y, 0)
          @passable[x, y] = 1 # 통행 가능하면 1
        end
      end
    end
    @id = $game_map.map_id
    mapinfo = load_data("Data/MapInfos.rxdata") # RPG::MapInfo(Hash, key:id)
    @name = mapinfo[$game_map.map_id]. name.dup
  end
  #--------------------------------------------------------------------------
  # ● 오토 맵의 기록 개시
  #--------------------------------------------------------------------------
  def setup
    @calling = false
    @player_pos  = [-1, -1]
    @recording = true
    return true
  end
  #--------------------------------------------------------------------------
  # ● 오토 맵의 표시/비표시
  #--------------------------------------------------------------------------
  def visible
    return @showing
  end
  def visible=(visible)
    @calling = (@id != $game_map.map_id)
    @recording = true
    @player_pos = [-1, -1]
    @showing = visible
  end
  #--------------------------------------------------------------------------
  # ● 오토 맵의 완성
  #--------------------------------------------------------------------------
  def complete
    for x in 0..@width
      for y in 0..@height
        @drawn_floor[x, y] = 1 if @passable[x, y] == 1
      end
    end
    return true
  end
  #--------------------------------------------------------------------------
  # ● 오토 맵의 소거
  #--------------------------------------------------------------------------
  def delete
    for x in 0..@width
      for y in 0..@height
        @drawn_floor[x, y] = 0
      end
    end
    @showing = false
    @player_pos = [-1, -1]
    @calling = false
    return true
  end
  #--------------------------------------------------------------------------
  # ● 오토 맵의 이동
  #--------------------------------------------------------------------------
  def move(x, y, center = false)
    if center
      @x = (640 - @width  * @tile_size) / 2
      @y = (480 - @height * @tile_size) / 2
    else
      @x = x
      @y = y
    end
    return true
  end
end

#==============================================================================
# ■ Spriteset_Map
#==============================================================================
class Spriteset_Map
  alias automapping_100_initialize initialize
  def initialize
    amaps = $game_screen.automaps
    # 현재의 맵의 오토 맵이 존재하지 않는다
    if not amaps.include? ($game_map.map_id)
      # 맵 ID를 키로서 Game_AutoMap 오브젝트를 생성
      amaps[$game_map.map_id] = Game_AutoMap.new
      # 오토 맵의 작성이 허가되어 있지 않은 경우
      if not amaps[$game_map.map_id]. permission
        amaps.delete($game_map.map_id)
      end
    end
    if amaps.include? ($game_map.map_id)
      # 0번에 현재의 맵을 관련짓는다
      amaps.delete(0)
      amaps[0] = amaps[$game_map.map_id]
      # 플레이어 위치의 기록을 개시
      amaps[$game_map.map_id]. setup
    end
    @viewport_automap = Viewport.new(0, 0, 640, 480)
    @viewport_automap.z = 198 # 오토 맵의 Z좌표
    @automap_sprites = []
    # 지금까지 작성된 모든 오토 맵의 스프라이트 생성
    for map_id in amaps.keys
      next if map_id == 0
      @automap_sprites << Sprite_AutoMap.new(@viewport_automap, amaps[map_id])
    end
    automapping_100_initialize
  end
  alias automapping_100_dispose dispose
  def dispose
    for sprite in @automap_sprites
      sprite.dispose
    end
    automapping_100_dispose
    @viewport_automap.dispose
  end
  alias automapping_100_update update
  def update
    for sprite in @automap_sprites
      sprite.update
    end
    automapping_100_update
    @viewport_automap.update
  end
end

#==============================================================================
# ■ Sprite_AutoMap
#==============================================================================
class Sprite_AutoMap < Sprite
  #--------------------------------------------------------------------------
  # ● 오브젝트 초기화
  #   viewport :뷰포트,  automap :Game_AutoMap
  #--------------------------------------------------------------------------
  def initialize(viewport, automap)
    super(viewport)
    @automap = automap
    w = @automap.width * @automap.tile_size
    h = @automap.height * @automap.tile_size
    self.bitmap = Bitmap.new(w, h)
    # 전송용의 구형
    @rect = Rect.new(0, 0, 0, 0)
    # 오토 맵의 화상
    if PASSED_FILE[1] > 0
      @floor_bitmap = RPG::Cache.picture(PASSED_FILE[0])
    end
    if IMPASSABLE_FILE[1] > 0
      @wall_bitmap = RPG::Cache.picture(IMPASSABLE_FILE[0])
    end
    # 플레이어 심볼 묘화
    @player_symbol = Sprite.new(viewport)
    if PLAYER_FILE[1] > 0
      @player_symbol.bitmap = RPG::Cache.picture(PLAYER_FILE[0])
      @player_symbol.ox=(@player_symbol.bitmap.width - @automap.tile_size)/2
      @player_symbol.oy = @player_symbol.bitmap.height / 2
      @player_symbol.visible = false
    else
      @player_symbol.bitmap = Bitmap.new(w, h)
    end
    update
  end
  #--------------------------------------------------------------------------
  # ● 프레임 갱신
  #--------------------------------------------------------------------------
  def update
    if not @automap.recording
      return
    end
    # 플레이어의 위치가 같은(이동하고 있지 않다) 경우
    if @automap.player_pos == [$game_player.x, $game_player.y]
      return
    end
    self.x = @player_symbol.x = @automap.x
    self.y = @player_symbol.y = @automap.y
    self.visible = @player_symbol.visible = @automap.showing
    @automap.player_pos = [$game_player.x, $game_player.y]
    len = @automap.tile_size
    # 별맵으로부터의 호출의 경우
    if @automap.calling
      # 통행이 끝난 에리어 묘화
      if PASSED_FILE[1] > 0
        draw_passable_picture(len)
      elsif COLOR_FLOOR.alpha > 0
        draw_passable(len)
      end
      # 미통행/통행 불가 에리어 묘화
      if IMPASSABLE_FILE[1] > 0
        draw_impassable_picture(len)
      elsif COLOR_WALL.alpha > 0
        draw_impassable(len)
      end
      return
    end
    # 묘화 범위 취득
    x_min = [0, $game_player.x - @automap.scope]. max
    x_max = [@automap.width, $game_player.x + @automap.scope]. min
    y_min = [0, $game_player.y - @automap.scope]. max
    y_max = [@automap.height, $game_player.y + @automap.scope]. min
    for x in x_min..x_max
      for y in y_min..y_max
        # 미통행 and 통행 가능
        if @automap.drawn_floor[x, y] == 0 and @automap.passable[x, y] == 1
          # 그 좌표를 보존
          @automap.drawn_floor[x, y] = 1
        end
      end
    end
    if @automap.showing
      self.bitmap.clear
      # 통행이 끝난 에리어 묘화
      if PASSED_FILE[1] > 0
        draw_passable_picture(len)
      elsif COLOR_FLOOR.alpha > 0
        draw_passable(len)
      end
      # 미통행/통행 불가 에리어 묘화
      if IMPASSABLE_FILE[1] > 0
        draw_impassable_picture(len)
      elsif COLOR_WALL.alpha > 0
        draw_impassable(len)
      end
      # 플레이어 심볼 갱신
      if PLAYER_FILE[1] > 0 or COLOR_PLAYER.alpha > 0
        player_symbol_update
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● 통행 에리어 묘화
  #--------------------------------------------------------------------------
  def draw_passable(len)
    for x in 0..@automap.width
      for y in 0..@automap.height
        # 보존된 좌표가 1 의 경우
        if @automap.drawn_floor[x, y] == 1
          # 타일 묘화
          self.bitmap.fill_rect(x*len, y*len, len, len, COLOR_FLOOR)
        end
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● 통행 에리어(픽쳐) 묘화
  #--------------------------------------------------------------------------
  def draw_passable_picture(len)
    for x in 0..@automap.width
      for y in 0..@automap.height
        # 보존된 좌표가 1 의 경우
        if @automap.drawn_floor[x, y] == 1
          @rect.set((x*len) %@floor_bitmap.width, (y*len) %@floor_bitmap.height,
                    len, len)
          # 타일 묘화
          self.bitmap.blt(x*len, y*len,
            @floor_bitmap, @rect, PASSED_FILE[1])
        end
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● 미통행/통행 불가 에리어 묘화
  #--------------------------------------------------------------------------
  def draw_impassable(len)
    for x in 0..@automap.width
      for y in 0..@automap.height
        # 보존된 좌표가 0 의 경우
        if @automap.drawn_floor[x, y] == 0
          # 타일 묘화
          self.bitmap.fill_rect(x*len, y*len, len, len, COLOR_WALL)
        end
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● 미통행/통행 불가 에리어(픽쳐) 묘화
  #--------------------------------------------------------------------------
  def draw_impassable_picture(len)
    for x in 0..@automap.width
      for y in 0..@automap.height
        # 보존된 좌표가 0 의 경우
        if @automap.drawn_floor[x, y] == 0
          @rect.set((x*len) %@wall_bitmap.width, (y*len) %@wall_bitmap.height,
                    len, len)
          # 타일 묘화
          self.bitmap.blt(x*len, y*len, @wall_bitmap, @rect, IMPASSABLE_FILE[1])
        end
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● 플레이어 심볼 갱신
  #--------------------------------------------------------------------------
  def player_symbol_update
    len = @automap.tile_size
    x = $game_player.x * len
    y = $game_player.y * len
    # 픽쳐
    if PLAYER_FILE[1] > 0
      @player_symbol.x += x
      @player_symbol.y += y
      @player_symbol.opacity = PLAYER_FILE[1]
    else
      @player_symbol.bitmap.clear
      @player_symbol.bitmap.fill_rect(x, y, len, len, COLOR_PLAYER)
    end
  end
  #--------------------------------------------------------------------------
  # ● 해방
  #--------------------------------------------------------------------------
  def dispose
    if self.bitmap != nil
      # 다른 맵으로 이동했을 경우는 비표시로 한다
      if $scene.is_a? (Scene_Map)
        @automap.showing = false
        @automap.recording = false
      end
      @automap.player_pos = [-1, -1]
      self.bitmap.dispose
      self.bitmap = nil
      @player_symbol.bitmap.dispose
      @player_symbol.bitmap = nil
    end
    super
  end
end
------------------------------------------------------------------------절취선[절취선까지 할시엔 오류끔]-------------------------------------------------------------
스크립트 사용법:파일 첨부해놧음

Comment '16'

List of Articles
번호 분류 제목 글쓴이 날짜 조회 수
공지 스크립트 자료 게시물 작성시 주의사항 습작 2012.12.24 6153
1021 키입력 한글입력스크립트 16 file 아방스 2007.11.09 11823
1020 온라인 채팅 가능 온라인 스크립트 배포 107 file 아방스 2009.01.03 10680
1019 온라인 RPG 만들기 xp 온라인 스크립트 33 아방스 2007.11.09 9592
1018 맵/타일 [유니크급] RPG XP 게임을 3D화로 보자! Neo Mode7 script / 52 file 쉴더 2009.02.28 9442
1017 온라인 온라인 스크립트 Unis Net RMXP 공식 배포! 25 file 뮤바보 2011.12.25 9400
1016 온라인 광넷[ 광땡 온라인 + 넷플레이 ] 62 - 하늘 - 2009.08.02 9003
1015 전투 [액알]neo_a-rpg_module_1[1][1].2 스크립트 83 file 은빛바람 2009.10.03 8298
1014 이름입력 대화창에 얼굴, 이름 띄우기 37 킬라롯 2008.11.09 7496
1013 온라인 넷플레이1.7.0+abs5.5+한챗 49 쀍뛝쒧 2009.01.24 7286
1012 메뉴 메이플스토리처럼 메뉴를^^ 57 file 딸기님 2010.07.13 7141
1011 메시지 대화창에 얼굴 그래픽 띠우기 73 아방스 2007.11.09 7119
1010 스킬 ABP액알 v1.2 스킬추가, 버그수정판 36 file 백호 2009.02.22 6919
1009 전투 [신기술 체험] 강회된 횡스크롤 액알 13 file 백호 2009.02.22 6841
1008 메뉴 온라인메뉴처럼!! 메이플 메뉴처럼!! 변신~스크립트 33 WMN 2008.03.17 6816
1007 그래픽 화면을 부드럽게 해주는스크립트[ 아주 유용] 56 file - 하늘 - 2009.08.05 6561
1006 온라인 Mr.Metring NPE 1.0 [RPG XP 온라인 스크립트] 35 아방스 2009.01.07 6535
1005 이름입력 케릭터 위에 또는 NPC 위에 이름 뛰우기 [헬악이님 제공] 49 file 아방스 2007.11.09 6407
1004 액터 시트르산의 XP용 감정 말풍선 표시 스크립트 37 file 시트르산 2011.01.25 6110
1003 HUD 주인공,NPC이름 머리 나타내기 49 file 송긔 2010.11.28 6060
1002 전투 액알 스크립트 24 백호 2009.02.22 6013
Board Pagination Prev 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ... 52 Next
/ 52