动态将精灵表添加到 Corona 中的 sequenceData 数组中
2019-2-26 19:51:26
收藏:0
阅读:79
评论:1
问题:我有一个长时间的基于帧的动画,为此我创建了许多精灵表(例如每个精灵表有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张表,依此类推。
欢迎提供建议!提前致谢。
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- Lua 虚拟机加密load(string.dump(function)) 后执行失败问题如何解决
- 我想创建一个 Nginx 规则,禁止访问
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?

我发现这是一个老问题,但我会分享我的经验:
这不是一个简单的任务,但是它是可能的。
我建议添加简单的加载场景,当加载时显示进度条。
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)预加载所有表格后,所有表格都会存在内存中,因此您不应该有性能问题。
你可以在
spriteListener中创建新的对象——同样,将所有精灵存在一个表格中,使用.isVisible = false隐藏旧精灵对象。你可以创建只有 3 个序列的精灵对象。然后像我上面展示的那样在
enterFrame监听器中预加载其他表格。当预加载完成后,你将需要销毁旧精灵并创建一个新的具有相同序列和帧数的精灵。
如果您需要更多的信息,请告诉我。