设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 2410|回复: 6
打印 上一主题 下一主题

[已经过期] 来块黑抹布!

[复制链接]

Lv1.梦旅人

梦石
0
星屑
50
在线时间
112 小时
注册时间
2010-11-11
帖子
111
跳转到指定楼层
1
发表于 2011-1-13 20:56:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
本帖最后由 Hjdie 于 2011-1-13 20:58 编辑

嗯。好标题就代表有秂妻!所以。继续问问题。
很多时候。我们在玩手游或者CBA或者那啥的时候。会有一只这样的效果。

主角在门口站着的时候。看不到里面是个啥。
但是。当主角进入后

就可以看到里面是个啥了。
然后。这个效果叫什么。有没有可能做成这样的效果?

点评

= =。标题里没有含有“跪求”,“在线等”,“泪奔”之类的词语啊。并且很符合题意!(PS:谢谢提醒噶)  发表于 2011-1-13 21:00
看版规...当心被扣分  发表于 2011-1-13 20:58

Lv1.梦旅人

梦石
0
星屑
50
在线时间
462 小时
注册时间
2007-7-30
帖子
643
2
发表于 2011-1-13 21:03:51 | 只看该作者
你可以画两张地图...
一张亮的 一张暗的

点评

一个地图有几个,或者大地图就耗用容量。何况转移需要黑幕。  发表于 2011-1-13 22:27
认可答案,可惜米有经验- -  发表于 2011-1-13 21:39

评分

参与人数 1星屑 +400 收起 理由
夕阳武士 + 400 认可

查看全部评分

RGE这万年大坑 啥时填起来@@

回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
112 小时
注册时间
2010-11-11
帖子
111
3
 楼主| 发表于 2011-1-13 21:51:49 | 只看该作者
回复 david50407 的帖子

