[英]There is a problem in memory-management of object in lua programming
我正在使用 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 )
,但 function 再次调用但在不到 600 毫秒内,比如 400 毫秒,所以display.remove( newLaser )
转储第一个 object,第一次被点击并调用移除第二个或者说最近的一个,但是如果玩家连续点击发射激光按钮,并且每次点击的时间差小于 600 毫秒,那么什么都不会被移除。 请尽快帮助我。
如果您只在fireLaser
中使用newLaser
,则应将其定义为local
变量。
这似乎是一个微不足道的变化,但当你这样做时
onComplete = function() display.remove(newLaser) end
您正在创建一个封闭的 function。
当一个 function 写在另一个 function 中时,它可以完全访问来自封闭 function 的局部变量; 这个特性称为词法作用域。 虽然这听起来很明显,但事实并非如此。 词法作用域加上一流的函数是编程语言中的一个强大概念,但很少有语言支持该概念。 -在 Lua 中编程:6.1 – 闭包
这在newLaser
是global
变量时newLaser
,因为对 fireLaser 的每次调用都作用于fireLaser
的同一个global
变量,而不是唯一的local
变量。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.