Ace 스크립트

화면에 미니맵를 표시합니다.

주요 기능

  • 통행 가능한 영역과 통행 불가능한 영역의 색상
  • 플레이어 및 이벤트 강조 (착색)
  • 버튼으로 디스플레이 전환

VX 버전의 기능

  • 4 방향 통행을 미니맵에 반영
  • 버튼으로 디스플레이 전환 기능
    • 이벤트 명령의 전환도 건재합니다
  • 색칠 방법을 주석 방식으로 변경
    • 이벤트 페이지마다 색을 바꿀 수 있습니다



minimap01.jpg



#_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/

#_/    ◆ ミニマップ - KMS_MiniMap ◆ VX Ace ◆

#_/    ◇ Last update : 2012/01/14  (TOMY@Kamesoft) ◇

#_/----------------------------------------------------------------------------

#_/  ミニマップ表示機能を追加します。

#_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/


#==============================================================================

# ★ 設定項目 - BEGIN Setting ★

#==============================================================================


module KMS_MiniMap

  # ◆ ミニマップ表示切替ボタン

  #  nil にするとボタン切り替え無効。

  SWITCH_BUTTON = :Z


  # ◆ ミニマップ表示位置・サイズ (X, Y, 幅, 高さ)

  MAP_RECT = Rect.new(364, 20, 160, 120)

  # ◆ ミニマップの Z 座標

  #  大きくしすぎると色々なものに被ります。

  MAP_Z = 0

  # ◆ 1マスのサイズ

  #  3 以上を推奨。

  GRID_SIZE = 5


  # ◆ ミニマップカラー

  FOREGROUND_COLOR = Color.new(192, 192, 224, 160)  # 前景色 (通行可)

  BACKGROUND_COLOR = Color.new(  0,   0, 160, 160)  # 背景色 (通行不可)

  POSITION_COLOR   = Color.new(255,   0,   0, 192)  # 現在位置

  MOVE_EVENT_COLOR = Color.new(255, 160,   0, 192)  # マップ移動イベント

  VEHICLE_COLOR    = Color.new( 96, 128,   0, 192)  # 乗り物


  # ◆ オブジェクトの色

  #  要素の先頭から順に OBJ1, OBJ2, ... に対応。

  OBJECT_COLOR = [

    Color.new(  0, 128,   0, 192),  # OBJ 1

    Color.new(  0, 160, 160, 192),  # OBJ 2

    Color.new(160,   0, 160, 192),  # OBJ 3

  ]  # ← この ] は消さないこと!


  # ◆ アイコンの点滅の強さ

  #  5 ~ 8 あたりを推奨。

  BLINK_LEVEL = 7


  # ◆ マップのキャッシュ数

  #  この数を超えると、長期間参照していないものから削除。

  CACHE_NUM = 10

end


#==============================================================================

# ☆ 設定ここまで - END Setting ☆

#==============================================================================


$kms_imported = {} if $kms_imported == nil

$kms_imported["MiniMap"] = true


module KMS_MiniMap

  # ミニマップ非表示

  REGEX_NO_MINIMAP_NOTE = /<(?:ミニマップ|MINIMAP)\s*(?:非表示|HIDE)>/i

  REGEX_NO_MINIMAP_NAME = /\[NOMAP\]/i


  # 障害物

  REGEX_WALL_EVENT = /<(?:ミニマップ|MINIMAP)\s*(?:壁|障害物|WALL)>/i


  # 移動イベント

  REGEX_MOVE_EVENT = /<(?:ミニマップ|MINIMAP)\s*(?:移動|MOVE)>/i


  # オブジェクト

  REGEX_OBJECT = /<(?:ミニマップ|MINIMAP)\s+OBJ(?:ECT)?\s*(\d+)>/i

end


# *****************************************************************************


#==============================================================================

# □ KMS_Commands

#==============================================================================


module KMS_Commands

  module_function

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

  # ○ ミニマップを表示

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

  def show_minimap

    $game_system.minimap_show = true

  end

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

  # ○ ミニマップを隠す

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

  def hide_minimap

    $game_system.minimap_show = false

  end

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

  # ○ ミニマップ表示状態の取得

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

  def minimap_showing?

    return $game_system.minimap_show

  end

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

  # ○ ミニマップをリフレッシュ

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

  def refresh_minimap

    return unless SceneManager.scene_is?(Scene_Map)


    $game_map.refresh if $game_map.need_refresh

    SceneManager.scene.refresh_minimap

  end

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

  # ○ ミニマップのオブジェクトを更新

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

  def update_minimap_object

    return unless SceneManager.scene_is?(Scene_Map)


    $game_map.refresh if $game_map.need_refresh

    SceneManager.scene.update_minimap_object

  end