= =。我画了一张大地图。我想角色走到某一个区域。某一个区域就亮起来。离开就暗下去。
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
180
在线时间
829 小时
注册时间
2010-6-26
帖子
671
4
发表于 2011-1-13 21:58:58 | 只看该作者
不负责翻译,默认工程上画一画可能就知道它的效果了。
  1. #==============================================================================
  2. #    ☆VX RGSS2 「DQ風屋内外屋根切り替え」☆
  3. #      EnDlEss DREamER
  4. #     URL:http://mitsu-evo.6.ql.bz/
  5. #     製作者 mitsu-evo
  6. #     Last:2010/7/9
  7. #     周囲が消えたり部屋に屋根がかかったりする。
  8. #     ▼ 「▼ 素材」に近い位置に挿入。KGC様「タイルセット拡張」より上。
  9. #==============================================================================
  10. $ed_rgss2 = {} if $ed_rgss2 == nil
  11. $ed_rgss2["ed_auto_roof"] = true

  12. =begin

  13. 7/9:ExMap_AutoWeather改に対応修正。

  14. ================================================================================

  15.       ★ 主な仕様 ★
  16.       
  17.     ☆ 屋根自動作成部 ☆
  18.    
  19.     ?オートルーフ(屋内外自動屋根)はチップセット「TileA3」「TileA4」
  20.       の屋根部分にのみ対応しています。
  21.         
  22.     ?オートルーフの範囲設定はエリアを作成しエリア名を「屋内」とすること。
  23.       それ以外の名前では自動的に描画されません。
  24.         
  25.     ☆ エリア設定部 ☆
  26.    
  27.     ?エリア範囲内の壁や床は屋根で隠れてしまいます。
  28.       入り口などを作成する場合はその辺りも考慮して
  29.       入り口付近のマップを作成して下さい。
  30.       
  31.     ?エリアの「左上」は「埋める屋根のベース」となるので
  32.       エリア左上のマップチップは必ず屋根にして下さい。
  33.         
  34.     ?隣接するエリアで同一屋根タイルIDの場合は隣接エリアも一つの屋根とされます。
  35.       別のタイルIDであれば隣接しても同一処理を行ないません。
  36.       (隣合うエリアの屋根タイルIDが同じなら一つの屋根にする)
  37.    
  38.     ?屋内に設定されたエリアはそこに入るとエリア外を設定のタイルIDで埋めます。
  39.       純正では「TileA5」の一番左上の黒チップを使用しています。
  40.         
  41.     ?屋外では自動的に屋根がエディタで配置したチップで設定のエリア内を埋めます。
  42.       一応、エリアの外枠は自動的に適したチップを配置するようにしています。
  43.       複雑な形状の場合は複数のエリア隣接させて作成して下さい。
  44.       
  45.     ?屋内でも屋外でも表示したい部分を設定することができます。
  46.       これはオートルーフ機能はなくエディタ上のチップを表示します。
  47.       屋根エリア内でもこちらが優先されます。
  48.       
  49.       
  50.     ☆ その他機能 ☆  
  51.    
  52.     ?屋外と屋内を同一マップにするため、マップが大きくなり
  53.       重たくなる可能性があります。
  54.       
  55.     ?屋内外移動演出として「場所移動」っぽいエフェクトですが場所移動は行なってません。
  56.         
  57.     ?天候はなにもいじってないのでその都度イベントか何かで設定して下さい。
  58.         
  59.     ?昔の「テク研」様のように自動で現在座標を変数に反映します。
  60.       (X * 1000 + Y ) = [20 00 7(20007)]
  61.         
  62.     ?現在座標のタイルIDも変数に反映します。
  63.       屋根作りの時にテストプレイ時にF9で変数を見ればタイルIDが確認できます。
  64.         
  65.     ?現在座標が屋内ならスイッチがONになり、屋外ならスイッチがOFFになります。
  66.       
  67.     ?設定項目のタイルIDは参考サイト様のデータやデバッグ画面で変数を確認して下さい。
  68.    
  69.     ?場所移動及び屋内外移動時に通常フェードの代わりにトランジションを利用できます。
  70.       利用する場合はプロジェクトの「グラフィックフォルダ」の「システム」に
  71.       トランジション画像を入れて設定を行なって下さい。
  72.       
  73.     ?イベント作成時に表示したいイベントの元の位置が主人公とは違う場所
  74.       (主人公が屋内ならイベントが屋外。またはその逆。)の場合は
  75.       イベントコマンド「移動ルートの設定」の「透明化 OFF」を実行してから
  76.       「イベントの位置設定」などを使用して下さい。
  77.       自動的に表示領域外のイベントは透明化されているので表示されていません。
  78.    
  79.       
  80. ================================================================================
  81.       
  82.       ★ 参考サイト様 ★
  83.       
  84.       Delusion Field 様
  85.       
  86.       http://www5f.biglobe.ne.jp/~delusion/tech/text_003.html
  87.       
  88.       ここでツクールVXの全てのタイルIDテーブルをエクセルで配布してます。
  89.       
  90.       紳士の月面工房 様
  91.       
  92.       http://tsukishinshi.blog73.fc2.com/blog-entry-33.html
  93.       
  94.       オートタイルの詳細を解説しています。
  95.       
  96. ================================================================================
  97.       
  98.       ★ マップの作り方 ★
  99.       
  100.       1.エディタで屋内外マップを作成し、内装も作っちゃいます。
  101.       
  102.       2.エリア名を「屋内」としたエリアを部屋の外枠と同じに設定します。
  103.         この時に部屋の屋根部分を設定し、外壁などを範囲に入れない。
  104.       
  105.       3.エリア設定時に必ず「エリアの左上」は屋根チップを配置すること。
  106.         この「エリアの左上」を基準に屋根を自動的に埋めていきます。
  107.         
  108.       4.複雑な形状の屋根は「細かく隣接させてエリア設定」を行なって下さい。
  109.         エリアを重ねずに設定して下さい。

  110.       例:■□   四角は設定エリア。
  111.          □■□ 全ての四角がくっついて一つの部屋であるものと仮定。

  112.       5.マップを歩くと部屋エリアに入れば自動で外と中が切り替わります。
  113.       
  114.       6.「屋内外表示」とエリア名を設定したエリアでは屋内でも屋外でも表示されます。
  115.         
  116.       
  117. ================================================================================

  118. =end
  119. $ed_rgss2 = {} if $ed_rgss2 == nil
  120. $ed_rgss2["ed_map_indoors"] = true
  121. module ED
  122.   
  123.     # ★ 設定項目 ★
  124.   
  125.     # 屋内エリア名設定文字(この文字を検知してエリア内を屋内にする)
  126.     INDOOR_AREA_NAME = "屋内"
  127.     # 屋内でも屋外でも表示させたい部分のエリア名設定
  128.     # (部屋の外壁など中でも外でも表示したい場合など)
  129.     OUTDOOR_AREA_NAME = "屋内外表示"
  130.     # 現在座標を格納する変数番号
  131.     NOW_MAP_POSITION = 9
  132.     # 現在座標のタイルIDを格納する変数番号
  133.     NOW_MAP_TILE_ID  = 10
  134.     # 屋内外設定スイッチ番号(スイッチONで屋内)
  135.     NOW_MAP_INDOOR   = 9
  136.    
  137.    
  138.     # 屋外消去用タイルマップID(「TileA5」の一番左上)
  139.     # 「参考サイト様」かテストプレイでタイルIDを調べて
  140.     # 「タイルセットA」の中から屋外を埋めるタイルをID指定。
  141.     OUTDOOR_TILE_ID  = 1544 # 純正では「黒」で埋めます。
  142.     # レイヤ2層目以降消去用タイルマップID(タイルセットBの左上)
  143.     # 屋外での内装タイルセットB以降の非表示に使用。
  144.     LAYER2_TILE_ID  = 0     # 通常はいじらなくても良い。
  145.    
  146.     # トランジションを有効にするかどうか(無効ならフェード)
  147.     ROOF_TRANSITION           = true#false
  148.     # 移動トランジション画像("Graphics/System/ファイル名")
  149.     ROOF_TRANSITION_FILE_NAME = "Graphics/System/003-Blind03"
  150.     # 移動トランジションにかける時間
  151.     ROOF_TRANSITION_TIME      = 30
  152.   
  153. end
  154.   
  155. #==============================================================================
  156. # ■ Game_Map
  157. #------------------------------------------------------------------------------
  158. #  マップを扱うクラスです。スクロールや通行可能判定などの機能を持っています。
  159. # このクラスのインスタンスは $game_map で参照されます。
  160. #==============================================================================

  161. class Game_Map
  162.   
  163.   #--------------------------------------------------------------------------
  164.   # ● ディープコピーメソッド  item : アイテム
  165.   #--------------------------------------------------------------------------
  166.   def item_copy(item)
  167.     @copy_item = Marshal.load(Marshal.dump(item))
  168.     return @copy_item
  169.   end
  170.   #--------------------------------------------------------------------------
  171.   # ● セットアップ
  172.   #     map_id : マップ ID
  173.   #--------------------------------------------------------------------------
  174.   alias ed_map_indoors_setup setup
  175.   def setup(map_id)
  176.     # ロード直後に実行されたりする。
  177.     ed_map_indoors_setup(map_id)
  178.     @map_areas = []
  179.     ed_indoors_map_areas(map_id)   # 現在マップのエリアデータ取得
  180.     @check_area = 0
  181.     now_position(true)
  182.   end

  183.   #--------------------------------------------------------------------------
  184.   # ● 現在マップのエリアデータのみを取得
  185.   #     map_id : マップ ID
  186.   #--------------------------------------------------------------------------
  187.   def ed_indoors_map_areas(map_id)
  188.     result = []
  189.     $data_areas.values.each{|area|
  190.     # 指定マップIDが今のエリアの親マップIDと同一の場合は配列に加える。
  191.       result << area if map_id == area.map_id
  192.       }
  193.     @map_areas = result
  194.   end
  195.   #--------------------------------------------------------------------------
  196.   # ● プレイヤーの現在位置の情報を取得する。
  197.   #--------------------------------------------------------------------------
  198.   def now_position(flag = false)
  199.     ed_indoors_map_areas(@map_id) if @map_areas == nil
  200.     result = []
  201.     areas = []          # 屋内エリアの配列
  202.     area_switch = false
  203.     now_x = $game_player.x
  204.     now_y = $game_player.y
  205.    
  206.    
  207.     # 現在座標を変数に入れる。(x*1000+y = [xx000yy]という数字)
  208.     $game_variables[ED::NOW_MAP_POSITION] = now_x * 1000 + now_y
  209.     result.push($game_variables[ED::NOW_MAP_POSITION])
  210.    
  211.     # タイル ID を取得
  212.     # @map.data[x, y, レイヤー(0~2)]
  213.     $game_variables[ED::NOW_MAP_TILE_ID] = @map.data[$game_player.x, $game_player.y, 0]
  214.     result.push($game_variables[ED::NOW_MAP_TILE_ID])
  215.    
  216.     # 現在マップにエリアデータが存在しない場合は処理を行なわない。
  217.     if @map_areas == []
  218.       # エリアデータが存在しない場合は新たなマップデータには nil を入れる
  219.       @new_map = nil
  220.       return
  221.     end
  222.     # 現在位置が屋内エリア内かどうか。
  223.     @map_areas.each{|area|
  224.     # エリア名と設定名のエリアが一致したら屋内エリアリストに追加
  225.     if area.name == ED::INDOOR_AREA_NAME    # エリア名が屋内設定と同じ?
  226.       areas.push(area) # 屋内エリアをリストに追加
  227.     elsif area.name == ED::OUTDOOR_AREA_NAME    # エリア名が屋内外設定と同じ?
  228.       areas.push(area) # 屋内外表示エリアをリストに追加
  229.     end
  230.     # エリア内ならローカル変数をtrue
  231.     if ed_in_area?(area, now_x, now_y)
  232.       area_switch = true
  233.     end
  234.     }
  235.    
  236.     # ローカル変数がtrueならスイッチオン
  237.     if area_switch
  238.       $game_switches[ED::NOW_MAP_INDOOR] = true
  239.     else
  240.       $game_switches[ED::NOW_MAP_INDOOR] = false
  241.     end
  242.    
  243.     # スイッチがONなら天候停止。そうでないなら天候再開
  244.     if $game_switches[ED::NOW_MAP_INDOOR]
  245.       stop_weather if $ed_rgss2["ed_auto_weather"]
  246.     else
  247.       if $ed_rgss2["ed_auto_weather"]
  248.         EXMAP_ATWTR_MAPS.each{|weather|
  249.         if weather[0] == @map_id
  250.           start_weather
  251.           break
  252.         end
  253.           }
  254.       end
  255.     end
  256.    
  257.     # マップ更新処理
  258.     indoor_area(areas) if flag and areas != []
  259.      
  260.     return result
  261.   end
  262.   #--------------------------------------------------------------------------
  263.   # ● エリア全体判定(屋内エリア判定用)
  264.   #     x    : x座標(論理)  y : y座標(論理)
  265.   #     tile_check : タイルIDチェック
  266.   #     tile_id    : ベースタイルID(上記チェック有効時に設定)
  267.   #--------------------------------------------------------------------------
  268.   def ed_in_areas?(x, y, tile_check = false, tile_id = 0)
  269.     flag = false
  270.     # マップ全体の屋内エリアサーチ
  271.     @map_areas.each{|area|
  272.     # サーチエリアが屋内かどうか?check_tile_id(x,y) == tile_id
  273.     if ed_in_area?(area, x, y, tile_check, tile_id)
  274.       # サーチエリアが屋内&エリアの左上(ベースタイルID)が
  275.       # 呼び出し元エリアベースタイルIDと同じ場合は隣接エリアと統合
  276.       flag = check_base_tile(area.rect.x, area.rect.y, 0) == tile_id ? true : false
  277.     end
  278.     # 屋内ならtrueを返す
  279.     return true if flag
  280.     }
  281.     return false
  282.   end
  283.   #--------------------------------------------------------------------------
  284.   # ● エリア内判定(屋内エリア判定用)
  285.   #     area : エリアデータ (RPG::Area)
  286.   #     x    : x座標(論理)  y : y座標(論理)
  287.   #     tile_check : タイルIDチェック
  288.   #     tile_id    : ベースタイルID(上記チェック有効時に設定)
  289.   #--------------------------------------------------------------------------
  290.   def ed_in_area?(area, x, y, tile_check = false, tile_id = 0)
  291.     return false if area == nil
  292.     return false if @map_id != area.map_id
  293.     unless area.name == ED::INDOOR_AREA_NAME    # エリア名が屋内設定と同じ?
  294.       # 今のエリアと屋内設定名が一致しないなら屋外
  295.       return false
  296.     end
  297.     return false if x < area.rect.x
  298.     return false if y < area.rect.y
  299.     return false if x >= area.rect.x + area.rect.width
  300.     return false if y >= area.rect.y + area.rect.height
  301.     # タイルIDもチェックして屋根タイル以外はfalse
  302.     if tile_check
  303.       # タイルIDチェックで「0」なら屋根タイルでない。
  304.       return false if revision_tile_id(tile_id) == 0
  305.     end
  306.     return true
  307.   end
  308.   #--------------------------------------------------------------------------
  309.   # ● エリア内判定(共通表示エリア判定用)
  310.   #     area : エリアデータ (RPG::Area)
  311.   #     x    : x座標(論理)  y : y座標(論理)
  312.   #--------------------------------------------------------------------------
  313.   def ed_outdoor_area?(area, x, y)
  314.     return false if area == nil
  315.     return false if @map_id != area.map_id
  316.     unless area.name == ED::OUTDOOR_AREA_NAME    # エリア名が屋内設定と同じ?
  317.       # 今のエリアと屋内設定名が一致しないなら屋外
  318.       return false
  319.     end
  320.    
  321.     return false if x < area.rect.x
  322.     return false if y < area.rect.y
  323.     return false if x >= area.rect.x + area.rect.width
  324.     return false if y >= area.rect.y + area.rect.height

  325.     return true
  326.   end
  327.   #--------------------------------------------------------------------------
  328.   # ● 隣接エリアサーチ(現在座標の±1の隣接がエリア内ならtrue)
  329.   #     areas : 屋内エリアリスト (RPG::Areaをまとめたもの)
  330.   #     now_area : 比較元のエリア
  331.   #     x    : x座標(論理)  y : y座標(論理)
  332.   #--------------------------------------------------------------------------
  333.   def adjoin_area_search(areas, now_area, x, y)
  334.     areas.each{|area|
  335.     # IDでチェックしないと名前ではチェックできない
  336.       next if now_area.id == area.id
  337.       return true if ed_in_area?(area, x, y)
  338.     }
  339.     return false
  340.   end
  341.   #--------------------------------------------------------------------------
  342.   # ● エリア境界判定(屋内エリア判定用)
  343.   #     areas : 屋内エリアリスト (RPG::Areaをまとめたもの)
  344.   #     x    : x座標(論理)  y : y座標(論理)
  345.   #--------------------------------------------------------------------------
  346.   def ed_in_area_border?(areas, now_area, x, y)
  347.     # 現在のタイルを取得
  348.     now_tile = revision_tile_id(@map.data[x, y, 0])
  349.     adjoin_tile = 0
  350.     # 屋根以外のチップは nil を返し戻る
  351.     return nil if now_tile == 0
  352.    
  353.     for area in areas
  354.       
  355.     if x == now_area.rect.x
  356.       # 現在座標とエリアの左端が同じ
  357.       if adjoin_area_search(areas, area, x - 1, y)
  358.         adjoin_tile = revision_tile_id(@map.data[x - 1, y, 0])
  359.         break
  360.       end
  361.     elsif y == now_area.rect.y
  362.       # 現在座標とエリアの上端が同じ
  363.       if adjoin_area_search(areas, area, x, y - 1)
  364.         adjoin_tile = revision_tile_id(@map.data[x, y - 1, 0])
  365.         break
  366.       end
  367.     elsif x == now_area.rect.x + area.rect.width
  368.       # 現在座標とエリアの右端が同じ
  369.       if adjoin_area_search(areas, area, x + 1, y)
  370.         adjoin_tile = revision_tile_id(@map.data[x + 1, y, 0])
  371.         break
  372.       end
  373.     elsif y == now_area.rect.y + area.rect.height
  374.       # 現在座標とエリアの下端が同じ
  375.       if adjoin_area_search(areas, area, x, y + 1)
  376.         adjoin_tile = revision_tile_id(@map.data[x, y + 1, 0])
  377.         break
  378.       end
  379.     else
  380.       # 現在座標はエリアの端ではない
  381.       next
  382.     end
  383.    
  384.     end
  385.     # 屋根以外のチップは nil を返し戻る
  386.     return nil if adjoin_tile == 0
  387.    
  388.     # 今の座標のタイルと隣接タイル(adjoin_tile)が同じでない
  389.     unless now_tile == adjoin_tile
  390.       # 隣接タイルは同じでないのでfalse
  391.       return false
  392.     end
  393.     # 隣接タイルは同じ
  394.     return true
  395.   end
  396.   #--------------------------------------------------------------------------
  397.   # ● 屋根張付け用のベースとなるタイルの周囲1座標検出用
  398.   #--------------------------------------------------------------------------
  399.   def check_base_tile(x, y, i)
  400.     if revision_tile_id(@map.data[x, y, i]) != 0
  401.       # その場のベースチェック
  402.       return revision_tile_id(@map.data[x, y, i])
  403.       
  404.     elsif revision_tile_id(@map.data[x - 1, y - 1, i]) != 0
  405.       # 指定座標の左上チェック
  406.       return revision_tile_id(@map.data[x - 1, y - 1, i])
  407.       
  408.     elsif revision_tile_id(@map.data[x, y - 1, i]) != 0
  409.       # 指定座標の上チェック
  410.       return revision_tile_id(@map.data[x, y - 1, i])
  411.       
  412.     elsif revision_tile_id(@map.data[x + 1, y - 1, i]) != 0
  413.       # 指定座標の右上チェック
  414.       return revision_tile_id(@map.data[x + 1, y - 1, i])
  415.       
  416.     elsif revision_tile_id(@map.data[x - 1, y + 1, i]) != 0
  417.       # 指定座標の左下チェック
  418.       return revision_tile_id(@map.data[x - 1, y + 1, i])
  419.       
  420.     elsif revision_tile_id(@map.data[x - 1, y , i]) != 0
  421.       # 指定座標の左チェック
  422.       return revision_tile_id(@map.data[x - 1, y, i])
  423.       
  424.     elsif revision_tile_id(@map.data[x, y + 1, i]) != 0
  425.       # 指定座標の下チェック
  426.       return revision_tile_id(@map.data[x, y + 1, i])
  427.       
  428.     elsif revision_tile_id(@map.data[x + 1, y + 1, i]) != 0
  429.       # 指定座標の右下チェック
  430.       return revision_tile_id(@map.data[x + 1, y + 1, i])
  431.       
  432.     elsif revision_tile_id(@map.data[x + 1, y, i]) != 0
  433.       # 指定座標の右チェック
  434.       return revision_tile_id(@map.data[x + 1, y, i])  
  435.       

  436.     end
  437.   end
  438.   #--------------------------------------------------------------------------
  439.   # ● 屋内エリアの角ならタイルIDをさらに加算補正
  440.   #--------------------------------------------------------------------------
  441.   def check_angle(area, x, y, tile_id)# tile_id はベースタイルID
  442.     return 0 if tile_id == 0
  443.     # まず現在座標が屋内エリア内か?
  444.     if ed_in_area?(area, x, y)
  445.       # ed_in_area?(area, x - 1, y, true, tile_id)
  446.       if ed_in_areas?(x - 1, y, true, tile_id) == false &&
  447.         ed_in_areas?(x, y - 1, true, tile_id) == false
  448.         # 左上の角チェック(左と上の座標がエリア外なら屋内エリアの左上角)
  449.         # ベースのタイルIDに加算する値でタイルセットA3とA4で値を分岐
  450.         return tile_id < 5504 ? 3 : 34
  451.         
  452.       elsif ed_in_areas?( x + 1, y, true, tile_id) == false &&
  453.         ed_in_areas?( x, y - 1, true, tile_id) == false
  454.         # 右上の角チェック(右と上の座標がエリア外なら屋内エリアの右上角)
  455.         return tile_id < 5504 ? 6 : 36
  456.         
  457.       elsif ed_in_areas?( x - 1, y, true, tile_id) == false &&
  458.         ed_in_areas?( x, y + 1, true, tile_id) == false
  459.         # 左下の角チェック(左と下の座標がエリア外なら屋内エリアの左下角)
  460.         return tile_id < 5504 ? 9 : 40
  461.         
  462.       elsif ed_in_areas?( x + 1, y, true, tile_id) == false &&
  463.         ed_in_areas?( x, y + 1, true, tile_id) == false
  464.         # 右下の角チェック(右と下の座標がエリア外なら屋内エリアの右下角)
  465.         return tile_id < 5504 ? 12 : 38
  466.         
  467.         
  468.       elsif ed_in_areas?( x, y + 1, true, tile_id) == false
  469.         # 下のチェック(下がエリア外で上がエリア内なら屋内エリアの下端)
  470.         return tile_id < 5504 ? 8 : 28
  471.         
  472.       elsif ed_in_areas?( x + 1, y, true, tile_id) == false
  473.         # 右のチェック(右がエリア外で左がエリア内なら屋内エリアの右端)
  474.         return tile_id < 5504 ? 4 : 24
  475.         
  476.       elsif ed_in_areas?( x, y - 1, true, tile_id) == false
  477.         # 上のチェック(上がエリア外で下がエリア内なら屋内エリアの上端)
  478.         return tile_id < 5504 ? 2 : 20
  479.         
  480.       elsif ed_in_areas?( x - 1, y, true, tile_id) == false
  481.         # 左のチェック(左がエリア外で右がエリア内なら屋内エリアの左端)
  482.         return tile_id < 5504 ? 1 : 16
  483.         
  484.       else
  485.         return 0
  486.       end
  487.     else
  488.       return 0
  489.     end
  490.   end
  491.   #--------------------------------------------------------------------------
  492.   # ● 屋根タイルIDのベース処理(SHIFTキーで配置したタイルに変更)
  493.   #--------------------------------------------------------------------------
  494.   def revision_tile_id(tile_id)
  495.     case tile_id
  496.    
  497.     # 「TileA3 = 壁タイプオートタイル」
  498.     when 4352...4400
  499.       tile_id = 4352
  500.     when 4400...4448
  501.       tile_id = 4400
  502.     when 4448...4496
  503.       tile_id = 4448
  504.     when 4496...4544
  505.       tile_id = 4496
  506.     when 4544...4592
  507.       tile_id = 4544
  508.     when 4592...4640
  509.       tile_id = 4592
  510.     when 4640...4688
  511.       tile_id = 4640
  512.     when 4688...4736
  513.       tile_id = 4688
  514.       
  515.     when 5120...5168
  516.       tile_id = 5120
  517.     when 5168...5216
  518.       tile_id = 5168
  519.     when 5216...5264
  520.       tile_id = 5216
  521.     when 5264...5312
  522.       tile_id = 5264
  523.     when 5312...5360
  524.       tile_id = 5312
  525.     when 5360...5408
  526.       tile_id = 5360
  527.     when 5408...5456
  528.       tile_id = 5408
  529.     when 5456...5504
  530.       tile_id = 5456
  531.    
  532.     # 「TileA4 = 床タイプオートタイル」
  533.     when 5888...5936
  534.       tile_id = 5888
  535.     when 5936...5984
  536.       tile_id = 5936
  537.     when 5984...6032
  538.       tile_id = 5984
  539.     when 6032...6080
  540.       tile_id = 6032
  541.     when 6080...6128
  542.       tile_id = 6080
  543.     when 6128...6176
  544.       tile_id = 6128
  545.     when 6176...6224
  546.       tile_id = 6176
  547.     when 6224...6272
  548.       tile_id = 6224
  549.       
  550.     when 6656...6704
  551.       tile_id = 6656
  552.     when 6704...6752
  553.       tile_id = 6704
  554.     when 6752...6800
  555.       tile_id = 6752
  556.     when 6800...6848
  557.       tile_id = 6800
  558.     when 6848...6896
  559.       tile_id = 6848
  560.     when 6896...6944
  561.       tile_id = 6896
  562.     when 6944...6992
  563.       tile_id = 6944
  564.     when 6992...7040
  565.       tile_id = 6992
  566.       
  567.     when 7424...7472
  568.       tile_id = 7424
  569.     when 7472...7520
  570.       tile_id = 7472
  571.     when 7520...7568
  572.       tile_id = 7520
  573.     when 7568...7616
  574.       tile_id = 7568
  575.     when 7616...7664
  576.       tile_id = 7616
  577.     when 7664...7712
  578.       tile_id = 7664
  579.     when 7712...7760
  580.       tile_id = 7712
  581.     when 7760...7808
  582.       tile_id = 7760
  583.     else
  584.       # 屋根タイルでない。
  585.       tile_id = 0
  586.     end
  587.    
  588.     return tile_id
  589.    
  590.   end
  591.   #--------------------------------------------------------------------------
  592.   # ● マップ全体から屋内エリアを探し出す。(左から右へ。上から下へ検索)
  593.   #     areas : 屋内エリアリスト (RPG::Areaをまとめたもの)
  594.   #--------------------------------------------------------------------------
  595.   def indoor_area(areas)
  596.     # 現在マップのデータをディープコピー
  597.     now_map_data = item_copy(@map)
  598.     # 屋内エリアチェック用座標変数
  599.     check_coordinate = 0
  600.     in_area = false
  601.     indicate = false
  602.     now_area = []

  603.     for y in 0...height
  604.       for x in 0...width
  605.         indicate = false
  606.         # 屋内エリア集の中から現在座標がエリア内かどうかを調べる。
  607.         areas.each{|area|
  608.           if ed_in_area?(area, x, y)            # 指定座標がエリア内か?
  609.             in_area = true                      # 検知座標がエリア内
  610.             now_area = area                     # 検知座標のエリアデータ
  611.             break
  612.           else
  613.             in_area = false                     # 検知座標はエリア外
  614.           end
  615.         }#areas.each{|area|
  616.         
  617.         # さらに共通表示エリアがあればそちらも処理を行なう。
  618.         areas.each{|area|
  619.         # 処理を別にすることで優先的に共通エリアを設定出来る。
  620.           if ed_outdoor_area?(area, x, y)       # 屋内外共通表示エリア
  621.             indicate = true                     # 検知座標が共通表示エリア
  622.             break
  623.           end
  624.           }
  625.          
  626.          
  627.         # タイルID取得
  628.         for i in [2, 1, 0]                      # レイヤーの上から順に調べる
  629.           if indicate
  630.             # 共通表示エリア
  631.             now_map_data.data[x, y, i] = @map.data[x, y, i]
  632.             next
  633.           elsif in_area                            # 指定座標がエリア内か?
  634.             # 屋内エリア
  635.             if $game_switches[ED::NOW_MAP_INDOOR]
  636.               # 現在プレイヤーが屋内にいるなら元のデータを取得
  637.               now_map_data.data[x, y, i] = @map.data[x, y, i] # タイル ID を取得
  638.               check_events(x, y, false)
  639.             else
  640.               # 屋内エリア探知だがプレイヤーが屋外にいる(エリア左側のチップを配置)
  641.               if check_coordinate == 0
  642.                 if i == 0
  643.                   # 屋根タイルである
  644.                   # ベース設定なので元のマップデータを使用する。
  645.                   base_tile = check_base_tile(now_area.rect.x, now_area.rect.y, i)
  646.                   # 適正なタイルIDに補正する。
  647.                   layout_tile = revision_tile_id(base_tile)
  648.                   # 角ならさらに適正なタイルにする。
  649.                   layout_tile += check_angle(now_area, x, y, layout_tile)
  650.                   # マップデータを補正後のタイルIDに更新。
  651.                   now_map_data.data[x, y, i] = layout_tile
  652.                 else
  653.                   # レイヤ1以外はプレイヤーが屋外なら消去。
  654.                   now_map_data.data[x, y, i] = ED::LAYER2_TILE_ID
  655.                 end
  656.               else
  657.                 # 屋根は必ず枠があり、チェックは左上から下へ降りるので
  658.                 # 枠の屋根チップ座標を取得。
  659.                 if i == 0
  660.                   # 上書きしたベースタイルIDを適用する。
  661.                   border = ed_in_area_border?(areas, now_area, x, y)
  662.                   if border == true
  663.                     # 端なら適正なタイルにする。
  664.                     layout_tile = base_tile + check_angle(now_area, x, y, base_tile)
  665.                   elsif border == false
  666.                     # 隣接エリアと違う
  667.                     check_coordinate = 0
  668.                     # ベース設定なので元のマップデータを使用する。
  669.                     base_tile = check_base_tile(x, y, i)
  670.                     # 適正なタイルIDに補正する。
  671.                     layout_tile = revision_tile_id(base_tile)
  672.                     # 角ならさらに適正なタイルにする。
  673.                     layout_tile += check_angle(now_area, x, y, layout_tile)
  674.                   else
  675.                     # 隣接エリアが屋根でない
  676.                     base_tile = check_base_tile(now_area.rect.x,
  677.                     now_area.rect.y, i)
  678.                     # 適正なタイルIDに補正する。
  679.                     layout_tile = revision_tile_id(base_tile)
  680.                     # 角ならさらに適正なタイルにする。
  681.                     layout_tile += check_angle(now_area, x, y, layout_tile)
  682.                   end
  683.                   now_map_data.data[x, y, i] = layout_tile
  684.                 else
  685.                   now_map_data.data[x, y, i] = ED::LAYER2_TILE_ID
  686.                 end
  687.               end
  688.               check_events(x, y, true)
  689.             end
  690.           else
  691.             # 屋外エリア及び無設定
  692.             check_coordinate = 0     # 屋外なので初期化
  693.             if $game_switches[ED::NOW_MAP_INDOOR]
  694.               check_events(x, y, true)
  695.               # 屋外だがプレイヤーが屋内にいる(周囲を消す[ID:1544(無チップ)])
  696.               if i == 0
  697.                 now_map_data.data[x, y, i] = ED::OUTDOOR_TILE_ID
  698.               else
  699.                 now_map_data.data[x, y, i] = ED::LAYER2_TILE_ID
  700.               end
  701.             else
  702.               # プレイヤーも屋外にいるので元のデータを使用する。
  703.               check_events(x, y, false)
  704.               now_map_data.data[x, y, i] = @map.data[x, y, i] # タイル ID を取得
  705.             end
  706.           end
  707.          
  708.         end#for i in [2, 1, 0]
  709.         
  710.         # タイルID置換チェック加算
  711.         check_coordinate += 1 if in_area
  712.         
  713.       end#for x in 0...width
  714.       
  715.     end#for y in 0...height
  716.    
  717.     # 更新したマップデータをインスタンス変数に代入。
  718.     @new_map = now_map_data
  719.   end
  720.   #--------------------------------------------------------------------------
  721.   # ● 指定座標イベントの透明化処理(隠している場所のイベントの消去)
  722.   #    x?y : 座標 transparent : 透明化
  723.   #--------------------------------------------------------------------------
  724.   def check_events(x, y,transparent = false)
  725.     # @events はハッシュ
  726.     for event in @events.values
  727.       next if event == nil
  728.       if event.x == x and event.y == y
  729.         # マップ内外の透明化処理
  730.         event.transparent = transparent
  731.       end
  732.     end
  733.    
  734.     # @vehicles は配列
  735.     for vehicle in @vehicles
  736.       next if vehicle == nil
  737.       if vehicle.x == x and vehicle.y == y
  738.         # マップ内外の透明化処理
  739.         vehicle.transparent = transparent
  740.       end
  741.     end
  742.   end
  743.   #--------------------------------------------------------------------------
  744.   # ● マップデータの取得
  745.   #--------------------------------------------------------------------------
  746.   def data
  747.     unless @new_map == nil
  748.       return @new_map.data
  749.     else
  750.       return @map.data
  751.     end
  752.   end
  753. end
  754. #==============================================================================
  755. # ■ Game_Player
  756. #------------------------------------------------------------------------------
  757. #  プレイヤーを扱うクラスです。イベントの起動判定や、マップのスクロールなどの
  758. # 機能を持っています。このクラスのインスタンスは $game_player で参照されます。
  759. #==============================================================================

  760. class Game_Player < Game_Character
  761.   #--------------------------------------------------------------------------
  762.   # ● 切り替えチェック用変数の設定
  763.   #--------------------------------------------------------------------------
  764.   def check_map=(value)
  765.     @check_map = value
  766.   end
  767.   #--------------------------------------------------------------------------
  768.   # ● 屋内外切り替え
  769.   #--------------------------------------------------------------------------
  770.   def indoor_change
  771.     # 現在の位置情報を取得
  772.     if $game_switches[ED::NOW_MAP_INDOOR] and @check_map != 2
  773.       $game_map.now_position(true)     # true でタイルIDの変更チェック
  774.       @check_map = 2
  775.     elsif $game_switches[ED::NOW_MAP_INDOOR] != true and @check_map != 1
  776.       $game_map.now_position(true)
  777.       @check_map = 1
  778.     end
  779.   end
  780.   #--------------------------------------------------------------------------
  781.   # ● 場所移動の実行
  782.   #--------------------------------------------------------------------------
  783.   alias ed_map_indoors_perform_transfer perform_transfer
  784.   def perform_transfer
  785.     ed_map_indoors_perform_transfer
  786.     $game_map.now_position(true)     # 別マップへ移動
  787.     $game_map.now_position           # 上でマップ更新、これでスイッチ更新
  788.   end
  789. end

  790. #==============================================================================
  791. # ■ Scene_Map
  792. #------------------------------------------------------------------------------
  793. #  マップ画面の処理を行うクラスです。
  794. #==============================================================================

  795. class Scene_Map < Scene_Base
  796.   
  797.   #--------------------------------------------------------------------------
  798.   # ● 開始処理
  799.   #--------------------------------------------------------------------------
  800.   alias ed_map_indoors_start start
  801.   def start
  802.     ed_map_indoors_start
  803.     @check_map = 0
  804.     check_indoor_sprite(false)
  805.   end
  806.   #--------------------------------------------------------------------------
  807.   # ● 一定時間ウェイト
  808.   #     duration : ウェイト時間 (フレーム数)
  809.   #--------------------------------------------------------------------------
  810.   def wait(duration)
  811.     for i in 0...duration
  812.       update_basic
  813.     end
  814.   end
  815.   #--------------------------------------------------------------------------
  816.   # ● 屋内移動などのトランジション処理(消去)
  817.   #    duration : トランジションにかけるフレーム数
  818.   #    vague    : 転送元と転送先の境界のあいまいさ
  819.   #--------------------------------------------------------------------------
  820.   def indoor_transition_out(duration = 10, vague = 40)
  821.     return unless ED::ROOF_TRANSITION
  822.     Graphics.transition(duration, ED::ROOF_TRANSITION_FILE_NAME, vague)
  823.     Graphics.freeze
  824.   end
  825.   #--------------------------------------------------------------------------
  826.   # ● 屋内移動などのトランジション処理(表示)
  827.   #    duration : トランジションにかけるフレーム数
  828.   #    vague    : 転送元と転送先の境界のあいまいさ
  829.   #--------------------------------------------------------------------------
  830.   def indoor_transition_in(duration = 10, vague = 40)
  831.     return unless ED::ROOF_TRANSITION
  832.     if Graphics.brightness == 0       # 戦闘後、ロード直後など
  833.       fadein(duration)
  834.     else
  835.       Graphics.freeze
  836.       Graphics.transition(duration, ED::ROOF_TRANSITION_FILE_NAME, vague)
  837.     end
  838.   end
  839.   #--------------------------------------------------------------------------
  840.   # ● 場所移動の処理
  841.   #--------------------------------------------------------------------------
  842.   def update_transfer_player
  843.     return unless $game_player.transfer?
  844.     @transfer_player = true         # 場所移動中フラグ
  845.     fade = (Graphics.brightness > 0)
  846.     # フェード及びトランジション処理
  847.     if ED::ROOF_TRANSITION
  848.       indoor_transition_out(ED::ROOF_TRANSITION_TIME) if fade
  849.     else
  850.       fadeout(30) if fade
  851.     end
  852.    
  853.     # 元の処理
  854.     @spriteset.dispose              # スプライトセットを解放
  855.     $game_player.perform_transfer   # 場所移動の実行
  856.     $game_map.autoplay              # BGM と BGS の自動切り替え
  857.     $game_map.update
  858.     Graphics.wait(15)
  859.     @spriteset = Spriteset_Map.new  # スプライトセットを再作成
  860.    
  861.     # フェード及びトランジション処理
  862.     if ED::ROOF_TRANSITION
  863.       indoor_transition_in(ED::ROOF_TRANSITION_TIME) if fade
  864.     else
  865.       fadein(30) if fade
  866.     end
  867.     Input.update
  868.     @transfer_player = false        # 場所移動が終われば無効に
  869.   end
  870.   #--------------------------------------------------------------------------
  871.   # ● 屋内外移動時のスプライト更新
  872.   #--------------------------------------------------------------------------
  873.   def check_indoor_sprite(fade = true)
  874.     @check_map = 0 if @check_map == nil
  875.     # 画面がスクロール中かどうか取得
  876.     flag = $game_player.moving?
  877.     if @transfer_player
  878.       # 場所移動中は歩行フラグをfalseにして処理を実行できるようにする。
  879.       flag = false
  880.     end
  881.     $game_map.now_position     # 現在の位置情報を取得
  882.     # 現在の位置情報を取得
  883.     if $game_switches[ED::NOW_MAP_INDOOR] and @check_map != 2# and not flag
  884.       # 部屋の中に移動時の切り替え処理
  885.       if ED::ROOF_TRANSITION
  886.         indoor_transition_out(ED::ROOF_TRANSITION_TIME) if fade
  887.       else
  888.         fadeout(30) if fade
  889.       end
  890.       $game_player.indoor_change
  891.       unless @spriteset == nil
  892.         @spriteset.dispose
  893.         @spriteset = Spriteset_Map.new
  894.         @spriteset.update#update_basic
  895.       end
  896.       @check_map = 2
  897.       if ED::ROOF_TRANSITION
  898.         indoor_transition_in(ED::ROOF_TRANSITION_TIME) if fade
  899.       else
  900.         fadein(30) if fade
  901.       end
  902.     elsif $game_switches[ED::NOW_MAP_INDOOR] != true and
  903.       @check_map != 1 and not flag
  904.       # 部屋の中から外へ出た時の処理。
  905.       # flag 移動中でない時に処理をする = 歩行後の処理となる。
  906.       if ED::ROOF_TRANSITION
  907.         indoor_transition_out(ED::ROOF_TRANSITION_TIME) if fade
  908.       else
  909.         fadeout(30) if fade
  910.       end
  911.       $game_player.indoor_change
  912.       unless @spriteset == nil
  913.         @spriteset.dispose
  914.         @spriteset = Spriteset_Map.new
  915.         @spriteset.update#update_basic
  916.       end
  917.       @check_map = 1
  918.       if ED::ROOF_TRANSITION
  919.         indoor_transition_in(ED::ROOF_TRANSITION_TIME) if fade
  920.       else
  921.         fadein(30) if fade
  922.       end
  923.     end
  924.   end
  925.   #--------------------------------------------------------------------------
  926.   # ● フレーム更新
  927.   #--------------------------------------------------------------------------
  928.   alias ed_map_indoors_update update
  929.   def update
  930.     check_indoor_sprite unless @transfer_player
  931.     ed_map_indoors_update
  932.   end
  933. end


