动态将精灵表添加到 Corona 中的 sequenceData 数组中

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

local function spriteListener( event )
    thisSprite = event.target  --“event.target”引用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},
--更多这样的精灵表进一步加载......
}

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个精灵表中的3个精灵表,因此需要大约6 MB来开始播放动画,并在已加载的精灵表继续播放时加载其他精灵表。因此,为了进一步说明,我加载了第1、2、3张表,并开始播放动画,并在第1张表完成时加载第4张表,在第2张表完成时加载第5张表,依此类推。

欢迎提供建议!提前致谢。

点赞
用户5331361
用户5331361

我发现这是一个老问题,但我会分享我的经验:

这不是一个简单的任务,但是它是可能的。

  1. 在进入游戏之前预加载表格

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

local filenameArray = ... -- 这是你的代码
local preloadedSheets = {}

local function enterFrameLoading()
  local nextSheetToLoad = #preloadedSheets + 1
  if (nextSheetToLoad > #filenameArray) then
    Runtime:removeEventListener("enterFrame", enterFrameLoading)
    -- 如果你使用场景,可以进入游戏场景
    return
  end

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

  updateProgress(nextSheetToLoad) -- 这个函数将更新 UI,比如进度条、文本等等
end

Runtime:addEventListener("enterFrame", enterFrameLoading)

预加载所有表格后,所有表格都会存在内存中,因此您不应该有性能问题。

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

你可以在 spriteListener 中创建新的对象——同样,将所有精灵存在一个表格中,使用 .isVisible = false 隐藏旧精灵对象。

  1. 结合解决方案 1 和 2

你可以创建只有 3 个序列的精灵对象。然后像我上面展示的那样在 enterFrame 监听器中预加载其他表格。

当预加载完成后,你将需要销毁旧精灵并创建一个新的具有相同序列和帧数的精灵。

如果您需要更多的信息,请告诉我。

2019-03-25 09:49:56