조회 수 1373 추천 수 0 댓글 1
?

단축키

Prev이전 문서

Next다음 문서

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

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
미니맵이 필요해서 그런데 너무 궁금하네요
괜찮은거 추천해주세요
?
  • ?
    HONG2NVang 2016.03.03 18:21
    #==============================================================================
    # 축소 맵의 표시(ver 0.999)
    # by 피놀 clum-sea
    #==============================================================================


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

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

    SWITCH = 40 # 맵 윈도우 표시 금지용의 스윗치 번호
    # (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 = true
    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 = true
    # 표시되어 있지 않은 경우, 표시한다
    else
    @map_window.visible = true
    end
    end
    # 금지의 경우는 강제적으로 비표시
    else
    if @map_window.visible
    @map_window.visible = true
    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 = true
    # 되돌린다
    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
    # ??C????b?v??????
    @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
    # ???????v???C??????u???m??
    @old_real_x = $game_player.real_x
    @old_real_y = $game_player.real_y
    # ??b?v???S?????????
    @all_map = make_all_map
    # ????E???????????
    self.visible = PLAN_Map_Window::VISIBLE
    # ???
    refresh
    end
    #--------------------------------------------------------------------------
    # ?? ??b?v???S??????????i?k???????t???j
    #--------------------------------------------------------------------------
    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
    # ?I??g??C????????
    if tile_num < 384
    # ????C????????????????
    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
    # ??????b?v?????????????
    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
    # ?E????b?v?????????????
    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

List of Articles
번호 제목 글쓴이 날짜 조회 수
8827 형제들이여 !!! 나를 구제해다오!! Ress 2006.01.26 223
8826 형제들이여 !!! 나를 구제해다오!! KaSsia 2006.01.25 263
8825 rpg2003에서 music음향이 작업시에는 실행되는데 게임을 실행하면 않되네요 ★샤일☆ 2007.01.03 784
8824 RPG2003의 그림들의 사이즈... MiNi'M' 2006.02.21 821
8823 RPG만들기2003에 관하여...정말 굼금해요~!~부탁드림 ∑☆メ이누∴。』 2005.08.09 577
8822 게이지바 구동 방법좀 <<게이지 유>> file 랑이a 2006.07.03 429
8821 길드는 어떻게 만드나요? 루넨스 2009.06.15 974
8820 길드는 어떻게 만드나요? 제로스 2009.06.15 1232
8819 동영상 관련및.. 급해요 ㅠ RML 2006.07.12 1483
8818 마법 연계 다시 질문!!! 제발 대답부탁!!; file 나르카이제 2005.06.15 331
8817 몬스터가없으면 다른곳으로 자동이동가능? Novelist 2006.08.29 277
8816 몬스터가없으면 다른곳으로 자동이동가능? CredMotion 2006.08.29 341
8815 스크립트로요,, 이동하는걸 보드게임처럼 할순 없나요? XLostTimesX 2006.01.09 429
8814 아이템창 같은 단축창를 만들려고하는데..[rpg2003] ScolPion 2006.04.15 572
8813 아이템창 같은 단축창를 만들려고하는데..[rpg2003] 방콕족의생활 2006.04.15 786
8812 질문! file 『Q트_아키』 2005.05.22 494
8811 "스크립트 데이터 읽기 실패" 라고 뜨는데.. 김세츠나 2009.07.31 1062
8810 "클래스가 등록되지 않았습니다"라니 -0-;;[RPG2003] Chrishyua .E 2007.03.02 700
8809 "클래스가 등록되지 않았습니다"라니 -0-;;[RPG2003] =ROD= 2007.03.07 886
8808 "파일 dmd 은 열지 않습니다" 이리저디 옮겼는데.. 윈드 2006.08.18 208
Board Pagination Prev 1 2 3 4 5 6 7 8 9 10 ... 442 Next
/ 442


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

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