问题描述
我正在使用 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}} 变量。