Project1
标题:
关于AutoLight脚本光影随地图卷动延迟的问题
[打印本页]
作者:
Password
时间:
2018-7-27 13:45
标题:
关于AutoLight脚本光影随地图卷动延迟的问题
昨天在画完地图准备实施的时候,发现一个严重的问题:
光影的移动与地图卷动存在延迟
。
最开始我以为是因为我改
得一坨稀烂
了脚本,以为是用了不同的viewport所致,但是在统一了viewport后问题依旧存在。在论坛搜索了一下以后发现
早就有人问过这个问题
,但并未得到解答。从这个问题看出,这应该是AL自身的问题。
发现问题似乎并不简单
这个延迟对于光影层来讲基本无伤大雅,目测延迟只有2到3象素(?),但是对于我这种把树木花草(因为需要遮罩到人物上方)也画到Spot层里的人来讲就相当杯具了,这种延迟极为明显并且严重影响游戏体验。
当然,解决办法是有的,也并不难,参考《魂之轮回》ground层的做法,直接在 Spriteset_Map 里加图层(我个人的理解是其实就是当成显示在画面前的远景图处理……),这样一来果然延迟消失了,并且效果也没变。不过这样还需要一些后续处理,比如如何随时控制透明度什么的需要额外写一些东西(然而应该并不难做)。
那么问题来了:是什么原因导致的这个延迟?我个人经过测试感觉这个延迟可能发生在 Scene_Map 的处理上,或者是图块活动块与光影活动块处理相隔太远导致存在时间差(?)
目前已知的结论是用和处理ground层完全一样的写法改掉AL的默认写法依旧会有延迟。
所以关于这个问题我想请教一下真正的原因,以及是否有除上述方法的可行的解决方案
附:
AutoLight v4.1(由于我用的已经被我改的稀烂了,所以贴个原版的吧,反正是原版就存在的问题)
为了省地方贴个有脚本的页面
Spriteset_Map 中处理ground层的办法(Spot已移植):
#==============================================================================
# ■ Spriteset_Map
#------------------------------------------------------------------------------
# 处理地图画面活动块和元件的类。本类在 Scene_Map 类的内部使用。
#==============================================================================
class Spriteset_Map
#--------------------------------------------------------------------------
# ● 初始化对像
#--------------------------------------------------------------------------
def initialize
@GroundON = FileTest.exist?("Graphics/Pictures/" + "ground" + $game_map.map_id.to_s + ".png")
@SpotON = FileTest.exist?("Graphics/Pictures/" + "Spot" + $game_map.map_id.to_s + ".png")
create_viewports
create_tilemap
create_parallax
create_characters
create_shadow
create_weather
create_pictures
create_timer
update
end
#--------------------------------------------------------------------------
# ● 生成显示端口
#--------------------------------------------------------------------------
def create_viewports
@viewport1 = Viewport.new(0, 0, 640, 480)
@viewport2 = Viewport.new(0, 0, 640, 480)
@viewport3 = Viewport.new(0, 0, 640, 480)
@viewport2.z = 51 #50
@viewport3.z = 100
end
#--------------------------------------------------------------------------
# ● 生成地图元件
#--------------------------------------------------------------------------
def create_tilemap
@tilemap = Tilemap.new(@viewport1)
@tilemap.bitmaps[0] = Cache.system("TileA1")
@tilemap.bitmaps[1] = Cache.system("TileA2")
@tilemap.bitmaps[2] = Cache.system("TileA3")
@tilemap.bitmaps[3] = Cache.system("TileA4")
@tilemap.bitmaps[4] = Cache.system("TileA5")
@tilemap.bitmaps[5] = Cache.system("TileB")
@tilemap.bitmaps[6] = Cache.system("TileC")
@tilemap.bitmaps[7] = Cache.system("TileD")
@tilemap.bitmaps[8] = Cache.system("TileE")
@tilemap.map_data = $game_map.data
@tilemap.passages = $game_map.passages
end
#--------------------------------------------------------------------------
# ● 生成远景
#--------------------------------------------------------------------------
def create_parallax
if @GroundON
@ground = Plane.new(@viewport1)
@ground.z = 1
@ground.bitmap = Bitmap.new("Graphics/Pictures/"+"ground" + $game_map.map_id.to_s)
end
if @SpotON
@spot = Plane.new(@viewport2)
@spot.z = 50
@spot.bitmap = Bitmap.new("Graphics/Pictures/"+"Spot" + $game_map.map_id.to_s)
end
@parallax = Plane.new(@viewport1)
@parallax.z = -100
end
#--------------------------------------------------------------------------
# ● 生成角色活动块
#--------------------------------------------------------------------------
def create_characters
@character_sprites = []
for i in $game_map.events.keys.sort
sprite = Sprite_Character.new(@viewport1, $game_map.events[i])
@character_sprites.push(sprite)
unless $game_map.events[i].list == nil # 问题在于事件的开关
for j in 0...$game_map.events[i].list.size
if $game_map.events[i].list[j].code == 108 and $game_map.events[i].list[j].parameters == ["光影之上"]
sprite = Sprite_Character.new(@viewport3, $game_map.events[i])
@character_sprites.push(sprite)
end
end
end
end
for vehicle in $game_map.vehicles
sprite = Sprite_Character.new(@viewport1, vehicle)
@character_sprites.push(sprite)
end
@character_sprites.push(Sprite_Character.new(@viewport1, $game_player))
end
#--------------------------------------------------------------------------
# ● 生成飞船阴影活动块
#--------------------------------------------------------------------------
def create_shadow
@shadow_sprite = Sprite.new(@viewport1)
@shadow_sprite.bitmap = Cache.system("Shadow")
@shadow_sprite.ox = @shadow_sprite.bitmap.width / 2
@shadow_sprite.oy = @shadow_sprite.bitmap.height
@shadow_sprite.z = 180
end
#--------------------------------------------------------------------------
# ● 生成天候
#--------------------------------------------------------------------------
def create_weather
@weather = Spriteset_Weather.new(@viewport2)
end
#--------------------------------------------------------------------------
# ● 生成图片活动块
#--------------------------------------------------------------------------
def create_pictures
@picture_sprites = []
for i in 1..20
@picture_sprites.push(Sprite_Picture.new(@viewport2,
$game_map.screen.pictures[i]))
end
end
#--------------------------------------------------------------------------
# ● 生成计时器活动块
#--------------------------------------------------------------------------
def create_timer
@timer_sprite = Sprite_Timer.new(@viewport2)
end
#--------------------------------------------------------------------------
# ● 释放
#--------------------------------------------------------------------------
def dispose
dispose_tilemap
dispose_parallax
dispose_characters
dispose_shadow
dispose_weather
dispose_pictures
dispose_timer
dispose_viewports
end
#--------------------------------------------------------------------------
# ● 释放地图元件
#--------------------------------------------------------------------------
def dispose_tilemap
@tilemap.dispose
end
#--------------------------------------------------------------------------
# ● 释放远景
#--------------------------------------------------------------------------
def dispose_parallax
if @ground != nil
@ground.dispose
end
if @spot != nil
@spot.dispose
end
@parallax.dispose
end
#--------------------------------------------------------------------------
# ● 释放角色活动块
#--------------------------------------------------------------------------
def dispose_characters
for sprite in @character_sprites
sprite.dispose
end
end
#--------------------------------------------------------------------------
# ● 释放飞船阴影活动块
#--------------------------------------------------------------------------
def dispose_shadow
@shadow_sprite.dispose
end
#--------------------------------------------------------------------------
# ● 释放天候
#--------------------------------------------------------------------------
def dispose_weather
@weather.dispose
end
#--------------------------------------------------------------------------
# ● 释放图片活动块
#--------------------------------------------------------------------------
def dispose_pictures
for sprite in @picture_sprites
sprite.dispose
end
end
#--------------------------------------------------------------------------
# ● 释放计时器活动块
#--------------------------------------------------------------------------
def dispose_timer
@timer_sprite.dispose
end
#--------------------------------------------------------------------------
# ● 释放显示端口
#--------------------------------------------------------------------------
def dispose_viewports
@viewport1.dispose
@viewport2.dispose
@viewport3.dispose
end
#--------------------------------------------------------------------------
# ● 更新画面
#--------------------------------------------------------------------------
def update
update_tilemap
update_parallax
update_characters
update_shadow
update_weather
update_pictures
update_timer
update_viewports
end
#--------------------------------------------------------------------------
# ● 更新地图元件
#--------------------------------------------------------------------------
def update_tilemap
@tilemap.ox = $game_map.display_x / 8
@tilemap.oy = $game_map.display_y / 8
@tilemap.update
end
#--------------------------------------------------------------------------
# ● 更新远景
#--------------------------------------------------------------------------
def update_parallax
if @ground != nil
@ground.tone = $game_map.screen.tone
if @ground.ox != -$game_map.display_x / 256 or @ground.oy != -$game_map.display_y / 256 or @ground.ox == 0 or @ground.oy == 0
@ground.ox = $game_map.display_x / 8
@ground.oy = $game_map.display_y / 8
end
end
if @spot != nil
if @spot.ox != -$game_map.display_x / 256 or @spot.oy != -$game_map.display_y / 256 or @spot.ox == 0 or @spot.oy == 0
@spot.ox = $game_map.display_x / 8
@spot.oy = $game_map.display_y / 8
end
end
if @parallax_name != $game_map.parallax_name
@parallax_name = $game_map.parallax_name
if @parallax.bitmap != nil
@parallax.bitmap.dispose
@parallax.bitmap = nil
end
if @parallax_name != ""
@parallax.bitmap = Cache.parallax(@parallax_name)
end
Graphics.frame_reset
end
@parallax.ox = $game_map.calc_parallax_x(@parallax.bitmap)
@parallax.oy = $game_map.calc_parallax_y(@parallax.bitmap)
end
#--------------------------------------------------------------------------
# ● 更新角色活动块
#--------------------------------------------------------------------------
def update_characters
for sprite in @character_sprites
sprite.update
end
end
#--------------------------------------------------------------------------
# ● 更新飞船阴影活动块
#--------------------------------------------------------------------------
def update_shadow
airship = $game_map.airship
@shadow_sprite.x = airship.screen_x
@shadow_sprite.y = airship.screen_y + airship.altitude
@shadow_sprite.opacity = airship.altitude * 8
@shadow_sprite.update
end
#--------------------------------------------------------------------------
# ● 更新天候
#--------------------------------------------------------------------------
def update_weather
@weather.type = $game_map.screen.weather_type
@weather.max = $game_map.screen.weather_max
@weather.ox = $game_map.display_x / 8
@weather.oy = $game_map.display_y / 8
@weather.update
end
#--------------------------------------------------------------------------
# ● 更新图片活动块
#--------------------------------------------------------------------------
def update_pictures
for sprite in @picture_sprites
sprite.update
end
end
#--------------------------------------------------------------------------
# ● 更新计时器活动块
#--------------------------------------------------------------------------
def update_timer
@timer_sprite.update
end
#--------------------------------------------------------------------------
# ● 更新显示端口 修改点
#--------------------------------------------------------------------------
def update_viewports
@viewport1.tone = $game_map.screen.tone
@viewport1.ox = $game_map.screen.shake
@viewport2.tone = $game_map.screen.tone #增加
@viewport2.color = $game_map.screen.flash_color
@viewport3.color.set(0, 0, 0, 255 - $game_map.screen.brightness)
@viewport1.update
@viewport2.update
@viewport3.update
end
end
复制代码
欢迎光临 Project1 (https://rpg.blue/)
Powered by Discuz! X3.1