#_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ #_/ ◆ 迷你地图 - KMS_MiniMap ◆ VX Ace ◆ #_/ ◇ Last update : 2012/02/12 (TOMY@Kamesoft) ◇ #_/---------------------------------------------------------------------------- #_/ 追加迷你地图表示机能。 #_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ #============================================================================== # ★ 设定项目 - BEGIN Setting ★ #============================================================================== module KMS_MiniMap # ◆ 迷你地图表示切换按键 # 空白则按钮转换无效。 SWITCH_BUTTON = :F5 # ◆ 迷你地图表示位置和大小 (X, Y, 寛, 高) MAP_RECT = Rect.new(Graphics.width / 8, Graphics.height / 8, Graphics.width / 4 * 3, Graphics.height / 4 * 3) # ◆ 迷你地图 Z 座标 # 注意:太大可能影响其他东西。 MAP_Z = 0 # ◆ 1格大小 # 推荐 3 以上。 GRID_SIZE = 8 # ◆ 迷你地图顔色 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 Color.new(218, 112, 214, 192), ] # ← 这个]不能消去! # ◆ 图标的闪烁强度 # 推荐 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_temp.minimap_manual_visible = true $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_Temp #============================================================================== class Game_Temp #-------------------------------------------------------------------------- # ○ 公共实例变量 #-------------------------------------------------------------------------- attr_accessor :minimap_manual_visible # 手动切换小地图显示标志 #-------------------------------------------------------------------------- # ○ 对象初始化 #-------------------------------------------------------------------------- alias initialize_KMS_MiniMap initialize def initialize initialize_KMS_MiniMap @minimap_manual_visible = true 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? return if move_event_judge return if object_type_judge end #-------------------------------------------------------------------------- # ○ 移动事件判定(存在201号解释器事件) #-------------------------------------------------------------------------- def move_event_judge @__minimap_move_event = @page.graphic.character_name == "" && @page.list.any? { |eve| eve.code == 201 } end #-------------------------------------------------------------------------- # ○ 其他类型事件判定 #-------------------------------------------------------------------------- def object_type_judge return true if is_actor_event == 1 return true if is_door_event == 3 || is_switch_event == 3 return true if is_close_chest_event == 2 return false end #-------------------------------------------------------------------------- # ○ 角色类事件判定(自定义图块仅支持纯数字文件 例如 1.png) #-------------------------------------------------------------------------- def is_actor_event pattren = /(Actor|Animal|Behavior|Damage| Evil|Insane|Monster|People|Riding|Spiritual)|(^\d+$)/ @__minimap_object_type = (@page.graphic.character_name =~ pattren ? 1 : -1) end #-------------------------------------------------------------------------- # ○ 门类事件判定(这个仅适用范围很小) #-------------------------------------------------------------------------- def is_door_event gra = @page.graphic @__minimap_object_type = (gra.character_name =~ /Other3/ && gra.character_index == 6 ? 3 : -1) end #-------------------------------------------------------------------------- # ○ 开关类事件判定(和上面那个共用一种颜色) #-------------------------------------------------------------------------- def is_switch_event gra = @page.graphic @__minimap_object_type = (gra.character_name =~ /Switch/ ? 3 : -1) end #-------------------------------------------------------------------------- # ○ 未发现的宝箱事件判定(开启后就消失了) #-------------------------------------------------------------------------- def is_close_chest_event gra = @page.graphic @__minimap_object_type = (gra.character_name =~ /Chest/ && gra.direction == 2 ? 2 : -1) 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 unless $game_temp.minimap_manual_visible self.opacity = 0 end 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 $game_temp.minimap_manual_visible = true fadein elsif opacity > 0 && !@hiding $game_temp.minimap_manual_visible = false 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 @minimap = Game_MiniMap.new(@tilemap) @minimap.visible = $game_system.minimap_show && $game_map.minimap_show? end #-------------------------------------------------------------------------- # ● 解放 #-------------------------------------------------------------------------- alias dispose_KMS_MiniMap dispose def dispose dispose_KMS_MiniMap dispose_minimap end #-------------------------------------------------------------------------- # ○ ミニマップの解放 #-------------------------------------------------------------------------- def dispose_minimap @minimap.dispose @minimap = nil end #-------------------------------------------------------------------------- # ● フレーム更新 #-------------------------------------------------------------------------- alias update_KMS_MiniMap update def update update_KMS_MiniMap update_minimap end #-------------------------------------------------------------------------- # ○ ミニマップ更新 #-------------------------------------------------------------------------- def minimap_show? return $game_map.minimap_show? && $game_system.minimap_show end #-------------------------------------------------------------------------- # ○ ミニマップ更新 #-------------------------------------------------------------------------- def update_minimap return if @minimap.nil? # 表示切替 if minimap_show? @minimap.visible = true else @minimap.visible = false return end # フェード判定 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
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? return if move_event_judge return if object_type_judge end #-------------------------------------------------------------------------- # ○ 移动事件判定(存在201号解释器事件) #-------------------------------------------------------------------------- def move_event_judge @__minimap_move_event = @page.graphic.character_name == "" && @page.list.any? { |eve| eve.code == 201 } end #-------------------------------------------------------------------------- # ○ 其他类型事件判定 #-------------------------------------------------------------------------- def object_type_judge return true if is_actor_event == 1 return true if is_door_event == 3 || is_switch_event == 3 return true if is_close_chest_event == 2 return false end #-------------------------------------------------------------------------- # ○ 角色类事件判定(自定义图块仅支持纯数字文件 例如 1.png) #-------------------------------------------------------------------------- def is_actor_event pattren = /(Actor|Animal|Behavior|Damage| Evil|Insane|Monster|People|Riding|Spiritual)|(^\d+$)/ @__minimap_object_type = (@page.graphic.character_name =~ pattren ? 1 : -1) end #-------------------------------------------------------------------------- # ○ 门类事件判定(这个仅适用范围很小) #-------------------------------------------------------------------------- def is_door_event gra = @page.graphic @__minimap_object_type = (gra.character_name =~ /Other3/ && gra.character_index == 6 ? 3 : -1) end #-------------------------------------------------------------------------- # ○ 开关类事件判定(和上面那个共用一种颜色) #-------------------------------------------------------------------------- def is_switch_event gra = @page.graphic @__minimap_object_type = (gra.character_name =~ /Switch/ ? 3 : -1) end #-------------------------------------------------------------------------- # ○ 未发现的宝箱事件判定(开启后就消失了) #-------------------------------------------------------------------------- def is_close_chest_event gra = @page.graphic @__minimap_object_type = (gra.character_name =~ /Chest/ && gra.direction == 2 ? 2 : -1) end private :__create_minimap_cache
#_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ #_/ ◆ 迷你地图 - KMS_MiniMap ◆ VX Ace ◆ #_/ ◇ Last update : 2012/02/12 (TOMY@Kamesoft) ◇ #_/---------------------------------------------------------------------------- #_/ 追加迷你地图表示机能。 #_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ #============================================================================== # ★ 设定项目 - BEGIN Setting ★ #============================================================================== module KMS_MiniMap # ◆ 迷你地图表示切换按键 # 空白则按钮转换无效。 SWITCH_BUTTON = :F5 # ◆ 迷你地图表示位置和大小 (X, Y, 寛, 高) MAP_RECT = Rect.new(Graphics.width / 8, Graphics.height / 8, Graphics.width / 4 * 3, Graphics.height / 4 * 3) # ◆ 迷你地图 Z 座标 # 注意:太大可能影响其他东西。 MAP_Z = 0 # ◆ 1格大小 # 推荐 3 以上。 GRID_SIZE = 8 # ◆ 迷你地图顔色 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 Color.new(218, 112, 214, 192), ] # ← 这个]不能消去! # ◆ 图标的闪烁强度 # 推荐 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_temp.minimap_manual_visible = true $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_Temp #============================================================================== class Game_Temp #-------------------------------------------------------------------------- # ○ 公共实例变量 #-------------------------------------------------------------------------- attr_accessor :minimap_manual_visible # 手动切换小地图显示标志 #-------------------------------------------------------------------------- # ○ 对象初始化 #-------------------------------------------------------------------------- alias initialize_KMS_MiniMap initialize def initialize initialize_KMS_MiniMap @minimap_manual_visible = false 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? return if special_judge return if move_event_judge return if object_type_judge end #-------------------------------------------------------------------------- # ○ 反规则,取消事件着色处理 #-------------------------------------------------------------------------- def special_judge @page.list[0] && @page.list[0].code == 108 && @page.list[0].parameters[0] =~ /(<hide>|<事件隐藏>)/ ? true : false end #-------------------------------------------------------------------------- # ○ 移动事件判定(存在201号解释器事件) #-------------------------------------------------------------------------- def move_event_judge @__minimap_move_event = @page.graphic.character_name == "" && @page.list.any? { |eve| eve.code == 201 } end #-------------------------------------------------------------------------- # ○ 其他类型事件判定 #-------------------------------------------------------------------------- def object_type_judge return true if is_actor_event == 1 return true if is_door_event == 3 || is_switch_event == 3 return true if is_close_chest_event == 2 return false end #-------------------------------------------------------------------------- # ○ 角色类事件判定(自定义图块仅支持纯数字文件 例如 1.png) #-------------------------------------------------------------------------- def is_actor_event pattren = /(Actor|Animal|Behavior|Damage| Evil|Insane|Monster|People|Riding|Spiritual)|(^\d+$)/ @__minimap_object_type = (@page.graphic.character_name =~ pattren ? 1 : -1) end #-------------------------------------------------------------------------- # ○ 门类事件判定(这个仅适用范围很小) #-------------------------------------------------------------------------- def is_door_event gra = @page.graphic @__minimap_object_type = (gra.character_name =~ /Other3/ && gra.character_index == 6 ? 3 : -1) end #-------------------------------------------------------------------------- # ○ 开关类事件判定(和上面那个共用一种颜色) #-------------------------------------------------------------------------- def is_switch_event gra = @page.graphic @__minimap_object_type = (gra.character_name =~ /Switch/ ? 3 : -1) end #-------------------------------------------------------------------------- # ○ 未发现的宝箱事件判定(开启后就消失了) #-------------------------------------------------------------------------- def is_close_chest_event gra = @page.graphic @__minimap_object_type = (gra.character_name =~ /Chest/ && gra.direction == 2 ? 2 : -1) 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 unless $game_temp.minimap_manual_visible self.opacity = 0 end 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 $game_temp.minimap_manual_visible = true fadein elsif opacity > 0 && !@hiding $game_temp.minimap_manual_visible = false 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 @minimap = Game_MiniMap.new(@tilemap) @minimap.visible = $game_system.minimap_show && $game_map.minimap_show? end #-------------------------------------------------------------------------- # ● 解放 #-------------------------------------------------------------------------- alias dispose_KMS_MiniMap dispose def dispose dispose_KMS_MiniMap dispose_minimap end #-------------------------------------------------------------------------- # ○ ミニマップの解放 #-------------------------------------------------------------------------- def dispose_minimap @minimap.dispose @minimap = nil end #-------------------------------------------------------------------------- # ● フレーム更新 #-------------------------------------------------------------------------- alias update_KMS_MiniMap update def update update_KMS_MiniMap update_minimap end #-------------------------------------------------------------------------- # ○ ミニマップ更新 #-------------------------------------------------------------------------- def minimap_show? return $game_map.minimap_show? && $game_system.minimap_show end #-------------------------------------------------------------------------- # ○ ミニマップ更新 #-------------------------------------------------------------------------- def update_minimap return if @minimap.nil? # 表示切替 if minimap_show? @minimap.visible = true else @minimap.visible = false return end # フェード判定 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
欢迎光临 Project1 (https://rpg.blue/) | Powered by Discuz! X3.1 |