现象:无论显示动画的对象在哪个角色/行走图上,只要玩家操控移动、画面发生卷动的话,本应显示在某个角色行走图上的动画就会跟着一起移动/位置发生偏移。
说明:这是很古老的问题了,修复补丁也不难找到,但是由于广为传播的汉化版本VX、VA很可能没有自带该修复补丁,导致问题其实可能在多个工程中反复重演,今天没曾想又被这个问题攻击了一次,遂决定写一篇文章专门贴上修复补丁的代码,不止其他人,也许今后我自己都还会用得到。XP不存在该问题。点击跳至VXAce片段。
#==============================================================================
# ■ VX_非官方补丁 1 [动画显示相关修正] —— By 诡异の猫
#------------------------------------------------------------------------------
# 注意: 此补丁包括官方补丁 VX_SP1
#------------------------------------------------------------------------------
# 补丁内容: 修正地图上播放动画(以画面为中心除外),动画跟随画面移动问题.
#==============================================================================
class Sprite_Base < Sprite
#--------------------------------------------------------------------------
# ● 开始播放动画
#--------------------------------------------------------------------------
def start_animation(animation, mirror = false)
dispose_animation
@animation = animation
return if @animation == nil
@animation_mirror = mirror
@animation_duration = @animation.frame_max * 4 + 1
load_animation_bitmap
@animation_sprites = []
if @animation.position != 3 or not @@animations.include?(animation)
if @use_sprite
for i in 0..15
sprite = ::Sprite.new(viewport)
sprite.visible = false
@animation_sprites.push(sprite)
end
unless @@animations.include?(animation)
@@animations.push(animation)
end
end
end
update_animation
end
#--------------------------------------------------------------------------
# ● 释放动画
#--------------------------------------------------------------------------
alias eb_sp1_dispose_animation dispose_animation
def dispose_animation
eb_sp1_dispose_animation
@animation_bitmap1 = nil
@animation_bitmap2 = nil
end
#--------------------------------------------------------------------------
# ● 设置动画活动块
# frame : 画面数据 (RPG::Animation::Frame)
#--------------------------------------------------------------------------
def animation_set_sprites(frame)
cell_data = frame.cell_data
for i in 0..15
sprite = @animation_sprites[i]
next if sprite == nil
pattern = cell_data[i, 0]
if pattern == nil or pattern == -1
sprite.visible = false
next
end
if pattern < 100
sprite.bitmap = @animation_bitmap1
else
sprite.bitmap = @animation_bitmap2
end
sprite.visible = true
sprite.src_rect.set(pattern % 5 * 192,
pattern % 100 / 5 * 192, 192, 192)
position = @animation.position
if position == 3
if self.viewport != nil
sprite.x = self.viewport.rect.width / 2
sprite.y = self.viewport.rect.height / 2
else
sprite.x = 272
sprite.y = 208
end
else
sprite.x = self.x - self.ox + self.src_rect.width / 2
sprite.y = self.y - self.oy + self.src_rect.height / 2
sprite.y -= self.src_rect.height / 2 if position == 0
sprite.y += self.src_rect.height / 2 if position == 2
end
if @animation_mirror
sprite.x -= cell_data[i, 1]
sprite.y += cell_data[i, 2]
sprite.angle = (360 - cell_data[i, 4])
sprite.mirror = (cell_data[i, 5] == 0)
else
sprite.x += cell_data[i, 1]
sprite.y += cell_data[i, 2]
sprite.angle = cell_data[i, 4]
sprite.mirror = (cell_data[i, 5] == 1)
end
sprite.z = self.z + 300 + i
sprite.ox = 96
sprite.oy = 96
sprite.zoom_x = cell_data[i, 3] / 100.0
sprite.zoom_y = cell_data[i, 3] / 100.0
sprite.opacity = cell_data[i, 6] * self.opacity / 255.0
sprite.blend_type = cell_data[i, 7]
end
end
def x=(x)
sx = x - self.x
if sx != 0
if @animation_sprites != nil
for i in 0..15
@animation_sprites[i].x += sx
end
end
end
super
end
def y=(y)
sy = y - self.y
if sy != 0
if @animation_sprites != nil
for i in 0..15
@animation_sprites[i].y += sy
end
end
end
super
end
end
VA版本的修复补丁:
#encoding:utf-8
#==============================================================================
# ■ VXAce_SP1
#------------------------------------------------------------------------------
# プリセットスクリプトの不具合を修正します。ユーザー定義のスクリプト素材は、
# 原則としてこのセクションより下に配置してください。
#==============================================================================
#------------------------------------------------------------------------------
# 【修正内容】
#------------------------------------------------------------------------------
# ●イベントコマンド[ステートの変更]にて、同じステートの付加と解除を同時に実
# 行した際、二回目以降の付加が失敗する不具合を修正しました。
# ●イベントコマンド[アニメーションの表示]にて、表示中のアニメーションがマッ
# プのスクロールに同期しない不具合を修正しました。
# ●自動戦闘の行動が正常に選択されない不具合を修正しました。
# ●装備できなくなった装備品が外れたことにより、さらに別の装備品が装備できなく
# なったとき、その装備品が増殖してしまう不具合を修正しました。
# ●イベントコマンド[ピクチャの消去]を実行した後に余分な負荷がかかる不具合を
# 修正しました。
# ●移動ルートのオプション[移動できない場合は飛ばす]にチェックを入れた状態で
# トリガー[プレイヤーから接触]のイベントに接触すると、イベントが実行中であ
# っても起動予約がされてしまう不具合を修正しました。
# ●魔法反射されたスキルに対してステート有効度が反映されない不具合を修正しまし
# た。
# ●フォントのデフォルト設定にて太字または斜体を有効にしていても、ステータス画
# 面を切り替えたとき等に無効な状態に戻ってしまう不具合を修正しました。
#------------------------------------------------------------------------------
class Game_Battler
attr_accessor :magic_reflection
#--------------------------------------------------------------------------
# ● 敵対関係の判定
#--------------------------------------------------------------------------
alias vxace_sp1_opposite? opposite?
def opposite?(battler)
vxace_sp1_opposite?(battler) || battler.magic_reflection
end
end
#------------------------------------------------------------------------------
class Game_Actor
#--------------------------------------------------------------------------
# ● 装備できない装備品を外す
# item_gain : 外した装備品をパーティに戻す
#--------------------------------------------------------------------------
alias vxace_sp1_release_unequippable_items release_unequippable_items
def release_unequippable_items(item_gain = true)
loop do
last_equips = equips.dup
vxace_sp1_release_unequippable_items(item_gain)
return if equips == last_equips
end
end
#--------------------------------------------------------------------------
# ● 自動戦闘時の戦闘行動を作成
#--------------------------------------------------------------------------
def make_auto_battle_actions
@actions.size.times do |i|
@actions[i] = make_action_list.max_by {|action| action.value }
end
end
end
#------------------------------------------------------------------------------
class Game_Player
#--------------------------------------------------------------------------
# ● マップイベントの起動
# triggers : トリガーの配列
# normal : プライオリティ[通常キャラと同じ]かそれ以外か
#--------------------------------------------------------------------------
alias vxace_sp1_start_map_event start_map_event
def start_map_event(x, y, triggers, normal)
return if $game_map.interpreter.running?
vxace_sp1_start_map_event(x, y, triggers, normal)
end
end
#------------------------------------------------------------------------------
class Game_Picture
#--------------------------------------------------------------------------
# ● ピクチャの消去
#--------------------------------------------------------------------------
alias vxace_sp1_erase erase
def erase
vxace_sp1_erase
@origin = 0
end
end
#------------------------------------------------------------------------------
class Game_Interpreter
#--------------------------------------------------------------------------
# ● ステートの変更
#--------------------------------------------------------------------------
alias vxace_sp1_command_313 command_313
def command_313
vxace_sp1_command_313
$game_party.clear_results
end
end
#------------------------------------------------------------------------------
class Sprite_Character
#--------------------------------------------------------------------------
# ● 位置の更新
#--------------------------------------------------------------------------
alias vxace_sp1_update_position update_position
def update_position
move_animation(@character.screen_x - x, @character.screen_y - y)
vxace_sp1_update_position
end
#--------------------------------------------------------------------------
# ● アニメーションの移動
#--------------------------------------------------------------------------
def move_animation(dx, dy)
if @animation && @animation.position != 3
@ani_ox += dx
@ani_oy += dy
@ani_sprites.each do |sprite|
sprite.x += dx
sprite.y += dy
end
end
end
end
#------------------------------------------------------------------------------
class Sprite_Picture
#--------------------------------------------------------------------------
# ● 転送元ビットマップの更新
#--------------------------------------------------------------------------
alias vxace_sp1_update_bitmap update_bitmap
def update_bitmap
if @picture.name.empty?
self.bitmap = nil
else
vxace_sp1_update_bitmap
end
end
end
#------------------------------------------------------------------------------
class Window_Base
#--------------------------------------------------------------------------
# ● フォント設定のリセット
#--------------------------------------------------------------------------
alias vxace_sp1_reset_font_settings reset_font_settings
def reset_font_settings
vxace_sp1_reset_font_settings
contents.font.bold = Font.default_bold
contents.font.italic = Font.default_italic
end
end
#------------------------------------------------------------------------------
class Scene_Battle
#--------------------------------------------------------------------------
# ● 魔法反射の発動
#--------------------------------------------------------------------------
alias vxace_sp1_invoke_magic_reflection invoke_magic_reflection
def invoke_magic_reflection(target, item)
@subject.magic_reflection = true
vxace_sp1_invoke_magic_reflection(target, item)
@subject.magic_reflection = false
end
end
愿君共勉。