如何解决lua编程中对象的内存管理存在问题
我正在使用 Solar 2d 制作射击游戏,一切正常,但一段时间后我觉得游戏帧率下降,但我在任务完成后执行了删除激光的步骤
local function fireLaser()
audio.play( fire sound )
newLaser = display.newImageRect( mainGroup,objectSheet,5,14,40 )
physics.addBody( newLaser,"dynamic",{ isSensor=true } )
newLaser.isBullet = true
newLaser.myName = "laser"
newLaser.x = ship.x
newLaser.y = ship.y
newLaser:toBack()
transition.to( newLaser,{ y=400,time=500,onComplete = function()display.remove( newLaser ) end
} )
end
我认为发生了什么,onComplete
在 600 毫秒后调用了 display.remove( newLaser )
但该函数再次调用但在不到 600 毫秒内,比如说 400 毫秒,所以 display.remove( newLaser )
转储第一个对象调用第一次点击并删除第二个或者说最新的,但是如果玩家连续点击火激光按钮,并且每次点击的差异小于600毫秒,那么什么都不会被删除。 请尽快帮助我。
解决方法
如果您只在 newLaser
内使用 fireLaser
,则应将其定义为 local
变量。
这看起来是一个微不足道的变化,但是当你这样做时
onComplete = function() display.remove(newLaser) end
您正在创建一个封闭的函数。
当一个函数被写成封闭在另一个函数中时,它可以完全访问封闭函数的局部变量;此功能称为词法范围。尽管这听起来很明显,但事实并非如此。词法范围加上一流的函数是编程语言中的一个强大概念,但很少有语言支持该概念。 - Programming in Lua: 6.1 – Closures
这在 newLaser
为 global
时不起作用,因为对 fireLaser
的每次调用都作用于 global
的同一个 newLaser
变量而不是唯一的 { {1}} 变量。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。