如何在Corona中防止代码逻辑不断增加得分

下面是一段代码,当箱子落在容器范围内时,它应该将得分增加1。

local score = 0
local thescore =  display.newText("得分 " .. score,  150,430, native.systemFont , 19)
local function update()
    if (crate.x > side1.x and crate.x < side2.x and crate.y < shelf.y and crate.y > shelf.y - 50) then
            score = score + 1
            thescore.text = "得分 " .. score
    end
end
timer.performWithDelay(1, update, -1)

我该如何使得每次箱子进入容器时,得分仅增加1次,而不是在每毫秒内都增加得分?

点赞
用户3455883
用户3455883

状态变量

使用一个变量来储存箱子的状态。当它第一次在容器的边界内被找到时,将变量设置为true并增加分数。接下来,如果该变量为true,则在调用update()时不会更改分数。反之,如果箱子在容器之外被找到,则将变量设置为false。代码如下(伪代码):

local score = 0
local alreadyContained = false

local function update()
    if crateIsInContainer() then
        if alreadyContained == false then
             alreadyContained = true
             score = score + 1
        end
    else
        alreadyContained = false
    end
end
timer.performWithDelay( 20, update )

顺便说一句,根据 Corona文档,调用更新函数的频率低于一帧的间隔是毫无意义的。如果你的config.lua中设定了fps = 60,那么每17毫秒左右就是一帧。

使用物理引擎

这可能对你的游戏来说有些大材小用,但使用物理引擎,你可以将物理体作为传感器,响应重叠的不同阶段。这里有说明文档,我引用其中的一段话:

任何身体或多元身体的任何特定元素都可以变成传感器。传感器不会与其他身体发生物理交互,但当其他身体经过它们时会产生碰撞事件...与传感器碰撞的物体将触发“开始”事件阶段,就像正常的非传感器物体一样,当它们退出传感器的碰撞范围时,它们也将触发“结束”事件阶段。

此外,还要注意,这种物理体检测的是重叠而不是包含,这可能不是你所感兴趣的。

2017-04-13 02:24:45