Как я могу предотвратить постоянное увеличение логики кода в Corona?

Ниже приведен код, который должен добавить 1 к счету, когда ящик приземляется в пределах границ контейнера.

local score = 0
local thescore =  display.newText("Score " .. 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 " .. score
    end
end
timer.performWithDelay(1, update, -1)

Как мне сделать так, чтобы он добавлял 1 к счету один раз каждый раз, когда ящик входит в контейнер, а не каждую миллисекунду, когда он остается внутри контейнера?


person jenny    schedule 13.04.2017    source источник


Ответы (1)


Переменная состояния

Используйте переменную для хранения статуса ящика. Когда он впервые будет найден в пределах контейнера, установите для переменной значение true и увеличьте счет. При следующем вызове update(), если для этой переменной установлено значение true, оценка не изменится. Если, с другой стороны, ящик находится вне контейнера, установите для переменной значение 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 )

Кстати, бессмысленно звонить функция обновления чаще, чем продолжительность кадра. Если у вашего config.lua есть fps = 60, то это один кадр каждые 17 мс или около того.

Используйте физику

Это может быть излишним для вашей игры, но с физикой вы можете использовать физические тела в качестве датчиков и реагировать на разные фазы перекрытия. Это задокументировано здесь, и я цитирую:

Любое тело — или любой конкретный элемент многоэлементного тела — можно превратить в датчик. Сенсоры физически не взаимодействуют с другими телами, но они создают события столкновения, когда другие тела проходят через них... также запускают «законченную» фазу события, когда они выходят за границы столкновения датчика.

Также имейте в виду, что это использование физических тел обнаруживает перекрытие, а не сдерживание, что вас, кажется, интересует.

person GoojajiGreg    schedule 13.04.2017