设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 1669|回复: 0

[讨论] 关于AutoLight脚本光影随地图卷动延迟的问题

[复制链接]

Lv4.逐梦者

送快递的水表员

梦石
10
星屑
4782
在线时间
3302 小时
注册时间
2012-6-27
帖子
7160

开拓者贵宾

发表于 2018-7-27 13:45:57 | 显示全部楼层 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
        昨天在画完地图准备实施的时候,发现一个严重的问题:光影的移动与地图卷动存在延迟
       
        最开始我以为是因为我改 得一坨稀烂 了脚本,以为是用了不同的viewport所致,但是在统一了viewport后问题依旧存在。在论坛搜索了一下以后发现早就有人问过这个问题,但并未得到解答。从这个问题看出,这应该是AL自身的问题。发现问题似乎并不简单
        
        这个延迟对于光影层来讲基本无伤大雅,目测延迟只有2到3象素(?),但是对于我这种把树木花草(因为需要遮罩到人物上方)也画到Spot层里的人来讲就相当杯具了,这种延迟极为明显并且严重影响游戏体验。
        当然,解决办法是有的,也并不难,参考《魂之轮回》ground层的做法,直接在 Spriteset_Map 里加图层(我个人的理解是其实就是当成显示在画面前的远景图处理……),这样一来果然延迟消失了,并且效果也没变。不过这样还需要一些后续处理,比如如何随时控制透明度什么的需要额外写一些东西(然而应该并不难做)。

        那么问题来了:是什么原因导致的这个延迟?我个人经过测试感觉这个延迟可能发生在 Scene_Map 的处理上,或者是图块活动块与光影活动块处理相隔太远导致存在时间差(?)
目前已知的结论是用和处理ground层完全一样的写法改掉AL的默认写法依旧会有延迟。
        所以关于这个问题我想请教一下真正的原因,以及是否有除上述方法的可行的解决方案

