赞 | 0 |
VIP | 0 |
好人卡 | 0 |
积分 | 1 |
经验 | 817 |
最后登录 | 2013-6-19 |
在线时间 | 2 小时 |
Lv1.梦旅人
- 梦石
- 0
- 星屑
- 50
- 在线时间
- 2 小时
- 注册时间
- 2009-8-28
- 帖子
- 6
|
3楼
楼主 |
发表于 2010-9-2 15:29:26
|
只看该作者
本帖最后由 八云紫 于 2010-9-3 16:11 编辑
范例太大!
- #==============================================================================
- # ■ Game_Event
- #==============================================================================
- class Game_Event < Game_Character
- #--------------------------------------------------------------------------
- # ● 公開インスタンス変数
- #--------------------------------------------------------------------------
- attr_reader :enemy_flag # エネミーフラグ
- attr_reader :boss_flag # ボスフラグ
- attr_reader :guard_flag # ガードフラグ
- attr_reader :enemy_id # エネミー(アクター)のID
- attr_reader :face_name # 顔グラフィックファイル名
- attr_reader :face_index # 顔グラフィックインデックス
- attr_reader :move_power # 移動力の値
- attr_reader :counter_power # 反撃確率の値
- attr_reader :away_hp # 逃亡開始HP割合
- attr_reader :attack_type # 通常攻撃範囲の形状
- attr_reader :attack_range # 通常攻撃可能距離
- attr_reader :attack_hole # 通常攻撃不可能距離
- attr_reader :attack_effect_type # 通常攻撃効果範囲の形状
- attr_reader :attack_effect_range # 通常攻撃効果範囲
- attr_reader :unit # ユニットデータ
- attr_accessor :scope_dist # 索敵範囲
- attr_accessor :move_target # 移動目標
- attr_accessor :move_end # 移動済みフラグ
- attr_accessor :action_end # 行動済みフラグ
- attr_accessor :npc # NPCフラグ
- attr_accessor :pnpc # PNPCフラグ
- #--------------------------------------------------------------------------
- # ● オブジェクト初期化
- # map_id : マップ ID
- # event : イベント (RPG::Event)
- #--------------------------------------------------------------------------
- def initialize(map_id, event)
- super()
- @map_id = map_id
- @event = event
- @id = @event.id
- @erased = false
- @starting = false
- @through = true
- moveto(@event.x, @event.y) # 初期位置に移動
- refresh
- @enemy_id = -1
- @boss_flag = false
- @guard_flag = false
- if @event.name =~ TSRPG::Pattern::ENEMY # エネミー
- set_enemy($1.to_i)
- elsif @event.name =~ TSRPG::Pattern::PLAYER # アクター
- set_actor($1.to_i)
- end
- if @unit != nil
- @move_end = @unit.donmove?
- @action_end = @unit.donact?
- end
- @last_x = x # 移動前のx座標
- @last_y = y # 移動前のy座標
- @last_dir = @direction # 移動前の向き
- @move_speed_last = @move_speed # 移動速度保存用
- end
- #--------------------------------------------------------------------------
- # ● 味方ユニットとしてセット
- #--------------------------------------------------------------------------
- def set_actor(id)
- if $game_temp.srpg_member.size <= id # パーティ人数が足りなければ終了
- erase
- return
- end
- @enemy_id = id
- @unit = $game_party.members[$game_temp.srpg_member[id]]
- @enemy_flag = false
- @face_name = @unit.face_name
- @face_index = @unit.face_index
- @move_power = $data_classes[@unit.class_id].name =~ TSRPG::Pattern::MOVE ? $1.to_i : 4
- @counter_power = $data_classes[@unit.class_id].name =~ TSRPG::Pattern::COUNTER ? $1.to_i : 0
- @coop_power = TSRPG::Options::COOP_RATE[@unit.class_id] != nil ?
- TSRPG::Options::COOP_RATE[@unit.class_id] : 0
- @float = TSRPG::Options::FLOAT_STATE[@unit.class_id] != nil ?
- TSRPG::Options::FLOAT_STATE[@unit.class_id] == 1 : false
- for equip in @unit.equips
- next if equip == nil
- @move_power += equip.move_power
- @counter_power += equip.counter_power
- end
- set_graphic(@unit.character_name, @unit.character_index)
- @boss_flag = true if @event.name =~ TSRPG::Pattern::BOSS
- @guard_flag = true if @event.name =~ TSRPG::Pattern::GUARD
- @through = true # すり抜けをオンにする
- @step_anime = true # 足踏みをオンにする
- @priority_type = 2 if float? # 飛行属性なら通常キャラの上に表示
- if @unit.weapon_id > 0
- @attack_type = @unit.weapons[0].attack_type
- @attack_range = @unit.weapons[0].attack_dist
- @attack_effect_type = @unit.weapons[0].effect_type
- @attack_effect_range = @unit.weapons[0].effect_dist
- @attack_hole = @unit.weapons[0].hole_dist
- else # 武器を装備していない場合
- @attack_type = 0
- @attack_range = 1
- @attack_effect_type = 0
- @attack_effect_range = 0
- @attack_hole = 0
- end
- @npc = false
- @pnpc = false
- $scene.get_unit_alive_num # 味方ユニット数の再カウント
- if @unit.dead? # セット前から戦闘不能の場合
- $game_self_switches[[@map_id, @id, "D"]] = true
- refresh
- end
- end
- #--------------------------------------------------------------------------
- # ● 敵ユニットとしてセット
- #--------------------------------------------------------------------------
- def set_enemy(id)
- @enemy_id = id
- @unit = Game_Enemy.new(@id, @enemy_id)
- @enemy_flag = true
- @face_name = "Monster"
- @face_index = 0
- note = $data_enemies[@enemy_id].note
- if note =~ TSRPG::Pattern::FACE
- @face_name = $1
- @face_index = $2.to_i
- end
- @scope_dist = note =~ TSRPG::Pattern::SCOPE ? $1.to_i : 1024
- @away_hp = note =~ TSRPG::Pattern::AWAY ? $1.to_i : 0
- @move_power = note =~ TSRPG::Pattern::MOVE ? $1.to_i : 4
- @counter_power = note =~ TSRPG::Pattern::COUNTER ? $1.to_i : 0
- @coop_power = note =~ TSRPG::Pattern::COOP ? $1.to_i : 0
- @float = $data_enemies[@enemy_id].levitate
- @boss_flag = true if @event.name =~ TSRPG::Pattern::BOSS
- @guard_flag = true if @event.name =~ TSRPG::Pattern::GUARD
- @through = true # すり抜けをオンにする
- @step_anime = true # 足踏みをンにする
- @priority_type = 2 if float? # 飛行属性なら通常キャラの上に表示
- @attack_type = note =~ TSRPG::Pattern::AT_TYPE ? $1.to_i : 0
- @attack_range = note =~ TSRPG::Pattern::AT_DIST ? $1.to_i : 1
- @attack_effect_type = note =~ TSRPG::Pattern::EF_TYPE ? $1.to_i : 0
- @attack_effect_range = note =~ TSRPG::Pattern::EF_DIST ? $1.to_i : 0
- @attack_hole = note =~ TSRPG::Pattern::HL_DIST ? $1.to_i : 0
- @npc = @event.name =~ TSRPG::Pattern::NPC ? true : false
- @pnpc = @event.name =~ TSRPG::Pattern::PNPC ? true : false
- $scene.get_unit_alive_num(true) # 敵ユニット数の再カウント
- end
- #--------------------------------------------------------------------------
- # ○ キャラクターの表示状態を更新する
- #--------------------------------------------------------------------------
- def refresh_state
- @step_anime = (@unit.restriction <= 1) # 足踏み状態の更新
- @priority_type = float? ? 2 : 1 # プライオリティの更新
- end
- #--------------------------------------------------------------------------
- # ● 協力攻撃発動確率を返す
- #--------------------------------------------------------------------------
- def get_coop_rate
- return 0 if @unit.donact? # ドンアク状態なら0%
- return @coop_power
- end
- #--------------------------------------------------------------------------
- # ● 指定したユニットが敵対関係にあるかどうかを返す
- #--------------------------------------------------------------------------
- def opponent?(event)
- return false if @id == event.id # 自分自身は味方
- if @npc # 自分がNPCの場合
- return TSRPG::Options::NPC_BATTLE if event.npc # 相手もNPCなら設定に従う
- return true # 相手がNPC以外ならすべて敵
- end
- return true if event.npc # 相手がNPCなら敵
- if @pnpc
- return false if event.pnpc # PNPC同士は味方
- return event.enemy_flag # PNPCはアクター側の味方
- end
- return @enemy_flag if event.pnpc
- return true if @enemy_flag != event.enemy_flag # アクターとエネミーなら
- return false
- end
- #--------------------------------------------------------------------------
- # ● イベントとの距離を返す
- #--------------------------------------------------------------------------
- def get_distance(event)
- return (@x - event.x).abs + (@y - event.y).abs
- end
- #--------------------------------------------------------------------------
- # ● 指定したセルまでの距離を返す
- #--------------------------------------------------------------------------
- def get_distance_cell(x, y)
- return (@x - x).abs + (@y - y).abs
- end
- #--------------------------------------------------------------------------
- # ● 一番近い敵を返す
- # friend : 仲間フラグ
- #--------------------------------------------------------------------------
- def get_near_enemy(friend = false)
- # 索敵範囲内のユニットをリストアップ
- list = []
- for event in $scene.unit_list
- next if opponent?(event) == friend
- next if event.unit.dead?
- next if get_distance(event) > @scope_dist # 索敵範囲外
- list.push(event)
- end
- # リストをHPの低い順に並び替える
- unless list.empty?
- list.sort! do |a, b|
- a.unit.hp <=> b.unit.hp
- end
- end
- return list
- end
- #--------------------------------------------------------------------------
- # ● 指定したセルの方を向く
- #--------------------------------------------------------------------------
- def turn_cell(x, y)
- sx = @x - x
- sy = @y - y
- if sx.abs > sy.abs # 横の距離のほうが長い
- sx > 0 ? turn_left : turn_right
- elsif sx.abs < sy.abs # 縦の距離のほうが長い
- sy > 0 ? turn_up : turn_down
- end
- end
- #--------------------------------------------------------------------------
- # ○ 指定したイベントに対して背後を取っているかをチェックする
- # 結果は$game_temp.unit_back_attackに格納する
- #--------------------------------------------------------------------------
- def back_attack?(event)
- d = @direction # 現在の自分の向きを保存
- turn_cell(event.x, event.y) # 対象の方を向く
- $game_temp.unit_back_attack = @direction == event.direction
- @direction = d # 元の向きに戻す
- end
- #--------------------------------------------------------------------------
- # ● 移動前の座標と向きをセット
- #--------------------------------------------------------------------------
- def set_last_pos
- @last_x = @x
- @last_y = @y
- @last_dir = @direction
- end
- #--------------------------------------------------------------------------
- # ● 移動のキャンセルが可能かどうかを返す
- #--------------------------------------------------------------------------
- def can_move_cancel?
- return false if @enemy_flag
- return false if @action_end
- return false if $scene.unit_xy(@last_x, @last_y) != nil
- return true
- end
- #--------------------------------------------------------------------------
- # ● 移動前の位置に戻す
- #--------------------------------------------------------------------------
- def undo_move
- @x = @last_x
- @y = @last_y
- @direction = @last_dir
- @real_x = @x << 8
- @real_y = @y << 8
- @move_end = false
- $scene.focus_event(self) # カーソルも一緒に移動する
- end
- #--------------------------------------------------------------------------
- # ● 蘇生処理
- #--------------------------------------------------------------------------
- def reset
- $game_self_switches[[@map_id, @id, "D"]] = false
- refresh
- set_graphic(@unit.character_name, @unit.character_index) unless @enemy_flag
- @through = true # すり抜けをオンにする
- @step_anime = true # 足踏みをオンにする
- end
- #--------------------------------------------------------------------------
- # ● ダメージを受けたときの処理
- #--------------------------------------------------------------------------
- def damage(attacker = nil)
- exp = 0
- if @unit.dead?
- $game_self_switches[[@map_id, @id, "D"]] = true
- $scene.check_rule # 勝敗判定
- refresh
- # エネミーがアクターに攻撃されたときのみ経験値とドロップを
- if attacker != nil
- if @enemy_flag and not attacker.enemy_flag
- exp = $data_enemies[@enemy_id].exp
- for di in [@unit.drop_item1, @unit.drop_item2]
- next if di.kind == 0
- next if rand(di.denominator) != 0
- if di.kind == 1
- $scene.add_drop_item($data_items[di.item_id])
- elsif di.kind == 2
- $scene.add_drop_item($data_weapons[di.weapon_id])
- elsif di.kind == 3
- $scene.add_drop_item($data_armors[di.armor_id])
- end
- end
- $scene.add_drop_gold(@unit.gold)
- end
- end
- $scene.get_unit_alive_num # 味方ユニット数の再カウント
- $scene.get_unit_alive_num(true) # 敵ユニット数の再カウント
- else
- if TSRPG::Options::ACTION_EXP_TYPE == 1
- if @enemy_flag
- exp += $data_enemies[@enemy_id].exp / TSRPG::Options::ACTION_EXP_RATE
- end
- end
- end
- return exp
- end
- #--------------------------------------------------------------------------
- # ● ユニットが行動内容のスコープに入っているかを返す
- #--------------------------------------------------------------------------
- def in_scope?
- obj = $scene.event.unit.action.obj
- # 蘇生スキルなのに生きているあるいは通常スキルなのに死んでいれば除外
- if obj != nil and obj.for_dead_friend?
- return false unless @unit.dead?
- else
- return false if @unit.dead?
- end
- # 通常攻撃で相手が生きていれば有効
- return true if obj == nil and not @unit.dead?
- if obj.noself? # 自分自身を除外
- return false if @x == $scene.event.x and @y == $scene.event.y
- end
- return true if obj.noscope? # 無差別スキルなら終了
- return (obj.for_friend? ? !opponent?($scene.event) : opponent?($scene.event))
- end
- #--------------------------------------------------------------------------
- # ● ユニットの移動力を返す
- #--------------------------------------------------------------------------
- def get_move_power
- n = @move_power
- tile_effect = $game_map.get_tile_effect(@x, @y) # 地形効果補正
- if TSRPG::Options::TILE_EFFECT[tile_effect][0] == 5
- n += TSRPG::Options::TILE_EFFECT[tile_effect][1]
- end
- for state in @unit.states # 移動力補正ステートを計算
- if state.note =~ /<移動([\+\-])(\d+)>/i
- n += $1 == '+' ? $2.to_i : -$2.to_i
- end
- end
- return [n, 0].max
- end
- #--------------------------------------------------------------------------
- # ○ ユニットが飛行属性かどうかを返す
- #--------------------------------------------------------------------------
- def float?
- for state in @unit.states
- return true if state.note =~ /<飛行>/i
- end
- return @float
- end
- end
- #==============================================================================
- # ■ Game_Player
- #==============================================================================
- class Game_Player < Game_Character
- #--------------------------------------------------------------------------
- # ● 公開インスタンス変数
- #--------------------------------------------------------------------------
- attr_reader :vx # カーソル移動速度x
- attr_reader :vy # カーソル移動速度y
- #--------------------------------------------------------------------------
- # ● オブジェクト初期化
- #--------------------------------------------------------------------------
- alias tsrpg_game_player_initialize initialize
- def initialize
- tsrpg_game_player_initialize
- @vx = 0
- @vy = 0
- @auto_move_count = 0
- end
- #--------------------------------------------------------------------------
- # ● SRPG用カーソル化
- #--------------------------------------------------------------------------
- def setup_srpg(flag)
- if flag
- set_graphic("!$cursor", 0)
- else
- set_graphic($game_party.members[0].character_name, $game_party.members[0].character_index)
- end
- @step_anime = flag
- end
- #--------------------------------------------------------------------------
- # ● 移動中判定
- #--------------------------------------------------------------------------
- def moving?
- return false if $game_temp.in_srpg
- return (@real_x != @x * 256 or @real_y != @y * 256) # 論理座標と比較
- end
- #--------------------------------------------------------------------------
- # ● カーソル自動移動のセット
- #--------------------------------------------------------------------------
- def set_auto_move(x, y)
- @x = x
- @y = y
- @auto_move_count = 8
- @vx = ((@x << 8) + (16 << 3) - @real_x) / 8
- @vy = ((@y << 8) + (16 << 3) - @real_y) / 8
- end
- #--------------------------------------------------------------------------
- # ● 画面 Z 座標の取得
- #--------------------------------------------------------------------------
- alias tsrpg_game_player_screen_z screen_z unless $@
- def screen_z
- if $game_temp.in_srpg
- return 200
- else
- return tsrpg_game_player_screen_z
- end
- end
- #--------------------------------------------------------------------------
- # ● フレーム更新
- #--------------------------------------------------------------------------
- alias tsrpg_game_player_update update
- def update
- if $game_temp.in_srpg
- if @auto_move_count > 0 # カーソル自動移動中
- last_real_x = @real_x
- last_real_y = @real_y
- @real_x += @vx
- @real_y += @vy
- @auto_move_count -= 1
- if @auto_move_count == 0
- @real_x = (@x << 8) + (16 << 3)
- @real_y = (@y << 8) + (16 << 3)
- end
- update_scroll(last_real_x, last_real_y)
- elsif $scene.scene_state < 50 and not $game_message.visible
- return if $game_map.interpreter.running? # イベント起動中のカーソル固定
- last_real_x = @real_x
- last_real_y = @real_y
- speed = dash? ? 96 : 32
- @real_y -= speed if Input.press?(Input::UP)
- @real_y += speed if Input.press?(Input::DOWN)
- @real_x -= speed if Input.press?(Input::LEFT)
- @real_x += speed if Input.press?(Input::RIGHT)
- unless $game_map.valid?(@real_x >> 8, @real_y >> 8) # 画面外なら戻す
- @real_x = last_real_x
- @real_y = last_real_y
- end
- @x = @real_x >> 8
- @y = @real_y >> 8
- @anime_count += 1
- update_animation
- update_scroll(last_real_x, last_real_y)
- end
- else
- tsrpg_game_player_update
- end
- end
- end
复制代码 |
|