end


#==============================================================================

# ■ Game_Interpreter

#==============================================================================


class Game_Interpreter

  # イベントコマンドから直接コマンドを叩けるようにする

  include KMS_Commands

end


#==============================================================================

# ■ RPG::Map

#==============================================================================


class RPG::Map

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

  # ○ ミニマップのキャッシュ生成

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

  def create_minimap_cache

    @__minimap_show = true


    note.each_line { |line|

      if line =~ KMS_MiniMap::REGEX_NO_MINIMAP_NOTE  # マップ非表示

        @__minimap_show = false

      end

    }

  end

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

  # ○ ミニマップ表示

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

  def minimap_show?

    create_minimap_cache if @__minimap_show.nil?

    return @__minimap_show

  end

end


#==============================================================================

# ■ RPG::MapInfo

#==============================================================================


class RPG::MapInfo

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

  # ● マップ名取得

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

  def name

    return @name.gsub(/\[.*\]/) { "" }

  end

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

  # ○ オリジナルマップ名取得

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

  def original_name

    return @name

  end

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

  # ○ ミニマップのキャッシュ生成

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

  def create_minimap_cache

    @__minimap_show = !(@name =~ KMS_MiniMap::REGEX_NO_MINIMAP_NAME)

  end

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

  # ○ ミニマップ表示

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

  def minimap_show?

    create_minimap_cache if @__minimap_show == nil

    return @__minimap_show

  end

end


#==============================================================================

# ■ Game_System

#==============================================================================


class Game_System

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

  # ○ 公開インスタンス変数

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

  attr_accessor :minimap_show

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

  # ○ オブジェクト初期化

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

  alias initialize_KMS_MiniMap initialize

  def initialize

    initialize_KMS_MiniMap


    @minimap_show = true

  end

end


#==============================================================================

# ■ Game_Map

#==============================================================================


class Game_Map

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

  # ○ 定数

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

  MINIMAP_FADE_NONE = 0  # ミニマップ フェードなし

  MINIMAP_FADE_IN   = 1  # ミニマップ フェードイン

  MINIMAP_FADE_OUT  = 2  # ミニマップ フェードアウト

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

  # ○ 公開インスタンス変数

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

  attr_accessor :minimap_fade

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

  # ○ ミニマップを表示するか

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

  def minimap_show?

    return $data_mapinfos[map_id].minimap_show? && @map.minimap_show?

  end

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

  # ○ ミニマップをフェードイン

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

  def fadein_minimap

    @minimap_fade = MINIMAP_FADE_IN

  end

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

  # ○ ミニマップをフェードアウト

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

  def fadeout_minimap

    @minimap_fade = MINIMAP_FADE_OUT

  end

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

  # ● リフレッシュ

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

  alias refresh_KMS_MiniMap refresh

  def refresh

    refresh_KMS_MiniMap


    SceneManager.scene.refresh_minimap if SceneManager.scene_is?(Scene_Map)

  end

end


#==============================================================================

# ■ Game_Event

#==============================================================================


class Game_Event < Game_Character

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

  # ○ ミニマップ用のキャッシュを作成

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

  def __create_minimap_cache

    @__last_page = @page

    @__minimap_wall_event  = false

    @__minimap_move_event  = false

    @__minimap_object_type = -1


    return if @page.nil?


    @page.list.each { |cmd|

      # 注釈以外に到達したら離脱

      break unless [108, 408].include?(cmd.code)


      # 正規表現判定

      case cmd.parameters[0]

      when KMS_MiniMap::REGEX_WALL_EVENT

        @__minimap_wall_event = true

      when KMS_MiniMap::REGEX_MOVE_EVENT

        @__minimap_move_event = true

      when KMS_MiniMap::REGEX_OBJECT

        @__minimap_object_type = $1.to_i

      end

    }

  end

  private :__create_minimap_cache

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

  # ○ グラフィックがあるか

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

  def graphic_exist?

    return (character_name != "" || tile_id > 0)

  end

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

  # ○ 障害物か

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

  def is_minimap_wall_event?

    if @__minimap_wall_event.nil? || @__last_page != @page

      __create_minimap_cache

    end


    return @__minimap_wall_event

  end

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

  # ○ 移動イベントか

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

  def is_minimap_move_event?

    if @__minimap_move_event.nil? || @__last_page != @page

      __create_minimap_cache

    end


    return @__minimap_move_event

  end

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

  # ○ ミニマップオブジェクトか

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

  def is_minimap_object?

    if @__minimap_object_type.nil? || @__last_page != @page

      __create_minimap_cache

    end


    return @__minimap_object_type > 0

  end

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

  # ○ ミニマップオブジェクトタイプ

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

  def minimap_object_type

    if @__minimap_object_type.nil? || @__last_page != @page

      __create_minimap_cache

    end


    return @__minimap_object_type

  end

