XP 스크립트



#==============================================================================
#  축소 맵의 표시(ver 0.999)
# by 피놀 clum-sea
#==============================================================================


#==============================================================================
# 캐스터 마이즈포인트
#==============================================================================
module PLAN_Map_Window
  WIN_X       = 8         # 윈도우의 X 좌표
  WIN_Y       = 8         # 윈도우의 Y 좌표
  WIN_WIDTH   = 8*32      # 윈도우의 폭
  WIN_HEIGHT  = 6*32      # 윈도우의 높이
  ZOOM        = 4.0       #  프의 축소율(32 * 32 의 타일을 몇분의 1으로 할까)
  WINDOWSKIN  = ""        # 스킨(하늘에서 디폴트)

  ON_OFF_KEY  = Input::A  # 윈도우의 온 오프를 바꾸는 버튼

  SWITCH      = 1         # 맵 윈도우 표시 금지용의 스윗치 번호
                          # (ON로 표시 금지, OFF로 표시 가능)

  WINDOW_MOVE = true      # 윈도우와 플레이어가 겹쳤을 시 자동적으로 이동할까
                          #  (true:하는, false:하지 않는다)
  OVER_X      = 632 - WIN_WIDTH   # 이동 후의 X 좌표(초기 위치와 왕복합니다)
  OVER_Y      = 8         # 이동 후의 Y 좌표(초기 위치와 왕복합니다)

  OPACITY     = 126       # 맵의 투명도
  C_OPACITY   = 192       # 윈도우의 투명도
  VISIBLE     = true      # 최초, 표시할까 하지 않는가(true:하는, false:하지 않는다)
end

#==============================================================================
# 걾 Game_Temp
#==============================================================================
class Game_Temp
  #--------------------------------------------------------------------------
  # ● 공개 인스턴스 변수
  #--------------------------------------------------------------------------
  attr_accessor  :map_visible     # ?맵 윈도우의 표시 상태
  #--------------------------------------------------------------------------
  # ● 오브젝트 초기화
  #--------------------------------------------------------------------------
  alias plan_map_window_initialize initialize
  def initialize
    # 되돌린다
    plan_map_window_initialize
   
    @map_visible = false
  end
end
#==============================================================================
# ■  Scene_Map
#==============================================================================

class Scene_Map
  #--------------------------------------------------------------------------
  # ● 메인 처리
  #--------------------------------------------------------------------------
  alias plan_map_window_main main
  def main
    # 윈도우를 작성
    @map_window         = Window_Map.new
    @map_window.visible = $game_temp.map_visible
    # 되돌린다
    plan_map_window_main
    # 메세지 윈도우를 해방
    @map_window.dispose
  end
  #--------------------------------------------------------------------------
  # ● 프레임 갱신
  #--------------------------------------------------------------------------
  alias plan_map_window_update update
  def update
    # visible 를 기억
    $game_temp.map_visible = @map_window.visible
    # 되돌린다
    plan_map_window_update
   
    # 금지가 아니면, 변환 처리
    unless $game_switches[PLAN_Map_Window::SWITCH]      
      # 표시되고 있는 경우, 비표시로 한다
      if Input.trigger?(PLAN_Map_Window::ON_OFF_KEY)
        # 표시되어 있지 않은 경우, 표시한다
        if @map_window.visible
          @map_window.visible = false
          # 표시되어 있지 않은 경우, 표시한다
        else
          @map_window.visible = true
        end
      end
    # 금지의 경우는 강제적으로 비표시
    else
      if @map_window.visible
        @map_window.visible = false
      end
    end
    # 표시되고 있을 때만 갱신
    if @map_window.visible
      @map_window.update
    end
  end
  #--------------------------------------------------------------------------
  # ● 플레이어의 장소 이동
  #--------------------------------------------------------------------------
  alias plan_map_window_transfer_player transfer_player
  def transfer_player
    #  visible 를 기억
    visible = @map_window.visible
    @map_window.visible = false
    # 되돌린다
    plan_map_window_transfer_player
    # 맵 윈도우를 해방
    @map_window.dispose
    # 맵 윈도우를 작성
    @map_window = Window_Map.new
    # 표시 설정을 전맵 상태에 되돌린다
    @map_window.visible = visible
  end
