赞 | 0 |
VIP | 4 |
好人卡 | 0 |
积分 | 2 |
经验 | 31715 |
最后登录 | 2021-9-11 |
在线时间 | 829 小时 |
Lv1.梦旅人
- 梦石
- 0
- 星屑
- 180
- 在线时间
- 829 小时
- 注册时间
- 2010-6-26
- 帖子
- 671
|
不负责翻译,默认工程上画一画可能就知道它的效果了。- #==============================================================================
- # ☆VX RGSS2 「DQ風屋内外屋根切り替え」☆
- # EnDlEss DREamER
- # URL:http://mitsu-evo.6.ql.bz/
- # 製作者 mitsu-evo
- # Last:2010/7/9
- # 周囲が消えたり部屋に屋根がかかったりする。
- # ▼ 「▼ 素材」に近い位置に挿入。KGC様「タイルセット拡張」より上。
- #==============================================================================
- $ed_rgss2 = {} if $ed_rgss2 == nil
- $ed_rgss2["ed_auto_roof"] = true
- =begin
- 7/9:ExMap_AutoWeather改に対応修正。
- ================================================================================
- ★ 主な仕様 ★
-
- ☆ 屋根自動作成部 ☆
-
- ?オートルーフ(屋内外自動屋根)はチップセット「TileA3」「TileA4」
- の屋根部分にのみ対応しています。
-
- ?オートルーフの範囲設定はエリアを作成しエリア名を「屋内」とすること。
- それ以外の名前では自動的に描画されません。
-
- ☆ エリア設定部 ☆
-
- ?エリア範囲内の壁や床は屋根で隠れてしまいます。
- 入り口などを作成する場合はその辺りも考慮して
- 入り口付近のマップを作成して下さい。
-
- ?エリアの「左上」は「埋める屋根のベース」となるので
- エリア左上のマップチップは必ず屋根にして下さい。
-
- ?隣接するエリアで同一屋根タイルIDの場合は隣接エリアも一つの屋根とされます。
- 別のタイルIDであれば隣接しても同一処理を行ないません。
- (隣合うエリアの屋根タイルIDが同じなら一つの屋根にする)
-
- ?屋内に設定されたエリアはそこに入るとエリア外を設定のタイルIDで埋めます。
- 純正では「TileA5」の一番左上の黒チップを使用しています。
-
- ?屋外では自動的に屋根がエディタで配置したチップで設定のエリア内を埋めます。
- 一応、エリアの外枠は自動的に適したチップを配置するようにしています。
- 複雑な形状の場合は複数のエリア隣接させて作成して下さい。
-
- ?屋内でも屋外でも表示したい部分を設定することができます。
- これはオートルーフ機能はなくエディタ上のチップを表示します。
- 屋根エリア内でもこちらが優先されます。
-
-
- ☆ その他機能 ☆
-
- ?屋外と屋内を同一マップにするため、マップが大きくなり
- 重たくなる可能性があります。
-
- ?屋内外移動演出として「場所移動」っぽいエフェクトですが場所移動は行なってません。
-
- ?天候はなにもいじってないのでその都度イベントか何かで設定して下さい。
-
- ?昔の「テク研」様のように自動で現在座標を変数に反映します。
- (X * 1000 + Y ) = [20 00 7(20007)]
-
- ?現在座標のタイルIDも変数に反映します。
- 屋根作りの時にテストプレイ時にF9で変数を見ればタイルIDが確認できます。
-
- ?現在座標が屋内ならスイッチがONになり、屋外ならスイッチがOFFになります。
-
- ?設定項目のタイルIDは参考サイト様のデータやデバッグ画面で変数を確認して下さい。
-
- ?場所移動及び屋内外移動時に通常フェードの代わりにトランジションを利用できます。
- 利用する場合はプロジェクトの「グラフィックフォルダ」の「システム」に
- トランジション画像を入れて設定を行なって下さい。
-
- ?イベント作成時に表示したいイベントの元の位置が主人公とは違う場所
- (主人公が屋内ならイベントが屋外。またはその逆。)の場合は
- イベントコマンド「移動ルートの設定」の「透明化 OFF」を実行してから
- 「イベントの位置設定」などを使用して下さい。
- 自動的に表示領域外のイベントは透明化されているので表示されていません。
-
-
- ================================================================================
-
- ★ 参考サイト様 ★
-
- Delusion Field 様
-
- http://www5f.biglobe.ne.jp/~delusion/tech/text_003.html
-
- ここでツクールVXの全てのタイルIDテーブルをエクセルで配布してます。
-
- 紳士の月面工房 様
-
- http://tsukishinshi.blog73.fc2.com/blog-entry-33.html
-
- オートタイルの詳細を解説しています。
-
- ================================================================================
-
- ★ マップの作り方 ★
-
- 1.エディタで屋内外マップを作成し、内装も作っちゃいます。
-
- 2.エリア名を「屋内」としたエリアを部屋の外枠と同じに設定します。
- この時に部屋の屋根部分を設定し、外壁などを範囲に入れない。
-
- 3.エリア設定時に必ず「エリアの左上」は屋根チップを配置すること。
- この「エリアの左上」を基準に屋根を自動的に埋めていきます。
-
- 4.複雑な形状の屋根は「細かく隣接させてエリア設定」を行なって下さい。
- エリアを重ねずに設定して下さい。
- 例:■□ 四角は設定エリア。
- □■□ 全ての四角がくっついて一つの部屋であるものと仮定。
- 5.マップを歩くと部屋エリアに入れば自動で外と中が切り替わります。
-
- 6.「屋内外表示」とエリア名を設定したエリアでは屋内でも屋外でも表示されます。
-
-
- ================================================================================
- =end
- $ed_rgss2 = {} if $ed_rgss2 == nil
- $ed_rgss2["ed_map_indoors"] = true
- module ED
-
- # ★ 設定項目 ★
-
- # 屋内エリア名設定文字(この文字を検知してエリア内を屋内にする)
- INDOOR_AREA_NAME = "屋内"
- # 屋内でも屋外でも表示させたい部分のエリア名設定
- # (部屋の外壁など中でも外でも表示したい場合など)
- OUTDOOR_AREA_NAME = "屋内外表示"
- # 現在座標を格納する変数番号
- NOW_MAP_POSITION = 9
- # 現在座標のタイルIDを格納する変数番号
- NOW_MAP_TILE_ID = 10
- # 屋内外設定スイッチ番号(スイッチONで屋内)
- NOW_MAP_INDOOR = 9
-
-
- # 屋外消去用タイルマップID(「TileA5」の一番左上)
- # 「参考サイト様」かテストプレイでタイルIDを調べて
- # 「タイルセットA」の中から屋外を埋めるタイルをID指定。
- OUTDOOR_TILE_ID = 1544 # 純正では「黒」で埋めます。
- # レイヤ2層目以降消去用タイルマップID(タイルセットBの左上)
- # 屋外での内装タイルセットB以降の非表示に使用。
- LAYER2_TILE_ID = 0 # 通常はいじらなくても良い。
-
- # トランジションを有効にするかどうか(無効ならフェード)
- ROOF_TRANSITION = true#false
- # 移動トランジション画像("Graphics/System/ファイル名")
- ROOF_TRANSITION_FILE_NAME = "Graphics/System/003-Blind03"
- # 移動トランジションにかける時間
- ROOF_TRANSITION_TIME = 30
-
- end
-
- #==============================================================================
- # ■ Game_Map
- #------------------------------------------------------------------------------
- # マップを扱うクラスです。スクロールや通行可能判定などの機能を持っています。
- # このクラスのインスタンスは $game_map で参照されます。
- #==============================================================================
- class Game_Map
-
- #--------------------------------------------------------------------------
- # ● ディープコピーメソッド item : アイテム
- #--------------------------------------------------------------------------
- def item_copy(item)
- @copy_item = Marshal.load(Marshal.dump(item))
- return @copy_item
- end
- #--------------------------------------------------------------------------
- # ● セットアップ
- # map_id : マップ ID
- #--------------------------------------------------------------------------
- alias ed_map_indoors_setup setup
- def setup(map_id)
- # ロード直後に実行されたりする。
- ed_map_indoors_setup(map_id)
- @map_areas = []
- ed_indoors_map_areas(map_id) # 現在マップのエリアデータ取得
- @check_area = 0
- now_position(true)
- end
- #--------------------------------------------------------------------------
- # ● 現在マップのエリアデータのみを取得
- # map_id : マップ ID
- #--------------------------------------------------------------------------
- def ed_indoors_map_areas(map_id)
- result = []
- $data_areas.values.each{|area|
- # 指定マップIDが今のエリアの親マップIDと同一の場合は配列に加える。
- result << area if map_id == area.map_id
- }
- @map_areas = result
- end
- #--------------------------------------------------------------------------
- # ● プレイヤーの現在位置の情報を取得する。
- #--------------------------------------------------------------------------
- def now_position(flag = false)
- ed_indoors_map_areas(@map_id) if @map_areas == nil
- result = []
- areas = [] # 屋内エリアの配列
- area_switch = false
- now_x = $game_player.x
- now_y = $game_player.y
-
-
- # 現在座標を変数に入れる。(x*1000+y = [xx000yy]という数字)
- $game_variables[ED::NOW_MAP_POSITION] = now_x * 1000 + now_y
- result.push($game_variables[ED::NOW_MAP_POSITION])
-
- # タイル ID を取得
- # @map.data[x, y, レイヤー(0~2)]
- $game_variables[ED::NOW_MAP_TILE_ID] = @map.data[$game_player.x, $game_player.y, 0]
- result.push($game_variables[ED::NOW_MAP_TILE_ID])
-
- # 現在マップにエリアデータが存在しない場合は処理を行なわない。
- if @map_areas == []
- # エリアデータが存在しない場合は新たなマップデータには nil を入れる
- @new_map = nil
- return
- end
- # 現在位置が屋内エリア内かどうか。
- @map_areas.each{|area|
- # エリア名と設定名のエリアが一致したら屋内エリアリストに追加
- if area.name == ED::INDOOR_AREA_NAME # エリア名が屋内設定と同じ?
- areas.push(area) # 屋内エリアをリストに追加
- elsif area.name == ED::OUTDOOR_AREA_NAME # エリア名が屋内外設定と同じ?
- areas.push(area) # 屋内外表示エリアをリストに追加
- end
- # エリア内ならローカル変数をtrue
- if ed_in_area?(area, now_x, now_y)
- area_switch = true
- end
- }
-
- # ローカル変数がtrueならスイッチオン
- if area_switch
- $game_switches[ED::NOW_MAP_INDOOR] = true
- else
- $game_switches[ED::NOW_MAP_INDOOR] = false
- end
-
- # スイッチがONなら天候停止。そうでないなら天候再開
- if $game_switches[ED::NOW_MAP_INDOOR]
- stop_weather if $ed_rgss2["ed_auto_weather"]
- else
- if $ed_rgss2["ed_auto_weather"]
- EXMAP_ATWTR_MAPS.each{|weather|
- if weather[0] == @map_id
- start_weather
- break
- end
- }
- end
- end
-
- # マップ更新処理
- indoor_area(areas) if flag and areas != []
-
- return result
- end
- #--------------------------------------------------------------------------
- # ● エリア全体判定(屋内エリア判定用)
- # x : x座標(論理) y : y座標(論理)
- # tile_check : タイルIDチェック
- # tile_id : ベースタイルID(上記チェック有効時に設定)
- #--------------------------------------------------------------------------
- def ed_in_areas?(x, y, tile_check = false, tile_id = 0)
- flag = false
- # マップ全体の屋内エリアサーチ
- @map_areas.each{|area|
- # サーチエリアが屋内かどうか?check_tile_id(x,y) == tile_id
- if ed_in_area?(area, x, y, tile_check, tile_id)
- # サーチエリアが屋内&エリアの左上(ベースタイルID)が
- # 呼び出し元エリアベースタイルIDと同じ場合は隣接エリアと統合
- flag = check_base_tile(area.rect.x, area.rect.y, 0) == tile_id ? true : false
- end
- # 屋内ならtrueを返す
- return true if flag
- }
- return false
- end
- #--------------------------------------------------------------------------
- # ● エリア内判定(屋内エリア判定用)
- # area : エリアデータ (RPG::Area)
- # x : x座標(論理) y : y座標(論理)
- # tile_check : タイルIDチェック
- # tile_id : ベースタイルID(上記チェック有効時に設定)
- #--------------------------------------------------------------------------
- def ed_in_area?(area, x, y, tile_check = false, tile_id = 0)
- return false if area == nil
- return false if @map_id != area.map_id
- unless area.name == ED::INDOOR_AREA_NAME # エリア名が屋内設定と同じ?
- # 今のエリアと屋内設定名が一致しないなら屋外
- return false
- end
- return false if x < area.rect.x
- return false if y < area.rect.y
- return false if x >= area.rect.x + area.rect.width
- return false if y >= area.rect.y + area.rect.height
- # タイルIDもチェックして屋根タイル以外はfalse
- if tile_check
- # タイルIDチェックで「0」なら屋根タイルでない。
- return false if revision_tile_id(tile_id) == 0
- end
- return true
- end
- #--------------------------------------------------------------------------
- # ● エリア内判定(共通表示エリア判定用)
- # area : エリアデータ (RPG::Area)
- # x : x座標(論理) y : y座標(論理)
- #--------------------------------------------------------------------------
- def ed_outdoor_area?(area, x, y)
- return false if area == nil
- return false if @map_id != area.map_id
- unless area.name == ED::OUTDOOR_AREA_NAME # エリア名が屋内設定と同じ?
- # 今のエリアと屋内設定名が一致しないなら屋外
- return false
- end
-
- return false if x < area.rect.x
- return false if y < area.rect.y
- return false if x >= area.rect.x + area.rect.width
- return false if y >= area.rect.y + area.rect.height
- return true
- end
- #--------------------------------------------------------------------------
- # ● 隣接エリアサーチ(現在座標の±1の隣接がエリア内ならtrue)
- # areas : 屋内エリアリスト (RPG::Areaをまとめたもの)
- # now_area : 比較元のエリア
- # x : x座標(論理) y : y座標(論理)
- #--------------------------------------------------------------------------
- def adjoin_area_search(areas, now_area, x, y)
- areas.each{|area|
- # IDでチェックしないと名前ではチェックできない
- next if now_area.id == area.id
- return true if ed_in_area?(area, x, y)
- }
- return false
- end
- #--------------------------------------------------------------------------
- # ● エリア境界判定(屋内エリア判定用)
- # areas : 屋内エリアリスト (RPG::Areaをまとめたもの)
- # x : x座標(論理) y : y座標(論理)
- #--------------------------------------------------------------------------
- def ed_in_area_border?(areas, now_area, x, y)
- # 現在のタイルを取得
- now_tile = revision_tile_id(@map.data[x, y, 0])
- adjoin_tile = 0
- # 屋根以外のチップは nil を返し戻る
- return nil if now_tile == 0
-
- for area in areas
-
- if x == now_area.rect.x
- # 現在座標とエリアの左端が同じ
- if adjoin_area_search(areas, area, x - 1, y)
- adjoin_tile = revision_tile_id(@map.data[x - 1, y, 0])
- break
- end
- elsif y == now_area.rect.y
- # 現在座標とエリアの上端が同じ
- if adjoin_area_search(areas, area, x, y - 1)
- adjoin_tile = revision_tile_id(@map.data[x, y - 1, 0])
- break
- end
- elsif x == now_area.rect.x + area.rect.width
- # 現在座標とエリアの右端が同じ
- if adjoin_area_search(areas, area, x + 1, y)
- adjoin_tile = revision_tile_id(@map.data[x + 1, y, 0])
- break
- end
- elsif y == now_area.rect.y + area.rect.height
- # 現在座標とエリアの下端が同じ
- if adjoin_area_search(areas, area, x, y + 1)
- adjoin_tile = revision_tile_id(@map.data[x, y + 1, 0])
- break
- end
- else
- # 現在座標はエリアの端ではない
- next
- end
-
- end
- # 屋根以外のチップは nil を返し戻る
- return nil if adjoin_tile == 0
-
- # 今の座標のタイルと隣接タイル(adjoin_tile)が同じでない
- unless now_tile == adjoin_tile
- # 隣接タイルは同じでないのでfalse
- return false
- end
- # 隣接タイルは同じ
- return true
- end
- #--------------------------------------------------------------------------
- # ● 屋根張付け用のベースとなるタイルの周囲1座標検出用
- #--------------------------------------------------------------------------
- def check_base_tile(x, y, i)
- if revision_tile_id(@map.data[x, y, i]) != 0
- # その場のベースチェック
- return revision_tile_id(@map.data[x, y, i])
-
- elsif revision_tile_id(@map.data[x - 1, y - 1, i]) != 0
- # 指定座標の左上チェック
- return revision_tile_id(@map.data[x - 1, y - 1, i])
-
- elsif revision_tile_id(@map.data[x, y - 1, i]) != 0
- # 指定座標の上チェック
- return revision_tile_id(@map.data[x, y - 1, i])
-
- elsif revision_tile_id(@map.data[x + 1, y - 1, i]) != 0
- # 指定座標の右上チェック
- return revision_tile_id(@map.data[x + 1, y - 1, i])
-
- elsif revision_tile_id(@map.data[x - 1, y + 1, i]) != 0
- # 指定座標の左下チェック
- return revision_tile_id(@map.data[x - 1, y + 1, i])
-
- elsif revision_tile_id(@map.data[x - 1, y , i]) != 0
- # 指定座標の左チェック
- return revision_tile_id(@map.data[x - 1, y, i])
-
- elsif revision_tile_id(@map.data[x, y + 1, i]) != 0
- # 指定座標の下チェック
- return revision_tile_id(@map.data[x, y + 1, i])
-
- elsif revision_tile_id(@map.data[x + 1, y + 1, i]) != 0
- # 指定座標の右下チェック
- return revision_tile_id(@map.data[x + 1, y + 1, i])
-
- elsif revision_tile_id(@map.data[x + 1, y, i]) != 0
- # 指定座標の右チェック
- return revision_tile_id(@map.data[x + 1, y, i])
-
- end
- end
- #--------------------------------------------------------------------------
- # ● 屋内エリアの角ならタイルIDをさらに加算補正
- #--------------------------------------------------------------------------
- def check_angle(area, x, y, tile_id)# tile_id はベースタイルID
- return 0 if tile_id == 0
- # まず現在座標が屋内エリア内か?
- if ed_in_area?(area, x, y)
- # ed_in_area?(area, x - 1, y, true, tile_id)
- if ed_in_areas?(x - 1, y, true, tile_id) == false &&
- ed_in_areas?(x, y - 1, true, tile_id) == false
- # 左上の角チェック(左と上の座標がエリア外なら屋内エリアの左上角)
- # ベースのタイルIDに加算する値でタイルセットA3とA4で値を分岐
- return tile_id < 5504 ? 3 : 34
-
- elsif ed_in_areas?( x + 1, y, true, tile_id) == false &&
- ed_in_areas?( x, y - 1, true, tile_id) == false
- # 右上の角チェック(右と上の座標がエリア外なら屋内エリアの右上角)
- return tile_id < 5504 ? 6 : 36
-
- elsif ed_in_areas?( x - 1, y, true, tile_id) == false &&
- ed_in_areas?( x, y + 1, true, tile_id) == false
- # 左下の角チェック(左と下の座標がエリア外なら屋内エリアの左下角)
- return tile_id < 5504 ? 9 : 40
-
- elsif ed_in_areas?( x + 1, y, true, tile_id) == false &&
- ed_in_areas?( x, y + 1, true, tile_id) == false
- # 右下の角チェック(右と下の座標がエリア外なら屋内エリアの右下角)
- return tile_id < 5504 ? 12 : 38
-
-
- elsif ed_in_areas?( x, y + 1, true, tile_id) == false
- # 下のチェック(下がエリア外で上がエリア内なら屋内エリアの下端)
- return tile_id < 5504 ? 8 : 28
-
- elsif ed_in_areas?( x + 1, y, true, tile_id) == false
- # 右のチェック(右がエリア外で左がエリア内なら屋内エリアの右端)
- return tile_id < 5504 ? 4 : 24
-
- elsif ed_in_areas?( x, y - 1, true, tile_id) == false
- # 上のチェック(上がエリア外で下がエリア内なら屋内エリアの上端)
- return tile_id < 5504 ? 2 : 20
-
- elsif ed_in_areas?( x - 1, y, true, tile_id) == false
- # 左のチェック(左がエリア外で右がエリア内なら屋内エリアの左端)
- return tile_id < 5504 ? 1 : 16
-
- else
- return 0
- end
- else
- return 0
- end
- end
- #--------------------------------------------------------------------------
- # ● 屋根タイルIDのベース処理(SHIFTキーで配置したタイルに変更)
- #--------------------------------------------------------------------------
- def revision_tile_id(tile_id)
- case tile_id
-
- # 「TileA3 = 壁タイプオートタイル」
- when 4352...4400
- tile_id = 4352
- when 4400...4448
- tile_id = 4400
- when 4448...4496
- tile_id = 4448
- when 4496...4544
- tile_id = 4496
- when 4544...4592
- tile_id = 4544
- when 4592...4640
- tile_id = 4592
- when 4640...4688
- tile_id = 4640
- when 4688...4736
- tile_id = 4688
-
- when 5120...5168
- tile_id = 5120
- when 5168...5216
- tile_id = 5168
- when 5216...5264
- tile_id = 5216
- when 5264...5312
- tile_id = 5264
- when 5312...5360
- tile_id = 5312
- when 5360...5408
- tile_id = 5360
- when 5408...5456
- tile_id = 5408
- when 5456...5504
- tile_id = 5456
-
- # 「TileA4 = 床タイプオートタイル」
- when 5888...5936
- tile_id = 5888
- when 5936...5984
- tile_id = 5936
- when 5984...6032
- tile_id = 5984
- when 6032...6080
- tile_id = 6032
- when 6080...6128
- tile_id = 6080
- when 6128...6176
- tile_id = 6128
- when 6176...6224
- tile_id = 6176
- when 6224...6272
- tile_id = 6224
-
- when 6656...6704
- tile_id = 6656
- when 6704...6752
- tile_id = 6704
- when 6752...6800
- tile_id = 6752
- when 6800...6848
- tile_id = 6800
- when 6848...6896
- tile_id = 6848
- when 6896...6944
- tile_id = 6896
- when 6944...6992
- tile_id = 6944
- when 6992...7040
- tile_id = 6992
-
- when 7424...7472
- tile_id = 7424
- when 7472...7520
- tile_id = 7472
- when 7520...7568
- tile_id = 7520
- when 7568...7616
- tile_id = 7568
- when 7616...7664
- tile_id = 7616
- when 7664...7712
- tile_id = 7664
- when 7712...7760
- tile_id = 7712
- when 7760...7808
- tile_id = 7760
- else
- # 屋根タイルでない。
- tile_id = 0
- end
-
- return tile_id
-
- end
- #--------------------------------------------------------------------------
- # ● マップ全体から屋内エリアを探し出す。(左から右へ。上から下へ検索)
- # areas : 屋内エリアリスト (RPG::Areaをまとめたもの)
- #--------------------------------------------------------------------------
- def indoor_area(areas)
- # 現在マップのデータをディープコピー
- now_map_data = item_copy(@map)
- # 屋内エリアチェック用座標変数
- check_coordinate = 0
- in_area = false
- indicate = false
- now_area = []
- for y in 0...height
- for x in 0...width
- indicate = false
- # 屋内エリア集の中から現在座標がエリア内かどうかを調べる。
- areas.each{|area|
- if ed_in_area?(area, x, y) # 指定座標がエリア内か?
- in_area = true # 検知座標がエリア内
- now_area = area # 検知座標のエリアデータ
- break
- else
- in_area = false # 検知座標はエリア外
- end
- }#areas.each{|area|
-
- # さらに共通表示エリアがあればそちらも処理を行なう。
- areas.each{|area|
- # 処理を別にすることで優先的に共通エリアを設定出来る。
- if ed_outdoor_area?(area, x, y) # 屋内外共通表示エリア
- indicate = true # 検知座標が共通表示エリア
- break
- end
- }
-
-
- # タイルID取得
- for i in [2, 1, 0] # レイヤーの上から順に調べる
- if indicate
- # 共通表示エリア
- now_map_data.data[x, y, i] = @map.data[x, y, i]
- next
- elsif in_area # 指定座標がエリア内か?
- # 屋内エリア
- if $game_switches[ED::NOW_MAP_INDOOR]
- # 現在プレイヤーが屋内にいるなら元のデータを取得
- now_map_data.data[x, y, i] = @map.data[x, y, i] # タイル ID を取得
- check_events(x, y, false)
- else
- # 屋内エリア探知だがプレイヤーが屋外にいる(エリア左側のチップを配置)
- if check_coordinate == 0
- if i == 0
- # 屋根タイルである
- # ベース設定なので元のマップデータを使用する。
- base_tile = check_base_tile(now_area.rect.x, now_area.rect.y, i)
- # 適正なタイルIDに補正する。
- layout_tile = revision_tile_id(base_tile)
- # 角ならさらに適正なタイルにする。
- layout_tile += check_angle(now_area, x, y, layout_tile)
- # マップデータを補正後のタイルIDに更新。
- now_map_data.data[x, y, i] = layout_tile
- else
- # レイヤ1以外はプレイヤーが屋外なら消去。
- now_map_data.data[x, y, i] = ED::LAYER2_TILE_ID
- end
- else
- # 屋根は必ず枠があり、チェックは左上から下へ降りるので
- # 枠の屋根チップ座標を取得。
- if i == 0
- # 上書きしたベースタイルIDを適用する。
- border = ed_in_area_border?(areas, now_area, x, y)
- if border == true
- # 端なら適正なタイルにする。
- layout_tile = base_tile + check_angle(now_area, x, y, base_tile)
- elsif border == false
- # 隣接エリアと違う
- check_coordinate = 0
- # ベース設定なので元のマップデータを使用する。
- base_tile = check_base_tile(x, y, i)
- # 適正なタイルIDに補正する。
- layout_tile = revision_tile_id(base_tile)
- # 角ならさらに適正なタイルにする。
- layout_tile += check_angle(now_area, x, y, layout_tile)
- else
- # 隣接エリアが屋根でない
- base_tile = check_base_tile(now_area.rect.x,
- now_area.rect.y, i)
- # 適正なタイルIDに補正する。
- layout_tile = revision_tile_id(base_tile)
- # 角ならさらに適正なタイルにする。
- layout_tile += check_angle(now_area, x, y, layout_tile)
- end
- now_map_data.data[x, y, i] = layout_tile
- else
- now_map_data.data[x, y, i] = ED::LAYER2_TILE_ID
- end
- end
- check_events(x, y, true)
- end
- else
- # 屋外エリア及び無設定
- check_coordinate = 0 # 屋外なので初期化
- if $game_switches[ED::NOW_MAP_INDOOR]
- check_events(x, y, true)
- # 屋外だがプレイヤーが屋内にいる(周囲を消す[ID:1544(無チップ)])
- if i == 0
- now_map_data.data[x, y, i] = ED::OUTDOOR_TILE_ID
- else
- now_map_data.data[x, y, i] = ED::LAYER2_TILE_ID
- end
- else
- # プレイヤーも屋外にいるので元のデータを使用する。
- check_events(x, y, false)
- now_map_data.data[x, y, i] = @map.data[x, y, i] # タイル ID を取得
- end
- end
-
- end#for i in [2, 1, 0]
-
- # タイルID置換チェック加算
- check_coordinate += 1 if in_area
-
- end#for x in 0...width
-
- end#for y in 0...height
-
- # 更新したマップデータをインスタンス変数に代入。
- @new_map = now_map_data
- end
- #--------------------------------------------------------------------------
- # ● 指定座標イベントの透明化処理(隠している場所のイベントの消去)
- # x?y : 座標 transparent : 透明化
- #--------------------------------------------------------------------------
- def check_events(x, y,transparent = false)
- # @events はハッシュ
- for event in @events.values
- next if event == nil
- if event.x == x and event.y == y
- # マップ内外の透明化処理
- event.transparent = transparent
- end
- end
-
- # @vehicles は配列
- for vehicle in @vehicles
- next if vehicle == nil
- if vehicle.x == x and vehicle.y == y
- # マップ内外の透明化処理
- vehicle.transparent = transparent
- end
- end
- end
- #--------------------------------------------------------------------------
- # ● マップデータの取得
- #--------------------------------------------------------------------------
- def data
- unless @new_map == nil
- return @new_map.data
- else
- return @map.data
- end
- end
- end
- #==============================================================================
- # ■ Game_Player
- #------------------------------------------------------------------------------
- # プレイヤーを扱うクラスです。イベントの起動判定や、マップのスクロールなどの
- # 機能を持っています。このクラスのインスタンスは $game_player で参照されます。
- #==============================================================================
- class Game_Player < Game_Character
- #--------------------------------------------------------------------------
- # ● 切り替えチェック用変数の設定
- #--------------------------------------------------------------------------
- def check_map=(value)
- @check_map = value
- end
- #--------------------------------------------------------------------------
- # ● 屋内外切り替え
- #--------------------------------------------------------------------------
- def indoor_change
- # 現在の位置情報を取得
- if $game_switches[ED::NOW_MAP_INDOOR] and @check_map != 2
- $game_map.now_position(true) # true でタイルIDの変更チェック
- @check_map = 2
- elsif $game_switches[ED::NOW_MAP_INDOOR] != true and @check_map != 1
- $game_map.now_position(true)
- @check_map = 1
- end
- end
- #--------------------------------------------------------------------------
- # ● 場所移動の実行
- #--------------------------------------------------------------------------
- alias ed_map_indoors_perform_transfer perform_transfer
- def perform_transfer
- ed_map_indoors_perform_transfer
- $game_map.now_position(true) # 別マップへ移動
- $game_map.now_position # 上でマップ更新、これでスイッチ更新
- end
- end
- #==============================================================================
- # ■ Scene_Map
- #------------------------------------------------------------------------------
- # マップ画面の処理を行うクラスです。
- #==============================================================================
- class Scene_Map < Scene_Base
-
- #--------------------------------------------------------------------------
- # ● 開始処理
- #--------------------------------------------------------------------------
- alias ed_map_indoors_start start
- def start
- ed_map_indoors_start
- @check_map = 0
- check_indoor_sprite(false)
- end
- #--------------------------------------------------------------------------
- # ● 一定時間ウェイト
- # duration : ウェイト時間 (フレーム数)
- #--------------------------------------------------------------------------
- def wait(duration)
- for i in 0...duration
- update_basic
- end
- end
- #--------------------------------------------------------------------------
- # ● 屋内移動などのトランジション処理(消去)
- # duration : トランジションにかけるフレーム数
- # vague : 転送元と転送先の境界のあいまいさ
- #--------------------------------------------------------------------------
- def indoor_transition_out(duration = 10, vague = 40)
- return unless ED::ROOF_TRANSITION
- Graphics.transition(duration, ED::ROOF_TRANSITION_FILE_NAME, vague)
- Graphics.freeze
- end
- #--------------------------------------------------------------------------
- # ● 屋内移動などのトランジション処理(表示)
- # duration : トランジションにかけるフレーム数
- # vague : 転送元と転送先の境界のあいまいさ
- #--------------------------------------------------------------------------
- def indoor_transition_in(duration = 10, vague = 40)
- return unless ED::ROOF_TRANSITION
- if Graphics.brightness == 0 # 戦闘後、ロード直後など
- fadein(duration)
- else
- Graphics.freeze
- Graphics.transition(duration, ED::ROOF_TRANSITION_FILE_NAME, vague)
- end
- end
- #--------------------------------------------------------------------------
- # ● 場所移動の処理
- #--------------------------------------------------------------------------
- def update_transfer_player
- return unless $game_player.transfer?
- @transfer_player = true # 場所移動中フラグ
- fade = (Graphics.brightness > 0)
- # フェード及びトランジション処理
- if ED::ROOF_TRANSITION
- indoor_transition_out(ED::ROOF_TRANSITION_TIME) if fade
- else
- fadeout(30) if fade
- end
-
- # 元の処理
- @spriteset.dispose # スプライトセットを解放
- $game_player.perform_transfer # 場所移動の実行
- $game_map.autoplay # BGM と BGS の自動切り替え
- $game_map.update
- Graphics.wait(15)
- @spriteset = Spriteset_Map.new # スプライトセットを再作成
-
- # フェード及びトランジション処理
- if ED::ROOF_TRANSITION
- indoor_transition_in(ED::ROOF_TRANSITION_TIME) if fade
- else
- fadein(30) if fade
- end
- Input.update
- @transfer_player = false # 場所移動が終われば無効に
- end
- #--------------------------------------------------------------------------
- # ● 屋内外移動時のスプライト更新
- #--------------------------------------------------------------------------
- def check_indoor_sprite(fade = true)
- @check_map = 0 if @check_map == nil
- # 画面がスクロール中かどうか取得
- flag = $game_player.moving?
- if @transfer_player
- # 場所移動中は歩行フラグをfalseにして処理を実行できるようにする。
- flag = false
- end
- $game_map.now_position # 現在の位置情報を取得
- # 現在の位置情報を取得
- if $game_switches[ED::NOW_MAP_INDOOR] and @check_map != 2# and not flag
- # 部屋の中に移動時の切り替え処理
- if ED::ROOF_TRANSITION
- indoor_transition_out(ED::ROOF_TRANSITION_TIME) if fade
- else
- fadeout(30) if fade
- end
- $game_player.indoor_change
- unless @spriteset == nil
- @spriteset.dispose
- @spriteset = Spriteset_Map.new
- @spriteset.update#update_basic
- end
- @check_map = 2
- if ED::ROOF_TRANSITION
- indoor_transition_in(ED::ROOF_TRANSITION_TIME) if fade
- else
- fadein(30) if fade
- end
- elsif $game_switches[ED::NOW_MAP_INDOOR] != true and
- @check_map != 1 and not flag
- # 部屋の中から外へ出た時の処理。
- # flag 移動中でない時に処理をする = 歩行後の処理となる。
- if ED::ROOF_TRANSITION
- indoor_transition_out(ED::ROOF_TRANSITION_TIME) if fade
- else
- fadeout(30) if fade
- end
- $game_player.indoor_change
- unless @spriteset == nil
- @spriteset.dispose
- @spriteset = Spriteset_Map.new
- @spriteset.update#update_basic
- end
- @check_map = 1
- if ED::ROOF_TRANSITION
- indoor_transition_in(ED::ROOF_TRANSITION_TIME) if fade
- else
- fadein(30) if fade
- end
- end
- end
- #--------------------------------------------------------------------------
- # ● フレーム更新
- #--------------------------------------------------------------------------
- alias ed_map_indoors_update update
- def update
- check_indoor_sprite unless @transfer_player
- ed_map_indoors_update
- end
- end
复制代码 |
|