end


#==============================================================================

# □ Game_MiniMap

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

#   ミニマップを扱うクラスです。

#==============================================================================


class Game_MiniMap

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

  # ○ 構造体

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

  Point = Struct.new(:x, :y)

  Size  = Struct.new(:width, :height)

  PassageCache = Struct.new(:map_id, :table, :scan_table)

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

  # ○ クラス変数

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

  @@passage_cache = []  # 通行フラグテーブルキャッシュ

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

  # ● オブジェクト初期化

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

  def initialize(tilemap)

    @map_rect  = KMS_MiniMap::MAP_RECT

    @grid_size = [KMS_MiniMap::GRID_SIZE, 1].max


    @x = 0

    @y = 0

    @grid_num = Point.new(

      (@map_rect.width  + @grid_size - 1) / @grid_size,

      (@map_rect.height + @grid_size - 1) / @grid_size

    )

    @draw_grid_num    = Point.new(@grid_num.x + 2, @grid_num.y + 2)

    @draw_range_begin = Point.new(0, 0)

    @draw_range_end   = Point.new(0, 0)

    @tilemap = tilemap


    @last_x = $game_player.x

    @last_y = $game_player.y


    @showing = false

    @hiding  = false


    create_sprites

    refresh

  end

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

  # ○ スプライト作成

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

  def create_sprites

    @viewport   = Viewport.new(@map_rect)

    @viewport.z = KMS_MiniMap::MAP_Z


    # ビットマップサイズ計算

    @bmp_size = Size.new(

      (@grid_num.x + 2) * @grid_size,

      (@grid_num.y + 2) * @grid_size

    )

    @buf_bitmap = Bitmap.new(@bmp_size.width, @bmp_size.height)


    # マップ用スプライト作成

    @map_sprite   = Sprite.new(@viewport)

    @map_sprite.x = -@grid_size

    @map_sprite.y = -@grid_size

    @map_sprite.z = 0

    @map_sprite.bitmap = Bitmap.new(@bmp_size.width, @bmp_size.height)


    # オブジェクト用スプライト作成

    @object_sprite   = Sprite_MiniMapIcon.new(@viewport)

    @object_sprite.x = -@grid_size

    @object_sprite.y = -@grid_size

    @object_sprite.z = 1

    @object_sprite.bitmap = Bitmap.new(@bmp_size.width, @bmp_size.height)


    # 現在位置スプライト作成

    @position_sprite   = Sprite_MiniMapIcon.new

    @position_sprite.x = @map_rect.x + @grid_num.x / 2 * @grid_size

    @position_sprite.y = @map_rect.y + @grid_num.y / 2 * @grid_size

    @position_sprite.z = @viewport.z + 2

    bitmap = Bitmap.new(@grid_size, @grid_size)

    bitmap.fill_rect(bitmap.rect, KMS_MiniMap::POSITION_COLOR)

    @position_sprite.bitmap = bitmap

  end

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

  # ● 解放

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

  def dispose

    @buf_bitmap.dispose

    @map_sprite.bitmap.dispose

    @map_sprite.dispose

    @object_sprite.bitmap.dispose

    @object_sprite.dispose

    @position_sprite.bitmap.dispose

    @position_sprite.dispose

    @viewport.dispose

  end

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

  # ○ 可視状態取得

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

  def visible

    return @map_sprite.visible

  end

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

  # ○ 可視状態設定

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

  def visible=(value)

    @viewport.visible        = value

    @map_sprite.visible      = value

    @object_sprite.visible   = value

    @position_sprite.visible = value

  end

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

  # ○ 不透明度取得

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

  def opacity

    return @map_sprite.opacity

  end

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

  # ○ 不透明度設定

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

  def opacity=(value)

    @map_sprite.opacity      = value

    @object_sprite.opacity   = value

    @position_sprite.opacity = value

  end

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

  # ○ リフレッシュ

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

  def refresh

    update_draw_range

    update_passage_table

    update_object_list

    update_position

    draw_map

    draw_object

    Graphics.frame_reset

  end

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

  # ○ フェードイン

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

  def fadein

    @showing = true

    @hiding  = false

  end

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

  # ○ フェードアウト

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

  def fadeout

    @showing = false

    @hiding  = true

  end

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

  # ○ キー入力更新

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

  def update_input

    return if KMS_MiniMap::SWITCH_BUTTON.nil?


    if Input.trigger?(KMS_MiniMap::SWITCH_BUTTON)

      if opacity < 255 && !@showing

        fadein

      elsif opacity > 0 && !@hiding

        fadeout

      end

    end

  end

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

  # ○ 描画範囲更新

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

  def update_draw_range

    range = []

    (2).times { |i| range[i] = @draw_grid_num[i] / 2 }


    @draw_range_begin.x = $game_player.x - range[0]

    @draw_range_begin.y = $game_player.y - range[1]

    @draw_range_end.x   = $game_player.x + range[0]

    @draw_range_end.y   = $game_player.y + range[1]

  end

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

  # ○ 通行可否テーブル更新

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

  def update_passage_table

    cache = get_passage_table_cache

    @passage_table      = cache.table

    @passage_scan_table = cache.scan_table


    update_around_passage_table

  end

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

  # ○ 通行可否テーブルのキャッシュを取得

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

  def get_passage_table_cache

    map_id = $game_map.map_id

    cache  = @@passage_cache.find { |c| c.map_id == map_id }


    # キャッシュミスしたら新規作成

    if cache == nil

      cache = PassageCache.new(map_id)

      cache.table      = Table.new($game_map.width, $game_map.height)

      cache.scan_table = Table.new(

        ($game_map.width  + @draw_grid_num.x - 1) / @draw_grid_num.x,

        ($game_map.height + @draw_grid_num.y - 1) / @draw_grid_num.y

      )

    end


    # 直近のキャッシュは先頭に移動し、古いキャッシュは削除

    @@passage_cache.unshift(cache)

    @@passage_cache.delete_at(KMS_MiniMap::CACHE_NUM)


    return cache

  end

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

  # ○ 通行可否テーブルのキャッシュをクリア

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

  def clear_passage_table_cache

    return if @passage_scan_table == nil


    table = @passage_scan_table

    @passage_scan_table = Table.new(table.xsize, table.ysize)

  end

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

  # ○ 通行可否テーブルの探索

  #     x, y : 探索位置

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

  def scan_passage(x, y)

    dx = x / @draw_grid_num.x

    dy = y / @draw_grid_num.y


    # 探索済み

    return if @passage_scan_table[dx, dy] == 1


    # マップ範囲外

    return unless dx.between?(0, @passage_scan_table.xsize - 1)

    return unless dy.between?(0, @passage_scan_table.ysize - 1)


    rx = (dx * @draw_grid_num.x)...((dx + 1) * @draw_grid_num.x)

    ry = (dy * @draw_grid_num.y)...((dy + 1) * @draw_grid_num.y)

    mw = $game_map.width  - 1

    mh = $game_map.height - 1


    # 探索範囲内の通行テーブルを生成

    rx.each { |x|

      next unless x.between?(0, mw)

      ry.each { |y|

        next unless y.between?(0, mh)


        # 通行方向フラグ作成

        # (↓、←、→、↑ の順に 1, 2, 4, 8 が対応)

        flag = 0

        [2, 4, 6, 8].each{ |d|

          flag |= 1 << (d / 2 - 1) if $game_map.passable?(x, y, d)

        }

        @passage_table[x, y] = flag

      }

    }

    @passage_scan_table[dx, dy] = 1

  end

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

  # ○ 周辺の通行可否テーブル更新

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

  def update_around_passage_table

    gx = @draw_grid_num.x

    gy = @draw_grid_num.y

    dx = $game_player.x - gx / 2

    dy = $game_player.y - gy / 2

    scan_passage(dx,      dy)

    scan_passage(dx + gx, dy)

    scan_passage(dx,      dy + gy)

    scan_passage(dx + gx, dy + gy)

  end

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

  # ○ オブジェクト一覧更新

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

  def update_object_list

    events = $game_map.events.values


    # WALL

    @wall_events = events.find_all { |e| e.is_minimap_wall_event? }


    # MOVE

    @move_events = events.find_all { |e| e.is_minimap_move_event? }


    # OBJ

    @object_list = events.find_all { |e| e.is_minimap_object? }

  end

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

  # ○ 位置更新

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

  def update_position

    # 移動量算出

    pt = Point.new($game_player.x, $game_player.y)

    ox = ($game_player.real_x - pt.x) * @grid_size

    oy = ($game_player.real_y - pt.y) * @grid_size


    @viewport.ox = ox

    @viewport.oy = oy


    # 移動していたらマップ再描画

    if pt.x != @last_x || pt.y != @last_y

      draw_map

      @last_x = pt.x

      @last_y = pt.y

    end

  end

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

  # ○ 描画範囲内判定

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

  def in_draw_range?(x, y)

    rb = @draw_range_begin

    re = @draw_range_end

    return (x.between?(rb.x, re.x) && y.between?(rb.y, re.y))

  end

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

  # ○ マップ範囲内判定

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

  def in_map_range?(x, y)

    mw = $game_map.width

    mh = $game_map.height

    return (x.between?(0, mw - 1) && y.between?(0, mh - 1))

  end

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

  # ○ マップ描画

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

  def draw_map

    update_around_passage_table


    bitmap  = @map_sprite.bitmap

    bitmap.fill_rect(bitmap.rect, KMS_MiniMap::BACKGROUND_COLOR)


    draw_map_foreground(bitmap)

    draw_map_move_event(bitmap)

  end

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

  # ○ 通行可能領域の描画

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

  def draw_map_foreground(bitmap)

    range_x = (@draw_range_begin.x)..(@draw_range_end.x)

    range_y = (@draw_range_begin.y)..(@draw_range_end.y)

    map_w   = $game_map.width  - 1

    map_h   = $game_map.height - 1

    rect    = Rect.new(0, 0, @grid_size, @grid_size)


    range_x.each { |x|

      next unless x.between?(0, map_w)

      range_y.each { |y|

        next unless y.between?(0, map_h)

        next if @passage_table[x, y] == 0

        next if @wall_events.find { |e| e.x == x && e.y == y }  # 壁


        # グリッド描画サイズ算出

        rect.set(0, 0, @grid_size, @grid_size)

        rect.x = (x - @draw_range_begin.x) * @grid_size

        rect.y = (y - @draw_range_begin.y) * @grid_size

        flag = @passage_table[x, y]

        if flag & 0x01 == 0  # 下通行不能

          rect.height -= 1

        end

        if flag & 0x02 == 0  # 左通行不能

          rect.x     += 1

          rect.width -= 1

        end

        if flag & 0x04 == 0  # 右通行不能

          rect.width -= 1

        end

        if flag & 0x08 == 0  # 上通行不能

          rect.y      += 1

          rect.height -= 1

        end

        bitmap.fill_rect(rect, KMS_MiniMap::FOREGROUND_COLOR)

      }

    }

  end

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

  # ○ 移動イベントの描画

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

  def draw_map_move_event(bitmap)

    rect = Rect.new(0, 0, @grid_size, @grid_size)

    @move_events.each { |e|

      rect.x = (e.x - @draw_range_begin.x) * @grid_size

      rect.y = (e.y - @draw_range_begin.y) * @grid_size

      bitmap.fill_rect(rect, KMS_MiniMap::MOVE_EVENT_COLOR)

    }

  end

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

  # ○ アニメーション更新

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

  def update_animation

    if @showing

      # フェードイン

      self.opacity += 16

      if opacity == 255

        @showing = false

      end

    elsif @hiding

      # フェードアウト

      self.opacity -= 16

      if opacity == 0

        @hiding = false

      end

    end

  end

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

  # ○ オブジェクト描画

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

  def draw_object

    # 下準備

    bitmap = @object_sprite.bitmap

    bitmap.clear

    rect = Rect.new(0, 0, @grid_size, @grid_size)


    # オブジェクト描画

    @object_list.each { |obj|

      next unless in_draw_range?(obj.x, obj.y)


      color = KMS_MiniMap::OBJECT_COLOR[obj.minimap_object_type - 1]

      next if color.nil?


      rect.x = (obj.real_x - @draw_range_begin.x) * @grid_size

      rect.y = (obj.real_y - @draw_range_begin.y) * @grid_size

      bitmap.fill_rect(rect, color)

    }


    # 乗り物描画

    $game_map.vehicles.each { |vehicle|

      next if vehicle.transparent


      rect.x = (vehicle.real_x - @draw_range_begin.x) * @grid_size

      rect.y = (vehicle.real_y - @draw_range_begin.y) * @grid_size

      bitmap.fill_rect(rect, KMS_MiniMap::VEHICLE_COLOR)

    }

  end

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

  # ○ 更新

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

  def update

    update_input


    return unless need_update?


    update_draw_range

    update_position

    update_animation

    draw_object


    @map_sprite.update

    @object_sprite.update

    @position_sprite.update

  end

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

  # ○ 更新判定

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

  def need_update?

    return (visible && opacity > 0) || @showing || @hiding

  end

