#============================================================================== # ■ VXAce-RGSS3-47 フィールドマップ [window/sprite] by Claimh #============================================================================== #============================================================================== # ■ Window_FieldMessage #============================================================================== class Window_FieldMessage < Window_Message #-------------------------------------------------------------------------- # ● 表示行数の取得 #-------------------------------------------------------------------------- def visible_line_number return 1 end #-------------------------------------------------------------------------- # ● ウィンドウ位置の更新 #-------------------------------------------------------------------------- def update_placement @position = $game_message.position self.y = @position * (Graphics.height - height + (12 - PADDING)) / 2 @gold_window.y = y > 0 ? 0 : Graphics.height - @gold_window.height end #-------------------------------------------------------------------------- # ● 背景スプライトの更新 #-------------------------------------------------------------------------- def update_back_sprite @back_sprite.visible = (@background == 1) @back_sprite.y = y + (12 - PADDING) @back_sprite.opacity = openness @back_sprite.update end #-------------------------------------------------------------------------- # ● 背景ビットマップの作成 #-------------------------------------------------------------------------- PADDING = 8 def create_back_bitmap @back_bitmap = Bitmap.new(width, height) rect1 = Rect.new(0, 0, width, PADDING) rect2 = Rect.new(0, PADDING, width, line_height) rect3 = Rect.new(0, line_height + PADDING, width, PADDING) @back_bitmap.gradient_fill_rect(rect1, back_color2, back_color1, true) @back_bitmap.fill_rect(rect2, back_color1) @back_bitmap.gradient_fill_rect(rect3, back_color1, back_color2, true) end #-------------------------------------------------------------------------- # ● 背景色 1 の取得 #-------------------------------------------------------------------------- def back_color1 Color.new(0, 0, 0, 192) end #-------------------------------------------------------------------------- # ● 背景色 2 の取得 #-------------------------------------------------------------------------- def back_color2 Color.new(0, 0, 0, 0) end end #============================================================================== # ■ FieldMap::Bitmap_Base : 描画系ベース(Window_Baseからの移植等) #============================================================================== module FieldMap::Bitmap_Base def contents; bitmap; end PADDING = 8 #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def dispose self.bitmap.dispose self.viewport.dispose unless self.viewport.nil? super end #-------------------------------------------------------------------------- # ● 指定行数に適合するウィンドウの高さを計算 #-------------------------------------------------------------------------- def fitting_height(line_number) line_number * line_height + PADDING * 2 end #-------------------------------------------------------------------------- # ● open / close => show / hide #-------------------------------------------------------------------------- def open; show; end def close; hide; end #-------------------------------------------------------------------------- # ● 表示 #-------------------------------------------------------------------------- def show self.visible = true self end #-------------------------------------------------------------------------- # ● 非表示 #-------------------------------------------------------------------------- def hide self.visible = false self end #-------------------------------------------------------------------------- # ● 行の高さを取得 #-------------------------------------------------------------------------- def line_height return 24 end #-------------------------------------------------------------------------- # ● 文字色取得 # n : 文字色番号(0..31) #-------------------------------------------------------------------------- def text_color(n) Cache.system("Window").get_pixel(64 + (n % 8) * 8, 96 + (n / 8) * 8) end #-------------------------------------------------------------------------- # ● 各種文字色の取得 #-------------------------------------------------------------------------- def normal_color; text_color(0); end; # 通常 def system_color; text_color(16); end; # システム #-------------------------------------------------------------------------- # ● テキストの描画 # args : Bitmap#draw_text と同じ #-------------------------------------------------------------------------- def draw_text(*args) contents.draw_text(*args) end #-------------------------------------------------------------------------- # ● テキストサイズの取得 #-------------------------------------------------------------------------- def text_size(str) contents.text_size(str) end #-------------------------------------------------------------------------- # ● テキスト描画色の変更 # enabled : 有効フラグ。false のとき半透明で描画 #-------------------------------------------------------------------------- def change_color(color, enabled = true) contents.font.color.set(color) contents.font.color.alpha = translucent_alpha unless enabled end #-------------------------------------------------------------------------- # ● フォント設定のリセット #-------------------------------------------------------------------------- def reset_font_settings change_color(normal_color) contents.font.size = Font.default_size contents.font.bold = false contents.font.italic = false end #-------------------------------------------------------------------------- # ● 制御文字つきテキストの描画 #-------------------------------------------------------------------------- def draw_text_ex(x, y, text) reset_font_settings text = convert_escape_characters(text) pos = {:x => x, :y => y, :new_x => x, :height => line_height} process_character(text.slice!(0, 1), text, pos) until text.empty? end #-------------------------------------------------------------------------- # ● 制御文字つきテキストサイズ #-------------------------------------------------------------------------- def text_size_ex(text) t = convert_escape_characters(text) txt = "" until t.empty? c = t.slice!(0, 1) case c when "\e" # 制御文字 case obtain_escape_code(t).upcase when 'C', 'I' obtain_escape_param(t) end else # 普通の文字 txt += c end end contents.text_size(txt) end #-------------------------------------------------------------------------- # ● アクター n 番の名前を取得 #-------------------------------------------------------------------------- def actor_name(n) actor = n >= 1 ? $game_actors[n] : nil actor ? actor.name : "" end #-------------------------------------------------------------------------- # ● パーティメンバー n 番の名前を取得 #-------------------------------------------------------------------------- def party_member_name(n) actor = n >= 1 ? $game_party.members[n - 1] : nil actor ? actor.name : "" end #-------------------------------------------------------------------------- # ● マップ名取得 #-------------------------------------------------------------------------- def map_name(n) return load_data(sprintf("Data/Map%03d.rvdata2", n)).display_name end #-------------------------------------------------------------------------- # ● 制御文字の事前変換 # 実際の描画を始める前に、原則として文字列に変わるものだけを置き換える。 # 文字「\」はエスケープ文字(\e)に変換。 #-------------------------------------------------------------------------- def convert_escape_characters(text) result = text.to_s.clone result.gsub!(/\\/) { "\e" } result.gsub!(/\e\e/) { "\\" } result.gsub!(/\eV\[(\d+)\]/i) { $game_variables[$1.to_i] } result.gsub!(/\eV\[(\d+)\]/i) { $game_variables[$1.to_i] } result.gsub!(/\eN\[(\d+)\]/i) { actor_name($1.to_i) } result.gsub!(/\eP\[(\d+)\]/i) { party_member_name($1.to_i) } result.gsub!(/\eG/i) { Vocab::currency_unit } result.gsub!(/\eY\[(\d+)\]/i) { $game_actors[$1.to_i].nickname } result.gsub!(/\eE\[(\d+)\]/i) { $data_enemies[$1.to_i].name } result.gsub!(/\eT\[(\d+)\]/i) { $data_items[$1.to_i].name } result.gsub!(/\eW\[(\d+)\]/i) { $data_weapons[$1.to_i].name } result.gsub!(/\eA\[(\d+)\]/i) { $data_armors[$1.to_i].name } result.gsub!(/\eS\[(\d+)\]/i) { $data_skills[$1.to_i].name } result.gsub!(/\eJ\[(\d+)\]/i) { $data_classes[$1.to_i].name } result.gsub!(/\eM\[(\d+)\]/i) { map_name($1.to_i) } result end #-------------------------------------------------------------------------- # ● 制御文字の本体を破壊的に取得 #-------------------------------------------------------------------------- def obtain_escape_code(text) text.slice!(/^[\$\.\|\^!><\{\}\\]|^[A-Z]+/i) end #-------------------------------------------------------------------------- # ● 制御文字の引数を破壊的に取得 #-------------------------------------------------------------------------- def obtain_escape_param(text) text.slice!(/^\[\d+\]/)[/\d+/].to_i rescue 0 end #-------------------------------------------------------------------------- # ● 文字の処理 # c : 文字 # text : 描画処理中の文字列バッファ(必要なら破壊的に変更) # pos : 描画位置 {:x, :y, :new_x, :height} #-------------------------------------------------------------------------- def process_character(c, text, pos) case c when "\e" # 制御文字 process_escape_character(obtain_escape_code(text), text, pos) else # 普通の文字 process_normal_character(c, pos) end end #-------------------------------------------------------------------------- # ● 制御文字の処理 # code : 制御文字の本体部分(「\C[1]」なら「C」) #-------------------------------------------------------------------------- def process_escape_character(code, text, pos) case code.upcase when 'C' change_color(text_color(obtain_escape_param(text))) when 'I' process_draw_icon(obtain_escape_param(text), pos) end end #-------------------------------------------------------------------------- # ● 通常文字の処理 #-------------------------------------------------------------------------- def process_normal_character(c, pos) text_width = text_size(c).width contents.draw_text(pos[:x], pos[:y], text_width * 2, pos[:height], c) pos[:x] += text_width end #-------------------------------------------------------------------------- # ● 制御文字によるアイコン描画の処理 #-------------------------------------------------------------------------- def process_draw_icon(icon_index, pos) draw_icon(icon_index, pos[:x], pos[:y]) pos[:x] += 24 end #-------------------------------------------------------------------------- # ● アイコンの描画 # enabled : 有効フラグ。false のとき半透明で描画 #-------------------------------------------------------------------------- def draw_icon(icon_index, x, y, enabled = true) bitmap = Cache.system("Iconset") rect = Rect.new(icon_index % 16 * 24, icon_index / 16 * 24, 24, 24) contents.blt(x, y, bitmap, rect, enabled ? 255 : translucent_alpha) end #-------------------------------------------------------------------------- # ● 背景の描画 #-------------------------------------------------------------------------- def draw_background(rect) rect1 = Rect.new(0, 0, rect.width, PADDING) rect2 = Rect.new(0, PADDING, rect.width, rect.height - PADDING * 2) rect3 = Rect.new(0, rect.height - PADDING, rect.width, PADDING) contents.gradient_fill_rect(rect1, back_color2, back_color1, true) contents.fill_rect(rect2, back_color1) contents.gradient_fill_rect(rect3, back_color1, back_color2, true) end #-------------------------------------------------------------------------- # ● 背景色 1 の取得 #-------------------------------------------------------------------------- def back_color1 Color.new(0, 0, 0, 192) end #-------------------------------------------------------------------------- # ● 背景色 2 の取得 #-------------------------------------------------------------------------- def back_color2 Color.new(0, 0, 0, 0) end end #============================================================================== # ■ Sprite_FieldMapName : 現在位置名 #============================================================================== class Sprite_FieldMapName < Sprite include FieldMap::Bitmap_Base #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize super(Viewport.new(0, 0, Graphics.width, fitting_height(2))) self.bitmap = Bitmap.new(viewport.rect.width, viewport.rect.height) self.viewport.z = 200 end #-------------------------------------------------------------------------- # ● マップ説明テキスト領域 #-------------------------------------------------------------------------- def text_rect Rect.new(0, 8 + line_height, Graphics.width, line_height) end #-------------------------------------------------------------------------- # ● マップID設定 #-------------------------------------------------------------------------- def set_map(map_id) return contents.clear if map_id.nil? map = load_data(sprintf("Data/Map%03d.rvdata2", map_id)) area = map.note.scan(/@area\[(.*?+)\]/)[0] area = area[0] unless area.nil? refresh(map.display_name, area, FieldMap::TXT[map_id].nil?) end #-------------------------------------------------------------------------- # ● リフレッシュ #-------------------------------------------------------------------------- def refresh(display_name=nil, area=nil, notxt=true) contents.clear unless display_name.nil? r = contents.rect r.height -= line_height if notxt draw_background(r) draw_text(4, PADDING, contents.rect.width - 8, line_height, display_name) draw_text(4, PADDING, contents.rect.width - 8, line_height, area, 2) end end end #============================================================================== # ■ Plane_FieldMapText #============================================================================== class Plane_FieldMapText < Plane T_X = 10 W_TIME = 60 # ウェイトタイム include FieldMap::Bitmap_Base #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize(rect) super(Viewport.new(rect)) self.bitmap = Bitmap.new(rect.width, rect.height) self.viewport.z = 210 @w_time = W_TIME @tw = 0 show end #-------------------------------------------------------------------------- # ● マップ設定 #-------------------------------------------------------------------------- def set_map(map_id) text = FieldMap::TXT[map_id] @w_time = W_TIME @tw = 0 self.ox = 0 return bitmap.clear if text.nil? refresh(text) show end #-------------------------------------------------------------------------- # ● リフレッシュ #-------------------------------------------------------------------------- def refresh(text) r = text_size_ex(text) r.x = T_X r.height = viewport.rect.height @tw = r.width + r.x if @tw > viewport.rect.width @tw += viewport.rect.width if FieldMap::TXT_MODE == 2 w = @tw else w = viewport.rect.width end bitmap.dispose self.bitmap = Bitmap.new(w, viewport.rect.height) draw_text_ex(r.x, r.y, text) end #-------------------------------------------------------------------------- # ● フレーム更新 #-------------------------------------------------------------------------- def update return unless self.visible # スライド更新する場合 if @tw > viewport.rect.width # 表示ウェイト if @w_time != 0 @w_time -= 1 # ウェイトカウント - 1 else # 初期位置に戻る if FieldMap::TXT_MODE != 0 and self.ox >= (@tw - viewport.rect.width) self.ox = 0 @w_time = W_TIME else # スライド更新 self.ox = (self.ox + 1) % @tw end end end end end #============================================================================== # ■ Sprite_FieldMapHelp : 操作説明 #============================================================================== class Sprite_FieldMapHelp < Sprite include FieldMap::Bitmap_Base #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize h = fitting_height(1) viewport = Viewport.new(0, Graphics.height - h, Graphics.width, h) super(viewport) self.bitmap = Bitmap.new(viewport.rect.width, viewport.rect.height) self.viewport.z = 200 refresh end #-------------------------------------------------------------------------- # ● リフレッシュ #-------------------------------------------------------------------------- def refresh(tr=false) contents.clear draw_background(self.contents.rect) draw_text(4, 8, contents.width, line_height, "←↑↓→ : 移動", 0) draw_text(4, 8, contents.width - 8, line_height, "決定 : 入る", 2) unless tr end end #============================================================================== # ■ Sprite_FieldTargetMapName #============================================================================== class Sprite_FieldTargetMapName < Sprite include FieldMap::Bitmap_Base FONT_SIZE = 16 OFFSET = 16 * 2 attr_reader :dir #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize(dir) @dir = dir super(nil) self.bitmap = Bitmap.new(100, line_height) self.bitmap.font.size = FONT_SIZE self.z = 500 hide end #-------------------------------------------------------------------------- # ● 行の高さを取得 #-------------------------------------------------------------------------- def line_height return FONT_SIZE + 4 end #-------------------------------------------------------------------------- # ● マップID設定 #-------------------------------------------------------------------------- def set_maps(targets) return hide if targets.empty? w = 0 names = [] targets.each do |map_id| map = load_data(sprintf("Data/Map%03d.rvdata2", map_id)) n = map.display_name next if n == "" or n.nil? names.push(n) tw = text_size(n).width w = tw if w < tw end return if names.empty? w += OFFSET h = line_height * names.size self.bitmap.dispose self.bitmap = Bitmap.new(w, h) self.bitmap.font.size = FONT_SIZE set_position(names.size) refresh(names) end #-------------------------------------------------------------------------- # ● 表示位置決定 #-------------------------------------------------------------------------- CHAR = 16 ARW = 24 + CHAR R2 = 2**(1/2.0) def set_position(num) ow = bitmap.width / 2 h = line_height * num oh = h / 2 case @dir when 2 # 下 self.x = $game_player.screen_x - ow self.y = $game_player.screen_y + ARW when 4 # 左 self.x = $game_player.screen_x - ARW - bitmap.width self.y = $game_player.screen_y - oh when 6 # 右 self.x = $game_player.screen_x + ARW self.y = $game_player.screen_y - oh when 8 # 上 self.x = $game_player.screen_x - ow self.y = $game_player.screen_y - ARW - h when 1 # 左下 self.x = $game_player.screen_x - ARW * R2 - bitmap.width self.y = $game_player.screen_y + (ARW + h) * R2 when 3 # 右下 self.x = $game_player.screen_x + ARW * R2 self.y = $game_player.screen_y + (ARW + h) * R2 when 7 # 左上 self.x = $game_player.screen_x - ARW * R2 - bitmap.width self.y = $game_player.screen_y - ARW * R2 when 9 # 右上 self.x = $game_player.screen_x + ARW * R2 self.y = $game_player.screen_y - ARW * R2 end self.y -= CHAR end #-------------------------------------------------------------------------- # ● リフレッシュ #-------------------------------------------------------------------------- def refresh(names=[]) contents.clear unless names.empty? names.each_index do |i| r = Rect.new(0, line_height * i, contents.rect.width, line_height) draw_background(r) draw_text(r, names[i], 1) end end end #-------------------------------------------------------------------------- # ● 背景の描画 #-------------------------------------------------------------------------- def draw_background(rect) temp_rect = rect.clone temp_rect.width /= 2 contents.gradient_fill_rect(temp_rect, back_color2, back_color1) temp_rect.x = temp_rect.width contents.gradient_fill_rect(temp_rect, back_color1, back_color2) end end #============================================================================== # ■ Arrow_FieldDir : フィールド上の方向表示 #============================================================================== class Arrow_FieldDir < Sprite TIM = 8 MAX = TIM * 4 #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize(dir) @dir = dir super(nil) @blink_count = 0 @index = 0 create_arrow_bitmap self.ox = 8 self.oy = 8 self.z = 500 show.update end #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def dispose self.bitmap.dispose super end #-------------------------------------------------------------------------- # ● 表示位置 #-------------------------------------------------------------------------- R2 = 2**(1/2.0) def update_position case @dir when 2 # 下 self.x = $game_player.screen_x self.y = $game_player.screen_y + self.src_rect.height * 2 self.angle = 0 when 4 # 左 self.x = $game_player.screen_x - self.src_rect.width * 2 self.y = $game_player.screen_y self.angle = 270 when 6 # 右 self.x = $game_player.screen_x + self.src_rect.width * 2 self.y = $game_player.screen_y self.angle = 90 when 8 # 上 self.x = $game_player.screen_x self.y = $game_player.screen_y - self.src_rect.height * 2 self.angle = 180 when 1 # 左下 self.x = $game_player.screen_x - self.src_rect.width * R2 self.y = $game_player.screen_y + self.src_rect.height * R2 self.angle = 315 when 3 # 右下 self.x = $game_player.screen_x + self.src_rect.width * R2 self.y = $game_player.screen_y + self.src_rect.height * R2 self.angle = 45 when 7 # 左上 self.x = $game_player.screen_x - self.src_rect.width * R2 self.y = $game_player.screen_y - self.src_rect.height * R2 self.angle = 225 when 9 # 右上 self.x = $game_player.screen_x + self.src_rect.width * R2 self.y = $game_player.screen_y - self.src_rect.height * R2 self.angle = 135 end self.y -= 16 end #-------------------------------------------------------------------------- # ● Arrowの表示 #-------------------------------------------------------------------------- def show self.visible = true update_position self end #-------------------------------------------------------------------------- # ● Arrowの非表示 #-------------------------------------------------------------------------- def hide self.visible = false self end #-------------------------------------------------------------------------- # ● ArrowBitmap生成 #-------------------------------------------------------------------------- def create_arrow_bitmap self.bitmap = Cache.system("Window") update_arrow end #-------------------------------------------------------------------------- # ● カーソル位置の設定 # index : 新しいカーソル位置 #-------------------------------------------------------------------------- def index=(index) @index = index update end #-------------------------------------------------------------------------- # ● フレーム更新 #-------------------------------------------------------------------------- def update @blink_count = (@blink_count + 1) % MAX update_arrow end #-------------------------------------------------------------------------- # ● フレーム更新 : arrow #-------------------------------------------------------------------------- def update_arrow case @blink_count when (TIM * 0); self.src_rect.set( 96, 64, 16, 16) when (TIM * 1); self.src_rect.set(112, 64, 16, 16) when (TIM * 2); self.src_rect.set(112, 80, 16, 16) when (TIM * 3); self.src_rect.set( 96, 80, 16, 16) end end end #============================================================================== # ■ Spriteset_Map #============================================================================== class Spriteset_Map #-------------------------------------------------------------------------- # ● キャラクターのリフレッシュ #-------------------------------------------------------------------------- alias refresh_characters_fieldmap refresh_characters def refresh_characters refresh_characters_fieldmap unless SceneManager.scene_is?(Scene_FieldMap) end end #============================================================================== # ■ Sprite_FieldRoute #============================================================================== class Sprite_FieldRoute < Sprite #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize(viewport, pos) @pos = pos @pattern = 0 @anime_count = 0 @priority_type = 1 super(viewport) self.opacity = FieldMap::RT_OPACITY self.z = 0 set_bitmap update_src_rect update_position end #-------------------------------------------------------------------------- # ● 解放 #-------------------------------------------------------------------------- def dispose self.bitmap.dispose if FieldMap::RT_TYPE == 3 super end #-------------------------------------------------------------------------- # ● フレーム更新 #-------------------------------------------------------------------------- def update super update_position update_animation if FieldMap::RT_SHOW end #-------------------------------------------------------------------------- # ● 歩行/足踏みアニメの更新 #-------------------------------------------------------------------------- def update_animation @anime_count += 1 if @anime_count > 18 - 4 * 2 @pattern = (@pattern + 1) % 4 @anime_count = 0 update_src_rect end end #-------------------------------------------------------------------------- # ● ビットマップ設定 #-------------------------------------------------------------------------- def set_bitmap case FieldMap::RT_TYPE when 0; set_character_bitmap when 1; set_icon_bitmap when 2; set_animation_bitmap when 3; set_color_bitmap end end #-------------------------------------------------------------------------- # ● キャラクターのビットマップを設定 #-------------------------------------------------------------------------- def set_character_bitmap name = FieldMap::RT_CHAR[:file] self.bitmap = Cache.character(name) sign = name[/^[\!\$]./] if sign && sign.include?('$') @cw = bitmap.width / 3 @ch = bitmap.height / 4 else @cw = bitmap.width / 12 @ch = bitmap.height / 8 end self.ox = @cw / 2 self.oy = @ch end #-------------------------------------------------------------------------- # ● アイコンのビットマップを設定 #-------------------------------------------------------------------------- def set_icon_bitmap self.bitmap = Cache.system("Iconset") @cw = 24 @ch = 24 self.ox = @cw / 2 self.oy = @cw + 4 # 32 (中間) # iconのrectは変化しないので先に設定 index = FieldMap::RT_CHAR[:index] self.src_rect.set(index % 16 * @cw, index / 16 * @ch, @cw, @ch) end #-------------------------------------------------------------------------- # ● Animationのビットマップを設定 #-------------------------------------------------------------------------- def set_animation_bitmap name = FieldMap::RT_CHAR[:file] self.bitmap = Cache.animation(name, FieldMap::RT_CHAR[:hue]) @cw = bitmap.width / 3 @ch = bitmap.height self.ox = @cw / 2 self.oy = 32 end #-------------------------------------------------------------------------- # ● Colorのビットマップを設定 #-------------------------------------------------------------------------- def set_color_bitmap self.bitmap = Bitmap.new(32 * 3, 32) FieldMap::RT_CHAR[:area].each {|area| self.bitmap.fill_rect(area[0], area[1])} @cw = bitmap.width / 3 @ch = bitmap.height self.ox = @cw / 2 self.oy = 32 end #-------------------------------------------------------------------------- # ● 転送元矩形の更新 #-------------------------------------------------------------------------- def update_src_rect case FieldMap::RT_TYPE when 0; update_character_src_rect when 1; update_icon_src_rect when 2; update_animation_src_rect when 3; update_color_src_rect end end #-------------------------------------------------------------------------- # ● 転送元矩形の更新(キャラクター) #-------------------------------------------------------------------------- def update_character_src_rect index = FieldMap::RT_CHAR[:index] pattern = @pattern < 3 ? @pattern : 1 sx = (index % 4 * 3 + pattern) * @cw sy = (index / 4 * 4 + (FieldMap::RT_CHAR[:dir] - 2) / 2) * @ch self.src_rect.set(sx, sy, @cw, @ch) end #-------------------------------------------------------------------------- # ● 転送元矩形の更新(アイコン) #-------------------------------------------------------------------------- def update_icon_src_rect pattern = @pattern < 3 ? @pattern : 1 self.opacity = FieldMap::RT_CHAR[:opacity][pattern] end #-------------------------------------------------------------------------- # ● 転送元矩形の更新(アニメーション) #-------------------------------------------------------------------------- def update_animation_src_rect pattern = @pattern < 3 ? @pattern : 1 self.src_rect.set(pattern * @cw, 0, @cw, @ch) end #-------------------------------------------------------------------------- # ● 転送元矩形の更新(color) #-------------------------------------------------------------------------- def update_color_src_rect pattern = @pattern < 3 ? @pattern : 1 self.src_rect.set(pattern * @cw, 0, @cw, @ch) end #-------------------------------------------------------------------------- # ● 位置の更新 #-------------------------------------------------------------------------- def update_position self.x = screen_x self.y = screen_y end #-------------------------------------------------------------------------- # ● 画面 X 座標の取得 #-------------------------------------------------------------------------- def screen_x $game_map.adjust_x(@pos.x) * 32 + 16 end #-------------------------------------------------------------------------- # ● 画面 Y 座標の取得 #-------------------------------------------------------------------------- def screen_y $game_map.adjust_y(@pos.y) * 32 + 32 end end #============================================================================== # ■ Sprite_FieldRouteSet #============================================================================== class Sprite_FieldRouteSet #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize(viewport, info) @info = info @viewport = viewport create show end def create @route_sprites = [] @info.routes.each { |r| @route_sprites.push( Sprite_FieldRoute.new(@viewport, r) )} end #-------------------------------------------------------------------------- # ● 表示ON #-------------------------------------------------------------------------- def show @info.new_route ? show_new : show_all end #-------------------------------------------------------------------------- # ● 表示ON #-------------------------------------------------------------------------- def show_all if FieldMap::RESET_ROUTE or FieldMap::REMAKE_ROUTE dispose create end @route_sprites.each {|d| d.visible = @info.enable?} end #-------------------------------------------------------------------------- # ● 表示OFF #-------------------------------------------------------------------------- def hide_all @route_sprites.each {|d| d.visible = false} end #-------------------------------------------------------------------------- # ● 表示ON(新規のみ) #-------------------------------------------------------------------------- def show_new return unless @info.new_route @route_sprites.each {|d| d.visible = @info.enable?} end #-------------------------------------------------------------------------- # ● 解放 #-------------------------------------------------------------------------- def dispose @route_sprites.each {|d| d.dispose} end #-------------------------------------------------------------------------- # ● フレーム更新 #-------------------------------------------------------------------------- def update @route_sprites.each {|d| d.update} end end #============================================================================== # ■ Spriteset_FieldMap #============================================================================== class Spriteset_FieldMap < Spriteset_Map #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize(route) @route = route super() end #-------------------------------------------------------------------------- # ● キャラクタースプライトの作成 #-------------------------------------------------------------------------- def create_characters create_routes if FieldMap::RT_SHOW create_places if FieldMap::RT_SHOW super end #-------------------------------------------------------------------------- # ● ルートスプライトの作成 #-------------------------------------------------------------------------- def create_routes @route_sprites = {} @route.route_info.each_pair do |id, r| @route_sprites[id] = Sprite_FieldRouteSet.new(@viewport1, r) @route_sprites[id].hide_all if r.new_route end end #-------------------------------------------------------------------------- # ● 新規ルート表示 #-------------------------------------------------------------------------- def show_new_route(rid) @route_sprites[rid].show_all end #-------------------------------------------------------------------------- # ● 指定イベントのキャラクタスプライト #-------------------------------------------------------------------------- def character_sprite(ev_id) @character_sprites.each do |sprite| if sprite.character.is_a?(Game_Event) and sprite.character.id == ev_id return sprite end end nil end #-------------------------------------------------------------------------- # ● 中継地点スプライトの作成 #-------------------------------------------------------------------------- def create_places() @place_sprites = {} return unless FieldMap::R_SHOW_RT place_info = @route.place_info return if place_info.keys.empty? place_info[:ev].each do |id| ev = $game_map.events[id] pos = FieldMap::FieldPos2.new(ev.x, ev.y) @place_sprites[id] = Sprite_FieldRoute.new(@viewport1, pos) update_show_place(id, place_info[:route][id], false) end end #-------------------------------------------------------------------------- # ● 分岐点の表示更新 #-------------------------------------------------------------------------- def update_show_place(id, routes, update=true) return unless FieldMap::R_SHOW_RT if routes.nil? or routes.empty? $game_map.events[id].transparent = true @place_sprites[id].visible = false elsif (routes.size == 2) # 一本道 $game_map.events[id].transparent = true @place_sprites[id].visible = true elsif routes.size > 2 # 一本道以上 $game_map.events[id].transparent = false @place_sprites[id].visible = false elsif routes.size < 2 # 行き止まり $game_map.events[id].transparent = true @place_sprites[id].visible = false end character_sprite(id).update_other if update end #-------------------------------------------------------------------------- # ● 新規ルートの分岐点非表示 #-------------------------------------------------------------------------- def hide_new_place(rt, place_info) [rt.from_ev_id, rt.to_ev_id].each do |id| next unless FieldMap.tr_include?($game_map.map_id, id) update_show_place(id, place_info[:route][id]) end end #-------------------------------------------------------------------------- # ● 解放 #-------------------------------------------------------------------------- def dispose super @route_sprites.each_value {|d| d.dispose} if FieldMap::RT_SHOW @place_sprites.each_value {|d| d.dispose} if FieldMap::RT_SHOW end #-------------------------------------------------------------------------- # ● フレーム更新 #-------------------------------------------------------------------------- def update super @route_sprites.each_value {|d| d.update} if FieldMap::RT_SHOW and FieldMap::RT_ANIME @place_sprites.each_value {|d| d.update} if FieldMap::RT_SHOW and FieldMap::RT_ANIME end #-------------------------------------------------------------------------- # ● 中継地点表示 #-------------------------------------------------------------------------- def show_place(ev_id) @place_sprites[ev_id].visible = $game_system.field[@map_id].place[ev_id].enable? end def hide_place(ev_id) @place_sprites[ev_id].visible = false end end