Кубик не падает с платформы, хотя под ним ничего нет

Делаю простую игрушку, кубик должен прыгать по платформам и падать с них если они другого цвета. Когда кубик полностью останавливается (проходит инерция, хотя я бы хотел вообще её убрать, но это уже другая проблема), то если убрать из под него платформу то он просто висит в воздухе пока не столкнётся с другой или не нажать прыжок. Кто-нибудь знает как это исправить? Пишу на языке lua с использованием corona simulator.

    local physics = require "physics"
physics.start()
local slime
local platforms = {}
local obstacles = {}
local score = 0
local scoreText
local nojump = false
local blue_block = display.newRect(170, 10, 60, 20)
blue_block:setFillColor(0, 0, 1, 0.5)
local green_block = display.newRect(230, 10, 60, 20)
green_block:setFillColor(0, 1, 0)
local red_block = display.newRect(290, 10, 60, 20)
red_block:setFillColor(1, 0, 0, 0.5)

local function createSlime()
    slime = display.newRect(50, 200, 40, 40)
    physics.addBody(slime, "dynamic", {bounce = 0})
    slime.gravityScale = 0.5
    slime.isFixedRotation = true
    slime.name = "slime"
end

local function createGreenSlime()
    createSlime()
    slime:setFillColor(0, 1, 0) -- Задаем начальный цвет слайма
    slime.color = "green"
end

-- Функция для создания платформ
local function createPlatform(x, y, width, height)
    local platform = display.newRect(x, y, width, height)
    platform:setFillColor(0, 0, 0)
    physics.addBody(platform, "static")
    platform.name = "platform"
    platform.color = "green"
    return platform
end

-- Функция для создания новой платформы
local function createNewGreenPlatform(x, y, width, height)
    local platform = createPlatform(x, y, width, height) -- Используем createPlatform для создания платформы
    platform:setFillColor(0, 1, 0)
    platform.color = "green"
    table.insert(platforms, platform)
end

local function createNewRedPlatform(x, y, width, height)
    local platform = createPlatform(x, y, width, height) -- Используем createPlatform для создания платформы
    platform:setFillColor(1, 0, 0)
    platform.color = "red"
    table.insert(platforms, platform)
end

local function createNewBluePlatform(x, y, width, height)
    local platform = createPlatform(x, y, width, height) -- Используем createPlatform для создания платформы
    platform:setFillColor(0, 0, 1)
    platform.color = "blue"
    table.insert(platforms, platform)
end

createNewGreenPlatform(50, 255, 60, 15)
createNewGreenPlatform(250, 200, 60, 15)
createNewGreenPlatform(400, 180, 60, 15)
createNewBluePlatform(600, 150, 60, 15)
createNewGreenPlatform(850, 160, 60, 15)
createNewGreenPlatform(1050, 160, 60, 15)
createNewGreenPlatform(1250, 120, 60, 15)
createNewRedPlatform(1100, 30, 60, 15)
createGreenSlime()
local leftPressed = false
local rightPressed = false

-- Функция для движения платформ влево
local function movePlatformsLeft()
    for _, platform in ipairs(platforms) do
        platform.x = platform.x - 4
    end
end

-- Функция для движения платформ вправо
local function movePlatformsRight()
    for _, platform in ipairs(platforms) do
        platform.x = platform.x + 4 
    end
end

local isOnGround = false

local function jump()
    if isOnGround and (nojump == false) then
        slime:setLinearVelocity(0, -200) -- Применяем скорость вверх для прыжка
    end
end

local colors = {"blue", "green", "red"} -- Список цветов
local currentColorIndex = 2 -- Индекс текущего цвета


-- Функция для обработки нажатия и отпускания клавиш
local function onKeyEvent(event)
    if event.phase == "down" then
        print("Key pressed: ", event.keyName)
        if event.keyName == "left" then
            leftPressed = true
        elseif event.keyName == "right" then
            rightPressed = true
        elseif event.keyName == "space" then
            jump() -- Вызываем функцию прыжка при нажатии пробела
        elseif event.keyName == "q" then
            if currentColorIndex == 2 then
                slime:setFillColor(0, 0, 1)
                slime.color = "blue"
                currentColorIndex = currentColorIndex - 1
                red_block:setFillColor(1, 0, 0, 0.5)
                green_block:setFillColor(0, 1, 0, 0.5)
                blue_block:setFillColor(0, 0, 1)
            end
            if currentColorIndex == 3 then
                slime:setFillColor(0, 1, 0)
                slime.color = "green" 
                currentColorIndex = currentColorIndex - 1
                red_block:setFillColor(1, 0, 0, 0.5)
                green_block:setFillColor(0, 1, 0)
                blue_block:setFillColor(0, 0, 1, 0.5)
            end
        elseif event.keyName == "e" then
            if currentColorIndex == 2 then
                slime:setFillColor(1, 0, 0)
                slime.color = "red"
                currentColorIndex = currentColorIndex + 1
                red_block:setFillColor(1, 0, 0)
                green_block:setFillColor(0, 1, 0, 0.5)
                blue_block:setFillColor(0, 0, 1, 0.5)
            end
            if currentColorIndex == 1 then
                slime:setFillColor(0, 1, 0)
                slime.color = "green"
                currentColorIndex = currentColorIndex + 1
                red_block:setFillColor(1, 0, 0, 0.5)
                green_block:setFillColor(0, 1, 0)
                blue_block:setFillColor(0, 0, 1, 0.5)
            end
        end
    elseif event.phase == "up" then
        if event.keyName == "left" then
            leftPressed = false
        elseif event.keyName == "right" then
            rightPressed = false
        end
    end