end


#==============================================================================

# □ Sprite_MiniMapIcon

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

#   ミニマップ用アイコンのクラスです。

#==============================================================================


class Sprite_MiniMapIcon < Sprite

  DURATION_MAX = 60

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

  # ● オブジェクト初期化

  #     viewport : ビューポート

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

  def initialize(viewport = nil)

    super(viewport)

    @duration = DURATION_MAX / 2

  end

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

  # ● フレーム更新

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

  def update

    super

    @duration += 1

    if @duration == DURATION_MAX

      @duration = 0

    end

    update_effect

  end

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

  # ○ エフェクトの更新

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

  def update_effect

    self.color.set(255, 255, 255,

      (@duration - DURATION_MAX / 2).abs * KMS_MiniMap::BLINK_LEVEL

    )

  end

end


#==============================================================================

# ■ Spriteset_Map

#==============================================================================


class Spriteset_Map

  attr_reader :minimap

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

  # ● オブジェクト初期化

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

  alias initialize_KMS_MiniMap initialize

  def initialize

    initialize_KMS_MiniMap


    create_minimap

  end

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

  # ○ ミニマップの作成

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

  def create_minimap

    return unless $game_map.minimap_show?


    @minimap = Game_MiniMap.new(@tilemap)

    @minimap.visible = $game_system.minimap_show

  end

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

  # ● 解放

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

  alias dispose_KMS_MiniMap dispose

  def dispose

    dispose_KMS_MiniMap


    dispose_minimap

  end

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

  # ○ ミニマップの解放

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

  def dispose_minimap

    unless @minimap.nil?

      @minimap.dispose

      @minimap = nil

    end

  end

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

  # ● フレーム更新

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

  alias update_KMS_MiniMap update

  def update

    update_KMS_MiniMap


    update_minimap

  end

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

  # ○ ミニマップ更新

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

  def update_minimap

    return if @minimap.nil?


    # 表示切替

    @minimap.visible = $game_system.minimap_show


    # フェード判定

    case $game_map.minimap_fade

    when Game_Map::MINIMAP_FADE_IN

      @minimap.fadein

      $game_map.minimap_fade = Game_Map::MINIMAP_FADE_NONE

    when Game_Map::MINIMAP_FADE_OUT

      @minimap.fadeout

      $game_map.minimap_fade = Game_Map::MINIMAP_FADE_NONE

    end


    @minimap.update

  end

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

  # ○ ミニマップ全体をリフレッシュ

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

  def refresh_minimap

    return if @minimap.nil?


    @minimap.clear_passage_table_cache

    @minimap.refresh

  end

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

  # ○ ミニマップのオブジェクトを更新

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

  def update_minimap_object

    @minimap.update_object_list unless @minimap.nil?

  end

