# ★ 通行可能判定拡張 ★ # # ・イベントの当たり判定を広げることが出来るようになります。 # # # # Ver.0.1.0 by LLLuna ( http://llluna.s1.hayasoft.com/ ) # # ◎ 使用方法 # 当たり判定を広げたいイベントの名前の末尾に以下の文字列を記述します。 # 【】部分は各々合わせてください。 # # _size(【横幅】,【縦幅】) # イベントの大きさを指定して広げます。イベント起動判定拡張と共通です。 # それぞれイベントの大きさが何マス分かを整数で記述してください。 # 負数は指定できません。また、横幅は必ず奇数マス分になります。 #============================================================================== # ■ Game_Map #------------------------------------------------------------------------------ #  マップを扱うクラスです。スクロールや通行可能判定などの機能を持っています。 # このクラスのインスタンスは $game_map で参照されます。 #============================================================================== class Game_Map #-------------------------------------------------------------------------- # ● 通行可能判定 # x : X 座標 # y : Y 座標 # d : 方向 (0,2,4,6,8,10) # ※ 0,10 = 全方向通行不可の場合を判定 (ジャンプなど) # self_event : 自分 (イベントが通行判定をする場合) #-------------------------------------------------------------------------- def passable?(x, y, d, self_event = nil) # 与えられた座標がマップ外の場合 return false unless valid?(x, y) # 方向 (0,2,4,6,8,10) から 障害物ビット (0,1,2,4,8,0) に変換 bit = (1 << (d / 2 - 1)) & 0x0f # すべてのイベントでループ for event in events.values # 自分以外のタイルと座標が一致した場合 if event.tile_id >= 0 and event != self_event and event.x == x and event.y == y and not event.through # 障害物ビットがセットされている場合 if @passages[event.tile_id] & bit != 0 return false # 全方向の障害物ビットがセットされている場合 elsif @passages[event.tile_id] & 0x0f == 0x0f return false # それ以外で プライオリティが 0 の場合 elsif @priorities[event.tile_id] == 0 return true end end end # レイヤーの上から順に調べるループ for i in [2, 1, 0] # タイル ID を取得 tile_id = data[x, y, i] # タイル ID 取得失敗 if tile_id == nil return false # 障害物ビットがセットされている場合 elsif @passages[tile_id] & bit != 0 return false # 全方向の障害物ビットがセットされている場合 elsif @passages[tile_id] & 0x0f == 0x0f return false # それ以外で プライオリティが 0 の場合 elsif @priorities[tile_id] == 0 return true end end # 通行可 return true end end #============================================================================== # ■ Game_Character (分割定義 1) #------------------------------------------------------------------------------ #  キャラクターを扱うクラスです。このクラスは Game_Player クラスと Game_Event # クラスのスーパークラスとして使用されます。 #============================================================================== class Game_Character def checkPassable(event, targetX, targetY, playerX, playerY) if event.name.scan(/_size\(([0-9]+),([0-9]+)\)(_|$)/).length > 0 width = $1.to_i + (1 - $1.to_i%2) return (((targetX-((width-1)/2).ceil)..(targetX+((width-1)/2).ceil)) === playerX and ((targetY-$2.to_i+1)..targetY) === playerY) else return (targetX == playerX and targetY == playerY) end end def getCharaSize(event) if event != $game_player and event.name.scan(/_size\(([0-9]+),([0-9]+)\)(_|$)/).length > 0 width = $1.to_i + (1 - $1.to_i%2) height = $2.to_i x_ex = [-((width-1)/2).ceil, ((width-1)/2).ceil] y_ex = [-height+1, 0] else x_ex = 0 y_ex = 0 end return [x_ex, y_ex] end #-------------------------------------------------------------------------- # ● 通行可能判定 # x : X 座標 # y : Y 座標 # d : 方向 (0,2,4,6,8) ※ 0 = 全方向通行不可の場合を判定 (ジャンプ用) #-------------------------------------------------------------------------- def passable?(x, y, d) new_x = x + (d == 6 ? 1 : d == 4 ? -1 : 0) new_y = y + (d == 2 ? 1 : d == 8 ? -1 : 0) return false unless $game_map.valid?(new_x, new_y) return true if @through eventSize = getCharaSize(self) for m in eventSize[0][0]..eventSize[0][1] for n in eventSize[1][0]..eventSize[1][1] # 移動元のタイルから指定方向に出られない場合 return false unless $game_map.passable?(x+m, y+n, d, self) # 移動先のタイルに指定方向から入れない場合 return false unless $game_map.passable?(new_x+m, new_y+n, 10 - d) end end for event in $game_map.events.values next if event == self if checkPassable(event, event.x, event.y, new_x, new_y) unless event.through return false if self != $game_player return false if event.character_name != "" end end end unless self == $game_player if checkPassable(self, new_x, new_y, $game_player.x, $game_player.y) return false unless $game_player.through or @character_name == "" end end return true end end