end


#==============================================================================
# ■ Window_Map
#==============================================================================

class Window_Map < Window_Base
  #--------------------------------------------------------------------------
  # 타일 맵의 경우
  #--------------------------------------------------------------------------
  def initialize
    x = PLAN_Map_Window::WIN_X
    y = PLAN_Map_Window::WIN_Y
    w = PLAN_Map_Window::WIN_WIDTH
    h = PLAN_Map_Window::WIN_HEIGHT
    super(x, y, w, h)
    unless PLAN_Map_Window::WINDOWSKIN.empty?
      self.windowskin = RPG::Cache.windowskin(PLAN_Map_Window::WINDOWSKIN)
    end
    self.contents = Bitmap.new(width - 32, height - 32)
    self.opacity = PLAN_Map_Window::OPACITY
    self.contents_opacity = PLAN_Map_Window::C_OPACITY
    @map_data = $game_map.data
    # ?귽깑?긞긵귩띿맟
    @tileset = RPG::Cache.tileset($game_map.tileset_name)
    @autotiles = []
    for i in 0..6
      autotile_name = $game_map.autotile_names[i]
      @autotiles[i] = RPG::Cache.autotile(autotile_name)
    end
    # 뙸띪궻긵깒귽깂?댧뭫귩둴뺎
    @old_real_x = $game_player.real_x
    @old_real_y = $game_player.real_y
    # ?긞긵궻멣뫬?궻띿맟
    @all_map = make_all_map
    # ?렑갋뷄?렑귩먠믦
    self.visible = PLAN_Map_Window::VISIBLE
    # ?됪
    refresh
  end
  #--------------------------------------------------------------------------
  # 걶 ?긞긵궻멣뫬?궻띿맟걁뢫룷빾듂븊궖걂
  #--------------------------------------------------------------------------
  def make_all_map
    all_map = Bitmap.new($game_map.width * 32, $game_map.height * 32)
    for y in 0...$game_map.height
      for x in 0...$game_map.width
        for z in 0...3
          tile_num = @map_data[x, y, z]
          next if tile_num == nil
          # 긆?긣?귽깑궻뤾뜃
          if tile_num < 384
            # 뗴?귽깑궻뤾뜃궼궴궽궥
            if tile_num >= 48
              tile_num -= 48
              src_rect = Rect.new(32, 2 * 32, 32, 32)
              all_map.blt(x * 32, y * 32, @autotiles[tile_num / 48], src_rect)
            end
          # 타일 맵의 경우
          else
            tile_num -= 384
            src_rect = Rect.new(tile_num % 8 * 32, tile_num / 8 * 32, 32, 32)
            all_map.blt(x * 32, y * 32, @tileset, src_rect)
          end
        end
      end
    end
    # 전체 맵으로부터 축소 맵에
    w = ($game_map.width / PLAN_Map_Window::ZOOM) * 32
    h = ($game_map.height / PLAN_Map_Window::ZOOM) * 32
    ret_bitmap = Bitmap.new(w, h)
    src_rect = Rect.new(0, 0, all_map.width, all_map.height)
    dest_rect = Rect.new(0, 0, ret_bitmap.width, ret_bitmap.height)
    ret_bitmap.stretch_blt(dest_rect, all_map, src_rect)
    all_map.dispose
    return ret_bitmap
  end
  #--------------------------------------------------------------------------
  # ● 리프레쉬
  #--------------------------------------------------------------------------
  def refresh
    self.contents.clear
    # 축소 맵 표시
    one_tile_size = 32 / PLAN_Map_Window::ZOOM
    x = $game_player.real_x - 128 * (self.contents.width / one_tile_size) / 2
    y = $game_player.real_y - 128 * (self.contents.height / one_tile_size) / 2
    x = x * one_tile_size / 128
    y = y * one_tile_size / 128
   
    # 스크롤 스톱 처리(옆)
    # 캐릭터의 위치(contents 의 중앙)
    half_width = self.contents.width * 128 / 2
    # 캐릭터의 위치(실위치)~맵의 구석까지의 나머지폭
    rest_width = ($game_map.width * 128 - $game_player.real_x) * one_tile_size
    # 윈도우보다 맵의 폭이 작으면
    rev_x = 0
    # 맵이 윈도우보다 작은 경우는 중앙 표시
    if @all_map.width < self.contents.width
      rev_x = (half_width - $game_player.real_x * one_tile_size) / 128
      rev_x -= (self.contents.width - @all_map.width) / 2
      x += rev_x
    # 뜺궕?긞긵궻?귩뮪궑궫귞
    elsif half_width > $game_player.real_x * one_tile_size
      rev_x = (half_width - $game_player.real_x * one_tile_size) / 128
      x += rev_x
    # 오른쪽이 맵의 구석을 넘으면
    elsif half_width > rest_width
      rev_x = -((half_width - rest_width) / 128)
      x += rev_x
    end
   
    # 스크롤 스톱 처리(세로)
    # 캐릭터의 정도 치(contents 의 중앙)
    half_height = self.contents.height * 128 / 2
    # 캐릭터의 위치(실위치)~맵의 구석까지의 나머지 높이
    rest_height = ($game_map.height * 128 - $game_player.real_y) * one_tile_size
    # 윈도우보다 맵의 폭이 작으면
    rev_y = 0
    # 맵이 윈도우보다 작은 경우는 중앙 표시
    if @all_map.height < self.contents.height
      rev_y = (half_height - $game_player.real_y * one_tile_size) / 128
      rev_y -= (self.contents.height - @all_map.height) / 2
      y += rev_y
    # 오른쪽이 맵의 구석을 넘으면
    elsif half_height > $game_player.real_y * one_tile_size
      rev_y = (half_height - $game_player.real_y * one_tile_size) / 128
      y += rev_y
    # 덭궕?긞긵궻?귩뮪궑궫귞
    elsif half_height > rest_height
      rev_y = -((half_height - rest_height) / 128)
      y += rev_y
    end
   
    src_rect = Rect.new(x, y, self.contents.width, self.contents.height)
    self.contents.blt(0, 0, @all_map, src_rect)
    # 윈도우의 이동 처리
    if PLAN_Map_Window::WINDOW_MOVE == true
      # 윈도우의 범위를 취득(범위 오브젝트)
      w = self.x..self.x + self.width
      h = self.y..self.y + self.height
      # 플레이어가 윈도우의 범위내에 들어갔을 경우
      if w === $game_player.screen_x and h === $game_player.screen_y
        # 이동 장소 판정
        # 초기 위치라면
        if self.x == PLAN_Map_Window::WIN_X and self.y == PLAN_Map_Window::WIN_Y
          # 이동 후의 좌표에 이동
          self.x = PLAN_Map_Window::OVER_X
          self.y = PLAN_Map_Window::OVER_Y
        # 초기 위치가 아닌 경우
        else
          # 초기 위치에 이동
          self.x = PLAN_Map_Window::WIN_X
          self.y = PLAN_Map_Window::WIN_Y
        end
      end
    end
    # 액터가 있는 경우는 최초의 액터를 맵에 표시
    if $game_party.actors.size > 0
      # priority 체크 숨는다면 액터비표시
      for i in [2, 1, 0]
        tile = @map_data[$game_player.x, $game_player.y, i]
        next if tile == 0
        return if $game_map.priorities[tile] > 0
      end
      actor = $game_party.actors[0]
      bitmap = RPG::Cache.character(actor.character_name, actor.character_hue)
      width = bitmap.width / 4
      height = bitmap.height / 4
      src_rect = Rect.new(0, 0, width, height)
      # 액터를 중앙에 표시
      w = width / PLAN_Map_Window::ZOOM
      h = height / PLAN_Map_Window::ZOOM
      # 타일의 폭만 짝수이므로 반타일분 늦춘다
      x = self.contents.width / 2 - w / 2 + one_tile_size / 2 - rev_x
      y = self.contents.height / 2 - h / 2 - rev_y
      dest_rect = Rect.new(x, y, w, h)
      self.contents.stretch_blt(dest_rect, bitmap, src_rect)
    end
  end
  #--------------------------------------------------------------------------
  # ● 프레임 갱신
  #--------------------------------------------------------------------------
  def update
    super
    if @old_real_x != $game_player.real_x or @old_real_y != $game_player.real_y
      @old_real_x = $game_player.real_x
      @old_real_y = $game_player.real_y
      refresh
    end
  end
  #--------------------------------------------------------------------------
  # ● 해방
  #--------------------------------------------------------------------------
  def dispose
    super
    @all_map.dispose
  end
