Project1
标题:
游戏错误
[打印本页]
作者:
a8880761
时间:
2010-9-2 15:07
标题:
游戏错误
34.png
(18.24 KB, 下载次数: 26)
下载附件
保存到相册
2010-9-2 15:06 上传
作者:
八云紫
时间:
2010-9-2 15:11
LZ 这样谁都帮不了你。
给出脚本,或者上传工程可能还有人帮你解决~~~
作者:
a8880761
时间:
2010-9-2 15:29
本帖最后由 八云紫 于 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
复制代码
作者:
429259591
时间:
2010-9-2 17:50
LZ请不要这样发脚本,有些变成表情了
作者:
小鱼子
时间:
2010-9-3 16:07
有些变成表情了,请代码功能发……
作者:
八云紫
时间:
2010-9-3 16:12
已修改, LZ 记得下次发脚本用代码标签
作者:
小鱼子
时间:
2010-9-3 16:17
lz,你这是呢个版本的VX?
下论坛上的吧……
这脚本好诡异……
欢迎光临 Project1 (https://rpg.blue/)
Powered by Discuz! X3.1