#============================================================================== # ★ Push_Event ver1.0 by USK #------------------------------------------------------------------------------ # ・名前が"@"で始まるイベントと接触するとプレイヤーが押されます # ・名前が"&"で始まるイベントと接触するとイベントを押すことができます #============================================================================== #============================================================================== # ■ Game_Player #============================================================================== class Game_Player < Game_Character attr_accessor :collide_obj #-------------------------------------------------------------------------- # ● フレーム更新 #-------------------------------------------------------------------------- alias usk_obj_update update def update forced_by_event usk_obj_update end #-------------------------------------------------------------------------- # ● イベントとの衝突判定 #-------------------------------------------------------------------------- alias usk_obj_collide_with_events? collide_with_events? def collide_with_events?(x, y) ret = usk_obj_collide_with_events?(x, y) $game_map.events_xy_nt(x, y).each do |event| event.forced = true end if ret ret end #-------------------------------------------------------------------------- # ● #-------------------------------------------------------------------------- def forced_by_event if !moving? && @collide_obj @forced = true @direction_fix = true @walk_anime = false @move_speed = @collide_obj.move_speed @followers.synchronize(@x, @y, direction) sx = distance_x_from(@collide_obj.x) sy = distance_y_from(@collide_obj.y) if sx != 0 && sy != 0 move_diagonal(sx > 0 ? 6 : 4, sy > 0 ? 2 : 8) elsif sx != 0 move_straight(sx > 0 ? 6 : 4) elsif sy != 0 move_straight(sy > 0 ? 2 : 8) end elsif @forced && !moving? && @collide_obj.nil? @move_speed = 4 @direction_fix = false @walk_anime = true @forced = false end end end #============================================================================== # ■ Game_Event #============================================================================== class Game_Event < Game_Character attr_accessor :forced #-------------------------------------------------------------------------- # ● プレイヤーとの衝突判定(フォロワーを含む) #-------------------------------------------------------------------------- alias usk_obj_collide_with_player_characters? collide_with_player_characters? def collide_with_player_characters?(x, y) ret = usk_obj_collide_with_player_characters?(x, y) (ret ? set_collide_obj : remove_collide_obj) if obj? ret end #-------------------------------------------------------------------------- # ● #-------------------------------------------------------------------------- def set_collide_obj $game_player.collide_obj = self end #-------------------------------------------------------------------------- # ● #-------------------------------------------------------------------------- def remove_collide_obj $game_player.collide_obj = nil end #-------------------------------------------------------------------------- # ● #-------------------------------------------------------------------------- def obj? @obj ||= @event.name.start_with?("@") end #-------------------------------------------------------------------------- # ● #-------------------------------------------------------------------------- def push? @push ||= @event.name.start_with?("&") end #-------------------------------------------------------------------------- # ● フレーム更新 #-------------------------------------------------------------------------- alias usk_obj_update update def update forced_by_player usk_obj_update end #-------------------------------------------------------------------------- # ● #-------------------------------------------------------------------------- def forced_by_player if push? && !moving? && @forced @forced = true @move_speed = $game_player.move_speed @followers.synchronize(@x, @y, direction) if @followers sx = distance_x_from($game_player.x) sy = distance_y_from($game_player.y) if sx != 0 && sy != 0 move_diagonal(sx > 0 ? 6 : 4, sy > 0 ? 2 : 8) elsif sx != 0 move_straight(sx > 0 ? 6 : 4) elsif sy != 0 move_straight(sy > 0 ? 2 : 8) end @forced = false end end end