Lua 编程中对象内存管理问题

我正在使用 Solar2D 制作射击游戏,一切都运行良好,但一段时间后,我感到游戏的帧率正在下降,但我已经采取了删除激光的步骤以完成任务

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 在 600ms 后调用 display.remove(newLaser),但是函数在不到 600ms 的时间内再次调用,比如 400ms,所以 display.remove(newLaser) 倒入了第一次调用的第一个对象并删除了第二个对象或最新的对象,但是如果玩家不断点击激光按钮,每次点击的时间差小于 600ms,则不会删除任何东西。请尽快帮助我。

点赞
用户7396148
用户7396148

如果你只在 fireLaser 中使用 newLaser,你应该将其定义为 local 变量。

这似乎是一个微不足道的改变,但当你执行

        onComplete = function() display.remove(newLaser) end

时,你创建了一个封闭的函数。

当一个函数被嵌套在另一个函数中时,它可以完全访问来自包含函数的局部变量;这个特性被称为词法作用域。虽然这听起来很显然,但实际上并不是。词法作用域加上一级函数是一种强大的编程概念,但很少有语言支持这种概念。 - Lua 编程指南: 6.1 – 闭包

newLaserglobal 时,这种方法不起作用,因为每次调用 fireLaser 都是在相同的 global 变量 newLaser 上执行,而不是一个唯一的 local 变量。

2021-03-13 05:32:40