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