end

Who's 아방스

profile
Atachment
첨부 '1'
Comment '13'
  • ?
    무한푸우 2008.02.20 15:59
    맵이 넓은 게임에서 쓰면 효율적일것 같네요.
  • ?
    강이 2008.02.25 15:34
    이런거면 게임을 하는데 상당한 지장이 많을 것 같습니다. 결정키는 어떻게 눌러야하나요? 그리고 눌러진다해도 미니맵이 켜지지 안습니까;;
  • ?
    오미트론 2008.02.28 16:49
    잘 봤습니다.
  • ?
    썽게군 2008.03.13 21:43
    와후 짱이다
    그런데 오류가뜨네..
  • ?
    에이스 2008.06.19 23:11
    오오 좋군요..그런데 밑에 그냥 미니맵 추가랑 다른개념인가요?
  • ?
    rpg I♡you 2008.07.15 22:00
    ㄳ요emoticon
  • ?
    가시고기 2008.08.05 16:51
    ㄳ VX로 쓰고 싶다..
  • ?
    새벽의물방울 2010.01.04 17:41

    감상

  • ?
    룰랄루루 2010.01.04 20:25

    오~ 참좋은 스크립트네요

  • ?
    1000℃ 복숭아 2010.01.23 14:10

    Z키를 눌러도 나오지않는 현상이...

  • ?
    RPGmaker1998 2010.06.01 17:49

    잘되는군요. 아방스님 감사합니다!!!

  • ?
    David:) 2011.06.11 19:38

    좋은 스크립트 감사합니다 ㅎㅎ 잘되네요

  • ?
    캉쿤 2011.08.27 11:50

    헐.. 안된다...