end


#==============================================================================

# ■ Scene_Map

#==============================================================================


class Scene_Map

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

  # ● 場所移動後の処理

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

  alias post_transfer_KMS_MiniMap post_transfer

  def post_transfer

    refresh_minimap


    post_transfer_KMS_MiniMap

  end

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

  # ○ ミニマップ全体をリフレッシュ

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

  def refresh_minimap

    @spriteset.refresh_minimap unless @spriteset.nil?

  end

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

  # ○ ミニマップのオブジェクトを更新

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

  def update_minimap_object

    @spriteset.update_minimap_object unless @spriteset.nil?

  end

end








使用法

Usage

通常は、スクリプトを導入するだけで使用できます。
ミニマップを表示したくないマップは、マップ名に[NOMAP]、またはメモ欄に<ミニマップ非表示>を追加してください。


イベントページの最上部に「注釈」イベントを配置し、そこに <> で囲んだコマンドを記述することで、ミニマップ上でイベントを色付けすることができます。
Minimap command
コマンドの英語表記は、大文字小文字どちらでも構いません。

マップ移動イベント
<ミニマップ 移動>
<minimap move>
マップ移動処理を行うイベントを表します。
このコマンドを設定したイベントは、ミニマップ上で強調(着色)されるので、どこに行けば先へ進めるのかが分かりやすくなります。
通行不可イベント
<ミニマップ 壁>
<ミニマップ 障害物>
<minimap wall>
ミニマップ上で、イベントが存在するマスが壁として扱われるようになります。
オブジェクト
<ミニマップ objN>
<minimap objN>
町の人間やモンスターなどのオブジェクト (イベント) を表します
Nには、1以上の整数を指定します。
(サンプルでは、人間にobj1、立て札などにobj2を指定しています)
obj と数値の間に空白を入れて、obj 1と書くこともできます。
オブジェクトに対応する色は、設定項目で編集できます。
# ◆ オブジェクトの色
OBJECT_COLOR = [
  Color.new(  0, 160,   0, 160),  # OBJ 1
  Color.new(  0, 160, 160, 192),  # OBJ 2
  Color.new(160,   0, 160, 192),  # OBJ 3
]
デフォルトではobj3まで対応していますが、ここに色を追加すればobj4以降も使用できるようになります。

