Project1
标题:
来块黑抹布!
[打印本页]
作者:
Hjdie
时间:
2011-1-13 20:56
标题:
来块黑抹布!
本帖最后由 Hjdie 于 2011-1-13 20:58 编辑
嗯。好标题就代表有秂妻!所以。继续问问题。
很多时候。我们在玩手游或者CBA或者那啥的时候。会有一只这样的效果。
未命名.jpg
(20.69 KB, 下载次数: 20)
下载附件
保存到相册
2011-1-13 20:57 上传
主角在门口站着的时候。看不到里面是个啥。
但是。当主角进入后
未命名2.jpg
(27.69 KB, 下载次数: 23)
下载附件
保存到相册
2011-1-13 20:57 上传
就可以看到里面是个啥了。
然后。这个效果叫什么。有没有可能做成这样的效果?
作者:
david50407
时间:
2011-1-13 21:03
你可以画两张地图...
一张亮的 一张暗的
作者:
Hjdie
时间:
2011-1-13 21:51
回复
david50407
的帖子
= =。我画了一张大地图。我想角色走到某一个区域。某一个区域就亮起来。离开就暗下去。
作者:
企鹅达达
时间:
2011-1-13 21:58
不负责翻译,默认工程上画一画可能就知道它的效果了。
#==============================================================================
# ☆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
复制代码
作者:
亿万星辰
时间:
2011-1-13 22:13
本帖最后由 亿万星辰 于 2011-1-13 22:19 编辑
这个我以前写过的……你搜索一下“哇哈哈标题党”
作者:
l65591397
时间:
2011-1-13 22:19
提示:
作者被禁止或删除 内容自动屏蔽
作者:
我的米呀
时间:
2011-1-14 03:26
本帖最后由 我的米呀 于 2011-1-14 03:27 编辑
我又来纯事件了……其实这个一张地图就可以了,在除TILEA类外的地图里加快黑抹布即可。于是上传附件,加了开宝箱的情况、商店的情况、战斗的情况。
DQ风.rar
(708.13 KB, 下载次数: 33)
2011-1-14 03:19 上传
点击文件名下载附件
欢迎光临 Project1 (https://rpg.blue/)
Powered by Discuz! X3.1