【问题标题】:dynamically add spritesheets to sequenceData array in corona在 corona 中动态地将 spritesheets 添加到 sequenceData 数组中
【发布时间】:2019-07-20 10:35:32
【问题描述】:

问题:我有一个持续时间长的基于帧的动画,为此我创建了许多精灵表(例如,50 个精灵表,每个精灵表有 10 个图像 - 每个精灵表 2 MB)。使用基于下面示例代码 sn-p 的代码(在 corona 文档中建议)播放动画之前,需要花费大量时间(和内存)来预加载所有 50 个精灵表:

local function spriteListener( event )
    thisSprite = event.target  -- "event.target" references the sprite

    if ( event.phase == "ended" ) then 
        sequenceNumer = sequenceNumer + 1;

        if (sequenceNumer <=10) then
            thisSprite:setSequence(filenameArray[sequenceNumer])
            thisSprite:play()
        end
    end
end
local spriteWidth = 551
local spriteHeight = 401
local numFrames1 = 15
local startFrame = 1

frameInfoSet1 = {width = spriteWidth , height = spriteHeight, numFrames = numFrames1}

filenameArray = {"001-015","016-030","031-045","046-060","061-075","076-090","091-105","106-120","121-135","136-150"}

fullSequence = 
{
    {name=filenameArray[1], sheet=graphics.newImageSheet("spritesheets/" .. filenameArray[1] .. ".png", frameInfoSet1), start = startFrame, count=numFrames1, time=2250, loopCount=1},
    {name=filenameArray[2], sheet=graphics.newImageSheet("spritesheets/" .. filenameArray[2] .. ".png", frameInfoSet1), start = startFrame, count=numFrames1, time=2250, loopCount=1},
    {name=filenameArray[3], sheet=graphics.newImageSheet("spritesheets/" .. filenameArray[3] .. ".png", frameInfoSet1), start = startFrame, count=numFrames1, time=2250, loopCount=1},
-- more such spritesheets are loaded further...
}

firstSpriteSheet = fullSequence[1]["sheet"]

sequenceNumer = 1

tt = display.newSprite (firstSpriteSheet, fullSequence)
tt.x = display.contentWidth/2 ; tt.y = display.contentHeight/2
tt:addEventListener( "sprite", spriteListener )
tt:play()

但是,我想要实现的是这种技术的“流式”版本。即我将只加载总共 50 个 spritesheets 中的 3 个,因此需要说 6 MB 来开始播放动画并在已加载的 spritesheets 继续播放时继续加载其他 spritesheets。因此,为了进一步说明,我加载工作表 1、2、3 并开始播放动画,并在工作表 1 完成之前加载工作表 4,在工作表 2 完成之前加载工作表 5,依此类推。

感谢任何建议!提前致谢。

【问题讨论】:

  • 我不认为这是可能的。尝试减小图像表的大小。

标签: lua lazy-loading coronasdk


【解决方案1】:

我看到这是一个老问题,但我会根据我的经验补充一些想法:

这不是一件容易的事,但有可能

  1. 出发前预装纸张

我建议添加简单的加载场景,加载时会显示进度条。

local filenameArray = ... -- this is from your code
local preloadedSheets = {}

local function enterFrameLoading()
  local nextSheetToLoad = #preloadedSheets + 1
  if (nextSheetToLoad > #filenameArray) then
    Runtime:removeEventListener("enterFrame", enterFrameLoading)
    -- go to game scene if you are using scenes
    return
  end

  preloadedSheets[nextSheetToLoad] = 
        graphics.newImageSheet("spritesheets/" .. filenameArray[nextSheetToLoad] .. ".png", ??)

  updateProgress(nextSheetToLoad) -- this function will update UI, i.e. progress bar, text, etc
end

Runtime:addEventListener("enterFrame", enterFrameLoading)

预加载后,所有工作表都将在内存中,因此您不应该遇到性能问题

  1. 使用多个按需创建的精灵对象

您可以在spriteListener 中创建新对象 - 再次,将所有精灵存储在一个表格中并使用.isVisible = false 隐藏旧精灵

  1. 结合解决方案 1 和 2

您可以只用 3 个序列创建精灵对象。然后像我上面显示的那样在 enterFrame 侦听器中预加载其他工作表。

预加载完成后,您想销毁旧精灵并使用相同的序列和帧创建新精灵

如果您需要这方面的更多信息,请告诉我

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-30
    • 2019-09-03
    • 2017-09-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多