class Game_Map # イベントが通常キャラと重ならない以外のイベントの上を通過できるようにする # (通行判定の軽量化効果もあります) EVENT_PASS_ON_EVENT = false end =begin ★ks_通行判定軽量化 最終更新日 2011/06/03 □===制作・著作===□ MaidensnowOnline 暴兎 使用プロジェクトを公開する場合、readme等に当HP名とそのアドレスを記述してください。 使用報告はしてくれると喜びます。 □===配置場所===□ 基本スクリプトおよび基本エリアスは必要ありません。 基本的に再定義による物なので、可能な限り"▼ 素材"の下、近くに配置してください。 □===説明・使用方法===□ キャラクター及びイベントの、通行可否判・イベント起動定の際に “全イベントから、その座標のイベントのリストを取得し、その中で条件を判定”ではなく、 “全イベントの中で、条件を判定後、座標を確認する”方式に変更することで、 変数を4つ使う、座標合致判定より前に、変数一つで判定できる条件判定を行うようにし、 なおかつ無駄な配列を生成しないことによって、 (特に、通常キャラの下か上の当たり判定の)イベントが多いマップでの、 通行可否判定を軽量化し、結果としてマップ画面全体の処理速度の向上を図る物です。 また、キャラクターとの衝突判定とマップチップのグラフィックのイベントの 通行判定部分と統合しているため、単純に判定回数も1/2になっています。 軽量化しているのは通行判定だけなので、いわゆるイベントの動作を抑制する 軽量化スクリプトとは全く別物です。 □===再定義しているメソッド===□ Game_Map def passable?(x, y, flag = 0x01) Game_Character def collide_with_characters?(x, y) Game_Player def airship_land_ok?(x, y) def check_event_trigger_here(triggers) def check_event_trigger_there(triggers) def check_event_trigger_touch(x, y) □===エリアスしているメソッド===□ Game_Character def passable?(x, y) =end class Game_Map #-------------------------------------------------------------------------- # ● 通行可能判定 #-------------------------------------------------------------------------- def passable?(x, y, flag = 0x01)# Game_Map 再定義 evpass = !EVENT_PASS_ON_EVENT && @pass_character.is_a?(Game_Event) for ary in @events#events_xy(x, y) # 座標が一致するイベントを調べる event = ary[0] next if event.through # すり抜け状態 case event.priority_type when 2 next unless evpass next unless event.pos(x, y) return false when 1 next unless event.pos(x, y) return false when 0 next if event.tile_id == 0 # グラフィックがタイルではない next unless event.pos(x, y) return false if evpass #next if event.priority_type > 0 # [通常キャラの下] ではない pass = @passages[event.tile_id] # 通行属性を取得 next if pass & 0x10 == 0x10 # [☆] : 通行に影響しない return true if pass & flag == 0x00 # [○] : 通行可 return false if pass & flag == flag # [×] : 通行不可 end end for j in 0..2 # レイヤーの上から順に調べる i = 2 - i tile_id = @map.data[x, y, i] # タイル ID を取得 return false if tile_id == nil # タイル ID 取得失敗 : 通行不可 pass = @passages[tile_id] # 通行属性を取得 next if pass & 0x10 == 0x10 # [☆] : 通行に影響しない return true if pass & flag == 0x00 # [○] : 通行可 return false if pass & flag == flag # [×] : 通行不可 end return false # 通行不可 end attr_accessor :pass_character end class Game_Character #-------------------------------------------------------------------------- # ● 通行可能判定 #-------------------------------------------------------------------------- alias passable_for_ks_lighten passable? def passable?(x, y)# Game_Map alias $game_map.pass_character = self result = passable_for_ks_lighten(x, y) $game_map.pass_character = nil return result end #-------------------------------------------------------------------------- # ● キャラクター衝突判定 #-------------------------------------------------------------------------- def collide_with_characters?(x, y)# Game_Map 再定義 #for event in $game_map.events_xy(x, y) # イベントの座標と一致 #unless event.through # すり抜け OFF? #return true if self.is_a?(Game_Event) # 自分がイベント #return true if event.priority_type == 1 # 相手が通常キャラ #end #end if @priority_type == 1 # 自分が通常キャラ return true if $game_player.pos_nt?(x, y) # プレイヤーの座標と一致 return true if $game_map.boat.pos_nt?(x, y) # 小型船の座標と一致 return true if $game_map.ship.pos_nt?(x, y) # 大型船の座標と一致 end return false end end class Game_Player #-------------------------------------------------------------------------- # ● 飛行船の着陸可能判定 #-------------------------------------------------------------------------- def airship_land_ok?(x, y)# Game_Map 再定義 unless $game_map.airship_land_ok?(x, y) return false # タイルの通行属性が着陸不能 end for ary in $game_map.events event = ary[0] return false if event.pos?(x,y) #unless $game_map.events_xy(x, y).empty? #return false # 何らかのイベントがある地点には着陸しない end return true # 着陸可 end #-------------------------------------------------------------------------- # ● 同位置のイベント起動判定 #-------------------------------------------------------------------------- def check_event_trigger_here(triggers)# Game_Map 再定義 return false if $game_map.interpreter.running? result = false #for event in $game_map.events_xy(@x, @y) for ary in $game_map.events event = ary[0] if triggers.include?(event.trigger) and event.priority_type != 1 next unless event.pos?(x,y) event.start result = true if event.starting end end return result end #-------------------------------------------------------------------------- # ● 正面のイベント起動判定 #-------------------------------------------------------------------------- def check_event_trigger_there(triggers)# Game_Map 再定義 return false if $game_map.interpreter.running? result = false front_x = $game_map.x_with_direction(@x, @direction) front_y = $game_map.y_with_direction(@y, @direction) #for event in $game_map.events_xy(front_x, front_y) for ary in $game_map.events event = ary[0] if triggers.include?(event.trigger) and event.priority_type == 1 next unless event.pos?(front_x, front_y) event.start result = true end end if result == false and $game_map.counter?(front_x, front_y) front_x = $game_map.x_with_direction(front_x, @direction) front_y = $game_map.y_with_direction(front_y, @direction) #for event in $game_map.events_xy(front_x, front_y) for ary in $game_map.events event = ary[0] if triggers.include?(event.trigger) and event.priority_type == 1 next unless event.pos?(front_x, front_y) event.start result = true end end end return result end #-------------------------------------------------------------------------- # ● 接触イベントの起動判定 #-------------------------------------------------------------------------- def check_event_trigger_touch(x, y)# Game_Map 再定義 return false if $game_map.interpreter.running? result = false #for event in $game_map.events_xy(x, y) for ary in $game_map.events event = ary[0] if [1,2].include?(event.trigger) and event.priority_type == 1 next unless event.pos?(x,y) event.start result = true end end return result end end