附:
AutoLight v4.1(由于我用的已经被我改的稀烂了,所以贴个原版的吧,反正是原版就存在的问题)
为了省地方贴个有脚本的页面
Spriteset_Map 中处理ground层的办法(Spot已移植):
  1. #==============================================================================
  2. # ■ Spriteset_Map
  3. #------------------------------------------------------------------------------
  4. #  处理地图画面活动块和元件的类。本类在 Scene_Map 类的内部使用。
  5. #==============================================================================

  6. class Spriteset_Map
  7.   #--------------------------------------------------------------------------
  8.   # ● 初始化对像
  9.   #--------------------------------------------------------------------------
  10.   def initialize
  11.     @GroundON = FileTest.exist?("Graphics/Pictures/" + "ground" + $game_map.map_id.to_s + ".png")
  12.     @SpotON = FileTest.exist?("Graphics/Pictures/" + "Spot" + $game_map.map_id.to_s + ".png")
  13.     create_viewports
  14.     create_tilemap
  15.     create_parallax
  16.     create_characters
  17.     create_shadow
  18.     create_weather
  19.     create_pictures
  20.     create_timer
  21.     update
  22.   end
  23.   #--------------------------------------------------------------------------
  24.   # ● 生成显示端口
  25.   #--------------------------------------------------------------------------
  26.   def create_viewports
  27.     @viewport1 = Viewport.new(0, 0, 640, 480)
  28.     @viewport2 = Viewport.new(0, 0, 640, 480)
  29.     @viewport3 = Viewport.new(0, 0, 640, 480)
  30.     @viewport2.z = 51 #50
  31.     @viewport3.z = 100
  32.   end
  33.   #--------------------------------------------------------------------------
  34.   # ● 生成地图元件
  35.   #--------------------------------------------------------------------------
  36.   def create_tilemap
  37.     @tilemap = Tilemap.new(@viewport1)
  38.     @tilemap.bitmaps[0] = Cache.system("TileA1")
  39.     @tilemap.bitmaps[1] = Cache.system("TileA2")
  40.     @tilemap.bitmaps[2] = Cache.system("TileA3")
  41.     @tilemap.bitmaps[3] = Cache.system("TileA4")
  42.     @tilemap.bitmaps[4] = Cache.system("TileA5")
  43.     @tilemap.bitmaps[5] = Cache.system("TileB")
  44.     @tilemap.bitmaps[6] = Cache.system("TileC")
  45.     @tilemap.bitmaps[7] = Cache.system("TileD")
  46.     @tilemap.bitmaps[8] = Cache.system("TileE")
  47.     @tilemap.map_data = $game_map.data
  48.     @tilemap.passages = $game_map.passages
  49.   end
  50.   #--------------------------------------------------------------------------
  51.   # ● 生成远景
  52.   #--------------------------------------------------------------------------
  53.   def create_parallax
  54.     if @GroundON
  55.       @ground = Plane.new(@viewport1)
  56.       @ground.z = 1
  57.       @ground.bitmap = Bitmap.new("Graphics/Pictures/"+"ground" + $game_map.map_id.to_s)
  58.     end
  59.     if @SpotON
  60.       @spot = Plane.new(@viewport2)
  61.       @spot.z = 50
  62.       @spot.bitmap = Bitmap.new("Graphics/Pictures/"+"Spot" + $game_map.map_id.to_s)
  63.     end
  64.     @parallax = Plane.new(@viewport1)
  65.     @parallax.z = -100
  66.   end
  67.   #--------------------------------------------------------------------------
  68.   # ● 生成角色活动块
  69.   #--------------------------------------------------------------------------
  70.   def create_characters
  71.     @character_sprites = []
  72.     for i in $game_map.events.keys.sort
  73.       sprite = Sprite_Character.new(@viewport1, $game_map.events[i])
  74.       @character_sprites.push(sprite)
  75.       unless $game_map.events[i].list == nil # 问题在于事件的开关
  76.         for j in 0...$game_map.events[i].list.size
  77.           if $game_map.events[i].list[j].code == 108 and $game_map.events[i].list[j].parameters == ["光影之上"]
  78.             sprite = Sprite_Character.new(@viewport3, $game_map.events[i])
  79.             @character_sprites.push(sprite)
  80.           end
  81.         end
  82.       end
  83.     end
  84.     for vehicle in $game_map.vehicles
  85.       sprite = Sprite_Character.new(@viewport1, vehicle)
  86.       @character_sprites.push(sprite)
  87.     end
  88.     @character_sprites.push(Sprite_Character.new(@viewport1, $game_player))
  89.   end
  90.   #--------------------------------------------------------------------------
  91.   # ● 生成飞船阴影活动块
  92.   #--------------------------------------------------------------------------
  93.   def create_shadow
  94.     @shadow_sprite = Sprite.new(@viewport1)
  95.     @shadow_sprite.bitmap = Cache.system("Shadow")
  96.     @shadow_sprite.ox = @shadow_sprite.bitmap.width / 2
  97.     @shadow_sprite.oy = @shadow_sprite.bitmap.height
  98.     @shadow_sprite.z = 180
  99.   end
  100.   #--------------------------------------------------------------------------
  101.   # ● 生成天候
  102.   #--------------------------------------------------------------------------
  103.   def create_weather
  104.     @weather = Spriteset_Weather.new(@viewport2)
  105.   end
  106.   #--------------------------------------------------------------------------
  107.   # ● 生成图片活动块
  108.   #--------------------------------------------------------------------------
  109.   def create_pictures
  110.     @picture_sprites = []
  111.     for i in 1..20
  112.       @picture_sprites.push(Sprite_Picture.new(@viewport2,
  113.         $game_map.screen.pictures[i]))
  114.     end
  115.   end
  116.   #--------------------------------------------------------------------------
  117.   # ● 生成计时器活动块
  118.   #--------------------------------------------------------------------------
  119.   def create_timer
  120.     @timer_sprite = Sprite_Timer.new(@viewport2)
  121.   end
  122.   #--------------------------------------------------------------------------
  123.   # ● 释放
  124.   #--------------------------------------------------------------------------
  125.   def dispose
  126.     dispose_tilemap
  127.     dispose_parallax
  128.     dispose_characters
  129.     dispose_shadow
  130.     dispose_weather
  131.     dispose_pictures
  132.     dispose_timer
  133.     dispose_viewports
  134.   end
  135.   #--------------------------------------------------------------------------
  136.   # ● 释放地图元件
  137.   #--------------------------------------------------------------------------
  138.   def dispose_tilemap
  139.     @tilemap.dispose
  140.   end
  141.   #--------------------------------------------------------------------------
  142.   # ● 释放远景
  143.   #--------------------------------------------------------------------------
  144.   def dispose_parallax
  145.     if @ground != nil
  146.       @ground.dispose
  147.     end
  148.     if @spot != nil
  149.       @spot.dispose
  150.     end
  151.     @parallax.dispose
  152.   end
  153.   #--------------------------------------------------------------------------
  154.   # ● 释放角色活动块
  155.   #--------------------------------------------------------------------------
  156.   def dispose_characters
  157.     for sprite in @character_sprites
  158.       sprite.dispose
  159.     end
  160.   end
  161.   #--------------------------------------------------------------------------
  162.   # ● 释放飞船阴影活动块
  163.   #--------------------------------------------------------------------------
  164.   def dispose_shadow
  165.     @shadow_sprite.dispose
  166.   end
  167.   #--------------------------------------------------------------------------
  168.   # ● 释放天候
  169.   #--------------------------------------------------------------------------
  170.   def dispose_weather
  171.     @weather.dispose
  172.   end
  173.   #--------------------------------------------------------------------------
  174.   # ● 释放图片活动块
  175.   #--------------------------------------------------------------------------
  176.   def dispose_pictures
  177.     for sprite in @picture_sprites
  178.       sprite.dispose
  179.     end
  180.   end
  181.   #--------------------------------------------------------------------------
  182.   # ● 释放计时器活动块
  183.   #--------------------------------------------------------------------------
  184.   def dispose_timer
  185.     @timer_sprite.dispose
  186.   end
  187.   #--------------------------------------------------------------------------
  188.   # ● 释放显示端口
  189.   #--------------------------------------------------------------------------
  190.   def dispose_viewports
  191.     @viewport1.dispose
  192.     @viewport2.dispose
  193.     @viewport3.dispose
  194.   end
  195.   #--------------------------------------------------------------------------
  196.   # ● 更新画面
  197.   #--------------------------------------------------------------------------
  198.   def update
  199.     update_tilemap
  200.     update_parallax
  201.     update_characters
  202.     update_shadow
  203.     update_weather
  204.     update_pictures
  205.     update_timer
  206.     update_viewports
  207.   end
  208.   #--------------------------------------------------------------------------
  209.   # ● 更新地图元件
  210.   #--------------------------------------------------------------------------
  211.   def update_tilemap
  212.     @tilemap.ox = $game_map.display_x / 8
  213.     @tilemap.oy = $game_map.display_y / 8
  214.     @tilemap.update
  215.   end
  216.   #--------------------------------------------------------------------------
  217.   # ● 更新远景
  218.   #--------------------------------------------------------------------------
  219.   def update_parallax
  220.     if @ground != nil
  221.       @ground.tone = $game_map.screen.tone
  222.       if @ground.ox != -$game_map.display_x / 256 or @ground.oy != -$game_map.display_y / 256 or @ground.ox == 0 or @ground.oy == 0
  223.         @ground.ox = $game_map.display_x / 8
  224.         @ground.oy = $game_map.display_y / 8
  225.       end
  226.     end
  227.     if @spot != nil
  228.       if @spot.ox != -$game_map.display_x / 256 or @spot.oy != -$game_map.display_y / 256 or @spot.ox == 0 or @spot.oy == 0
  229.         @spot.ox = $game_map.display_x / 8
  230.         @spot.oy = $game_map.display_y / 8
  231.       end
  232.     end
  233.     if @parallax_name != $game_map.parallax_name
  234.       @parallax_name = $game_map.parallax_name
  235.       if @parallax.bitmap != nil
  236.         @parallax.bitmap.dispose
  237.         @parallax.bitmap = nil
  238.       end
  239.       if @parallax_name != ""
  240.         @parallax.bitmap = Cache.parallax(@parallax_name)
  241.       end
  242.       Graphics.frame_reset
  243.     end
  244.     @parallax.ox = $game_map.calc_parallax_x(@parallax.bitmap)
  245.     @parallax.oy = $game_map.calc_parallax_y(@parallax.bitmap)
  246.   end
  247.   #--------------------------------------------------------------------------
  248.   # ● 更新角色活动块
  249.   #--------------------------------------------------------------------------
  250.   def update_characters
  251.     for sprite in @character_sprites
  252.       sprite.update
  253.     end
  254.   end
  255.   #--------------------------------------------------------------------------
  256.   # ● 更新飞船阴影活动块
  257.   #--------------------------------------------------------------------------
  258.   def update_shadow
  259.     airship = $game_map.airship
  260.     @shadow_sprite.x = airship.screen_x
  261.     @shadow_sprite.y = airship.screen_y + airship.altitude
  262.     @shadow_sprite.opacity = airship.altitude * 8
  263.     @shadow_sprite.update
  264.   end
  265.   #--------------------------------------------------------------------------
  266.   # ● 更新天候
  267.   #--------------------------------------------------------------------------
  268.   def update_weather
  269.     @weather.type = $game_map.screen.weather_type
  270.     @weather.max = $game_map.screen.weather_max
  271.     @weather.ox = $game_map.display_x / 8
  272.     @weather.oy = $game_map.display_y / 8
  273.     @weather.update
  274.   end
  275.   #--------------------------------------------------------------------------
  276.   # ● 更新图片活动块
  277.   #--------------------------------------------------------------------------
  278.   def update_pictures
  279.     for sprite in @picture_sprites
  280.       sprite.update
  281.     end
  282.   end
  283.   #--------------------------------------------------------------------------
  284.   # ● 更新计时器活动块
  285.   #--------------------------------------------------------------------------
  286.   def update_timer
  287.     @timer_sprite.update
  288.   end
  289.   #--------------------------------------------------------------------------
  290.   # ● 更新显示端口 修改点
  291.   #--------------------------------------------------------------------------
  292.   def update_viewports
  293.     @viewport1.tone = $game_map.screen.tone
  294.     @viewport1.ox = $game_map.screen.shake
  295.     @viewport2.tone = $game_map.screen.tone #增加
  296.     @viewport2.color = $game_map.screen.flash_color
  297.     @viewport3.color.set(0, 0, 0, 255 - $game_map.screen.brightness)
  298.     @viewport1.update
  299.     @viewport2.update
  300.     @viewport3.update
  301.   end
  302. end
复制代码
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-3-29 07:04

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表