List of Articles
번호 분류 제목 글쓴이 날짜 조회 수
공지 스크립트 자료 게시물 작성시 주의사항 습작 2012.12.24 6153
1021 아이템 흠..몬스터도감말고 아이템도감~ 9 백호 2009.02.21 2028
1020 전투 흠.. 아직도 이 스크립트가 없군요 ㅋㅋ(제가올림..) 1 file 백호 2009.02.21 3334
1019 전투 횡스크롤형식의 스크립트 7 백호 2009.02.21 2951
1018 기타 횡스크롤 스크립트 한국말 번역. 15 file 백호 2009.02.21 3311
1017 기타 회복으로 데미지를 받는 좀비 스크립트 7 백호 2009.02.22 2004
1016 메뉴 화살표 모양 셀렉트 커서 사용 2 백호 2009.02.22 2118
1015 그래픽 화면을 부드럽게 해주는스크립트[ 아주 유용] 56 file - 하늘 - 2009.08.05 6561
1014 미니맵 화면에 축소된 미니맵을 표시하는 스크립트 - 한글 번역 - 6 file 백호 2009.02.21 2559
1013 화면에 축소된 맵을 표시하는 스크립트 7 file 백호 2009.02.21 2394
1012 기타 홈페이지 띄우기 (VX 상관없음.) 6 KNAVE 2009.08.25 2137
1011 메뉴 혹시있나해서-_-.. 대화창에 테두리치기 스크립트 7 백호 2009.02.22 2591
1010 기타 현재시간표시 33 file 코아 코스튬 2010.10.09 2528
1009 기타 현재 맵BGM을 그대로 전투 BGM으로 연결 from phylomortis.com 백호 2009.02.22 1180
1008 이름입력 한글조합입력기(영어가능) file 조규진1 2019.11.10 492
1007 메시지 한글자씩 뜨는 스크립트 6 백호 2009.02.21 2999
1006 키입력 한글입력스크립트 16 file 아방스 2007.11.09 11823
1005 키입력 한글입력기(자음, 모음 분리. 아마 중복일 듯...) 11 캉쿤 2011.09.13 3225
1004 키입력 한글입력기 6 백호 2009.02.22 4295
1003 이름입력 한글이름 입력기 스크립트 14 백호 2009.02.22 4205
1002 메시지 한글 채팅 스크립트 32 file こなた 2009.01.22 4947
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