динамически добавлять таблицы спрайтов в массив sequenceData в короне - PullRequest
0 голосов
/ 26 февраля 2019

Проблема: у меня есть длительная анимация на основе кадров, для которой я создал много таблиц спрайтов (например, 50 листов спрайтов с 10 изображениями в каждом - 2 МБ на таблицу спрайтов).Требуется заметное время (и память) для предварительной загрузки всех 50 таблиц спрайтов, прежде чем анимация может быть воспроизведена с использованием кода, основанного на приведенном ниже фрагменте кода (это рекомендуется в документах Corona):

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()

ОднакоТо, что я хотел бы достичь, это «потоковая» версия этой техники.т. е. я загружу только 3 спрайт-листа из общего числа 50, поэтому для начала воспроизведения анимации требуется, скажем, 6 МБ, и продолжать загружать дополнительные спрайт-листы, поскольку уже загруженные продолжают играть.Итак, чтобы проиллюстрировать далее, я загружаю листы 1, 2, 3 и начинаю воспроизведение анимации, и загрузка листа 4 по расписанию 1 заканчивается, загрузка листа 5 по расписанию 2 заканчивается и так далее.

Любой совет приветствуется!Заранее спасибо.

1 Ответ

0 голосов
/ 25 марта 2019

Я вижу, что это старый вопрос, но я добавлю мысли из моего опыта:

Это непростая задача, но она возможна

  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)

После предварительной загрузки все листы будут в памяти, поэтому у вас не должно быть производительностивопросы

Использовать несколько объектов спрайтов, созданных по требованию

Вы можете создавать новые объекты внутри spriteListener - снова, хранить все спрайты внутри таблицы и использовать .isVisible = false, чтобы скрыть старые спрайты

Объединение решений 1 и 2

Вы можете создавать объекты спрайтов всего с 3 последовательностями.Затем предварительно загрузите другие листы в обработчик enterFrame, как я показал выше.

Когда предварительная загрузка закончена, вы хотите уничтожить старый спрайт и создать новый с той же последовательностью и фреймом

Дайте мне знать, если вам нужна дополнительная информация об этом

...