特定のイベントなどで、一時的にミニマップを隠したい場合は、イベントコマンド「スクリプト」で、hide_minimapを実行してください。
# ミニマップは消えてなさい
hide_minimap
再び表示するには、show_minimapを使用します。
# ミニマップ出てきなさい
show_minimap

ミニマップの1マスのサイズは、設定項目で変更できます。
# ◆ 1マスのサイズ
GRID_SIZE = 5

もし、ミニマップに何か被るような場合は、マップの Z 座標を増やしてください。
# ◆ ミニマップの Z 座標
MAP_Z = 0
ただし、増やしすぎると、メッセージウィンドウに被るなどの問題が生じる場合があります。

↑目次

blank注意事項

Notes

以下の内容は仕様です。バグではありません。

  • タイルセットの情報をもとにして通行可否を判定しているため、通行不可イベントが置いてあるマスもミニマップでは通行可能に見える場合があります。
    どうしても気になる場合は、通行不可能なチップを置き、その上にイベントを設置するか、注釈<ミニマップ 壁>を追加してください。






Who's 아방스

profile
Atachment
첨부 '1'
  • ?
    파이어 2012.01.17 17:02

    벌써 KGC에서 미닌맵 스크립트가 나왔네요.. 액알나오면 에이스로 바로갈아탈텐데

  • profile
    Ilike게임 2012.10.13 11:16
    나오긴 나왔는데 포르투갈어입니다;;
  • ?
    tony 2012.11.03 13:09
    그냥 이벤트 액알 도전하세요!
  • ?
    Bluesky(新) 2012.01.18 12:02

    음.. 미니맵 보다는 빨리 한계 돌파 와 레벨업 시 자동 회복. 몬스터 체력 표시 등이 나와야 할텐데..

     

  • profile
    쿠쿠밥솥 2012.01.25 20:08

    KGC에서 Ace스크립트가 일요일마다 나오나바여ㅋㅋ

    오늘 보니까 2개가 더 생겨있넹...

  • profile
    안모군 2012.04.12 16:10

    으갸...  설명이 좀 복잡하네...

  • profile
    아방스 2012.05.07 17:53
    번역기라 그러실수도 있을듯 하군요.
  • ?
    베리☆ 2012.05.03 22:58
    어떻게 쓰는지 자세하게 알려주심 안되나요?
  • profile
    DevilEx 2012.06.01 23:52
    흐어 . . . ㄳㄳ
  • ?
    시옷청룡 2012.07.10 21:09
    흠... 이거 스위치로 껐다켰다할 수 있늕건가요?
  • profile
    아방스 2012.09.19 23:05
    이벤트 커맨드 -> 스크립트 ->hide_minimap 라고 명령하시면 미니맵 사라져요~.
    다시 표실할땐 show_minimap
  • profile
    미니♂ban♀ 2012.09.19 18:43
    이거 미니맵을 안보여야 하는 맵에선 어떻게 보이지 않게 하나요? 스위치라던지 뭐.. 방법좀..
  • profile
    아방스 2012.09.19 23:04
    미니맵이 표시 안되어야 할맵에는 맵이름에 NOMAP라고 적어두시던지.
    아니면 맵의 설정에서 메모란에 <ミニマップ非表示>라고 적으시면 된다고 설명되어있네요.
  • ?
    오오모리노 2012.10.27 20:47
    저어 여쭙습니다만, 스크립트로 화면 크기를 640, 480 으로 맞춘 경우에는
    모서리로 어떻게 배치시켜야하나요?
  • ?
    tony 2012.11.03 13:09
    대박이네요 감사합니다
  • ?
    tony 2012.11.03 17:24

    주석으로 이밴트 페이지마다 색깔을 바꿀수있다고 하셨는데 주석에 뭐라고 써야하죠?

  • profile
    혜인 2012.11.28 20:16
    보시면 주석에 <minimap objN> 이나 <ミニマップ objN> 이라고 적어야 한다고 나와있네요.
    이미 찾으셨을 지도 모르지만..
  • ?
    tony 2012.12.02 14:50
    감사합니다
  • ?
    스컬늑대 2013.03.04 10:54
    미니맵 상으로 다른오브젝트와 캐릭터(?)를 비교하기 위해 색상말고 반짝이는효과로 차별화 두려고
    @map_sprite.update
    @object_sprite.update
    @position_sprite.update

    이부분에서 가운데 @object_sprite.update 제거 했는데요.

    제가 원하는 이벤트는 반짝이게 할 수 있을까요??
    예를 들자면 퀘스트 있는 NPC는 반짝이게하고 일반 NPC는 반짝이지 않게 하고 싶습니다.

    (질문 게시판에 올려야하나요..?)
  • ?
    미스터h 2014.03.08 14:19

    계속 스크립트에 에러가 뜨는데 어떻게 하면 돼요?

  • profile
    AANNSS 2016.01.22 21:03
    처음시작할때 미니맵이 안보이게 하려면 어떻게 바꿔야하는지 가르쳐 주실수 있나요?