end



-- Функция для обновления экрана
local function update(event)
    if leftPressed then
        movePlatformsLeft()
    end
    if rightPressed then
        movePlatformsRight()
    end
end

-- Добавляем слушатель событий клавиатуры
Runtime:addEventListener("key", onKeyEvent)
-- Добавляем слушатель события в каждом кадре
Runtime:addEventListener("enterFrame", update)

-- Функция для создания препятствий
local function createObstacle(x, y, width, height)
    local obstacle = display.newRect(x, y, width, height)
    obstacle:setFillColor(math.random(), math.random(), math.random())
    physics.addBody(obstacle, "static")
    obstacle.name = "obstacle"
    return obstacle
end

-- Функция для проверки цветов объектов
local function checkColorCollision(object1, object2)
    print("Object1:", object1.name)  -- Добавляем вывод имени object1 в консоль
    print("Object2:", object2.name)  -- Добавляем вывод имени object2 в консоль
    if object1.name == "slime" and object2.name == "platform" then
        local slimeColor = slime.color
        local platformColor = object2.color
        
        print("slimeColor:", slimeColor)
        print("platformColor:", platformColor)
        if slimeColor ~= platformColor then
            print("lox")
            return true
        end
    end
    return false
end

-- Функция для обновления счета
local function updateScore()
    score = score + 1
    scoreText.text = "Score: " .. score
end

-- Функция для создания нового препятствия
local function createNewObstacle()
    local obstacleWidth = math.random(30, 80)
    local obstacleHeight = 30
    local obstacle = createObstacle(math.random(320 - obstacleWidth), -50, obstacleWidth, obstacleHeight) -- Изменили координаты появления препятствия
    table.insert(obstacles, obstacle)
end

-- Функция для обработки столкновений
local function onCollision(event)
    if (event.phase == "began") then
        local obj1 = event.object1
        local obj2 = event.object2

        -- Проверяем столкновения с платформой
        if (obj1.name == "slime" and obj2.name == "platform") then
            isOnGround = true
            if checkColorCollision(obj1, obj2) then
                nojump = true
                    obj1.isSensor = true
                    obj1.isHitTestable = true
                    obj1:setLinearVelocity(0, 0)
            end
        elseif (obj1.name == "platform" and obj2.name == "slime") then
            isOnGround = true
            if checkColorCollision(obj2, obj1) then
                nojump = true
                    obj2.isSensor = true
                    obj2.isHitTestable = true
                    obj2:setLinearVelocity(0, 0)
            end
        end

        -- Проверяем столкновения с препятствием
        if (obj1.name == "slime" and obj2.name == "obstacle") or (obj1.name == "obstacle" and obj2.name == "slime") then
            composer.gotoScene("restart_scene")
        end
    elseif event.phase == "ended" then
        local obj1 = event.object1
        local obj2 = event.object2

        -- Проверяем, если шарик покидает землю
        if (obj1.name == "slime" and obj2.name == "platform") then
            -- Проверяем, что шарик действительно покинул землю
            local slimeTop = slime.x
            local platformTop = obj2.x
            nojump = false
                isOnGround = false
                timer.performWithDelay(1, function()
                    slime.isSensor = false
                    slime.isHitTestable = false
                end)
        elseif (obj1.name == "platform" and obj2.name == "slime") then
            -- Проверяем, что шарик действительно покинул землю
            local slimeTop = slime.x
            local platformTop = obj1.x
            nojump = false
                isOnGround = false
                timer.performWithDelay(1, function()
                    slime.isSensor = false
                    slime.isHitTestable = false
                end)
        end
    end
end

-- Добавляем слушатель событий столкновений
Runtime:addEventListener("collision", onCollision)

Ответы (1 шт):

Автор решения: billy

Решил вопрос, нужно делать платформы не static, а kinematic)

→ Ссылка