复制代码

点评

http://tsukishinshi.blog73.fc2.com/blog-entry-79.html 有兴趣的话可以用代理来一下这里,这个脚本也是制造室内室外效果的  发表于 2011-1-13 22:20
顺带一提,如果不是默认图块,估计会该脚本改得很痛苦……  发表于 2011-1-13 22:00
新手们!不要被看扁了!我们也会用论坛搜索,我们也会自己找脚本,我们也会自己点击关闭按钮旁边的小问号!
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
280
在线时间
1374 小时
注册时间
2005-10-16
帖子
5113

贵宾

5
发表于 2011-1-13 22:13:36 | 只看该作者
本帖最后由 亿万星辰 于 2011-1-13 22:19 编辑

这个我以前写过的……你搜索一下“哇哈哈标题党”

点评

= =。哇哈哈。我还真没搜索到。。  发表于 2011-1-13 22:23
我只个搬答案的
叔叔我已经当爹了~
婚后闪人了……
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv3.寻梦者 (禁止发言)

梦石
0
星屑
1930
在线时间
73 小时
注册时间
2010-12-31
帖子
147
6
发表于 2011-1-13 22:19:38 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
653
在线时间
2658 小时
注册时间
2010-6-28
帖子
1361

开拓者

7
发表于 2011-1-14 03:26:45 | 只看该作者
本帖最后由 我的米呀 于 2011-1-14 03:27 编辑

我又来纯事件了……其实这个一张地图就可以了,在除TILEA类外的地图里加快黑抹布即可。于是上传附件,加了开宝箱的情况、商店的情况、战斗的情况。
DQ风.rar (708.13 KB, 下载次数: 33)

                 无从有中来,有从无中生。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-29 04:24

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表