List of Articles
번호 분류 제목 글쓴이 날짜 조회 수
공지 스크립트 자료 게시물 작성시 주의사항 습작 2012.12.24 5110
공지 RPG VX ACE 유용한 링크 모음 16 아방스 2012.01.03 28927
217 기타 '결정 키로 이벤트 시작' 조건분기 추가 file Bunny_Boy 2016.01.16 1165
216 기타 (링크)RPG VX ACE 블랙잭 스크립트 게임애호가 2017.06.18 1003
215 기타 77er 월드 맵 1.0 by 77er 3 file 77ER. 2013.08.14 2281
214 이동 및 탈것 8 방향 이동 스크립트 ( 사선 이동 캐릭터 그래픽 지원 ) 9 file 미루 2013.07.11 4845
213 전투 Ace 경험치 직접 설정 12 쿠쿠밥솥 2012.02.05 4004
212 장비 Ace 장비 착용의 제한 스크립트 11 아이미르 2012.09.01 2786
211 기타 ACE) 오블리비언 락픽 구현 V0.5.2 7 file 77이알 2012.09.02 4811
210 기타 ACE) 캐릭터 사전 by 77ER 19 77이알 2012.09.17 3937
209 메뉴 ace용 mog메뉴와 mog전투 10 file 꿈꾸는사람 2012.08.04 6053
208 액터 Actor Creation System by Tsukihime 4 Alkaid 2012.09.16 3552
207 메시지 Advanced Text System by modern algebra 2 Alkaid 2013.02.04 2317
206 메시지 ATS: Special Message Codes 1.0 by Modern Algebra 1 file Alkaid 2012.01.15 4708
205 오디오 Audio Pump Up: FMOD Ex by mikb89 2 Alkaid 2012.09.08 2071
204 전투 Basic Enemy HP Bars 2.1 by V.M 10 Alkaid 2013.02.21 4207
203 전투 Code Crush VXAce-RGSS3-21 프론트뷰 改 2 15 Alkaid 2013.01.28 4270
202 전투 CP's Battle Engine by Neon Black 20 Alkaid 2013.02.14 4957
201 퀘스트 CSCA]콜로세움 시스템 4 file 글쎄,왜 난 적용이 안될까? 2013.06.09 3623
200 메뉴 Customizable Main Menu 1.0b by modern algebra 4 file Alkaid 2012.02.13 5452
199 기타 Dialog Extractor 1.04 (VXA/VX/XP) 6 AltusZeon 2014.01.16 11669
198 전투 Drop Options by modern algebra 3 Alkaid 2012.09.17 2851
Board Pagination Prev 1 2 3 4 5 6 7 8 9 10 11 Next
/ 11