#============================================================================== # ■ Game_Vehicle #------------------------------------------------------------------------------ #  乗り物を扱うクラスです。このクラスは Game_Map クラスの内部で使用されます。 # 現在のマップに乗り物がないときは、マップ座標 (-1,-1) に設定されます。 #============================================================================== class Game_Vehicle < Game_Character #-------------------------------------------------------------------------- # ● 公開インスタンス変数 #-------------------------------------------------------------------------- attr_reader :altitude # 高度(飛行船用) attr_reader :driving # 運転中フラグ #-------------------------------------------------------------------------- # ● オブジェクト初期化 # type : 乗り物タイプ(:boat, :ship, :airship) #-------------------------------------------------------------------------- def initialize(type) super() @type = type @altitude = 0 @driving = false @direction = 4 @walk_anime = false @step_anime = false @walking_bgm = nil init_move_speed load_system_settings end #-------------------------------------------------------------------------- # ● 移動速度の初期化 #-------------------------------------------------------------------------- def init_move_speed @move_speed = 4 if @type == :boat @move_speed = 5 if @type == :ship @move_speed = 6 if @type == :airship end #-------------------------------------------------------------------------- # ● システム設定の取得 #-------------------------------------------------------------------------- def system_vehicle return $data_system.boat if @type == :boat return $data_system.ship if @type == :ship return $data_system.airship if @type == :airship return nil end #-------------------------------------------------------------------------- # ● システム設定のロード #-------------------------------------------------------------------------- def load_system_settings @map_id = system_vehicle.start_map_id @x = system_vehicle.start_x @y = system_vehicle.start_y @character_name = system_vehicle.character_name @character_index = system_vehicle.character_index end #-------------------------------------------------------------------------- # ● リフレッシュ #-------------------------------------------------------------------------- def refresh if @driving @map_id = $game_map.map_id sync_with_player elsif @map_id == $game_map.map_id moveto(@x, @y) end if @type == :airship @priority_type = @driving ? 2 : 0 else @priority_type = 1 end @walk_anime = @step_anime = @driving end #-------------------------------------------------------------------------- # ● 位置の変更 #-------------------------------------------------------------------------- def set_location(map_id, x, y) @map_id = map_id @x = x @y = y refresh end #-------------------------------------------------------------------------- # ● 座標一致判定 #-------------------------------------------------------------------------- def pos?(x, y) @map_id == $game_map.map_id && super(x, y) end #-------------------------------------------------------------------------- # ● 透明判定 #-------------------------------------------------------------------------- def transparent @map_id != $game_map.map_id || super end #-------------------------------------------------------------------------- # ● 乗り物に乗る #-------------------------------------------------------------------------- def get_on @driving = true @walk_anime = true @step_anime = true @walking_bgm = RPG::BGM.last system_vehicle.bgm.play end #-------------------------------------------------------------------------- # ● 乗り物から降りる #-------------------------------------------------------------------------- def get_off @driving = false @walk_anime = false @step_anime = false @direction = 4 @walking_bgm.play end #-------------------------------------------------------------------------- # ● プレイヤーとの同期 #-------------------------------------------------------------------------- def sync_with_player @x = $game_player.x @y = $game_player.y @real_x = $game_player.real_x @real_y = $game_player.real_y @direction = $game_player.direction update_bush_depth end #-------------------------------------------------------------------------- # ● 移動速度の取得 #-------------------------------------------------------------------------- def speed @move_speed end #-------------------------------------------------------------------------- # ● 画面 Y 座標の取得 #-------------------------------------------------------------------------- def screen_y super - altitude end #-------------------------------------------------------------------------- # ● 移動可能判定 #-------------------------------------------------------------------------- def movable? !moving? && !(@type == :airship && @altitude < max_altitude) end #-------------------------------------------------------------------------- # ● フレーム更新 #-------------------------------------------------------------------------- def update super update_airship_altitude if @type == :airship end #-------------------------------------------------------------------------- # ● 飛行船の高度を更新 #-------------------------------------------------------------------------- def update_airship_altitude if @driving @altitude += 1 if @altitude < max_altitude && takeoff_ok? elsif @altitude > 0 @altitude -= 1 @priority_type = 0 if @altitude == 0 end @step_anime = (@altitude == max_altitude) @priority_type = 2 if @altitude > 0 end #-------------------------------------------------------------------------- # ● 飛行船が飛ぶ高さを取得 #-------------------------------------------------------------------------- def max_altitude return 32 end #-------------------------------------------------------------------------- # ● 離陸可能判定 #-------------------------------------------------------------------------- def takeoff_ok? $game_player.followers.gather? end #-------------------------------------------------------------------------- # ● 接岸/着陸可能判定 # d : 方向(2,4,6,8) #-------------------------------------------------------------------------- def land_ok?(x, y, d) if @type == :airship return false unless $game_map.airship_land_ok?(x, y) return false unless $game_map.events_xy(x, y).empty? else x2 = $game_map.round_x_with_direction(x, d) y2 = $game_map.round_y_with_direction(y, d) return false unless $game_map.valid?(x2, y2) return false unless $game_map.passable?(x2, y2, reverse_dir(d)) return false if collide_with_characters?(x2, y2) end return true end end