love2D 无法解决两个圆的基本碰撞问题,不会引起错误

我正在尝试这样做,当我的红色圆圈触碰到我的白色圆圈时,红色圆圈会向后移动一步,但是我尝试的碰撞不起作用,它穿过了白色圆圈。 以下是代码

win = love.window.setMode(600, 600)
Xpos = 300
TX = 50

function love.draw()
    love.graphics.setColor(1, 1, 1)
    love.graphics.circle("fill", Xpos, 200, 25)
    love.graphics.setColor(1, 0, 0)
    love.graphics.circle("fill", TX, 200, 60)

    if Xpos == TX then
        Xpos = Xpos + 0.1
    end

    if TX >= Xpos then
        TX = TX - 35
    end

    if love.keyboard.isDown("right") then
        TX = TX + 5
    end
end
点赞
用户3371355
用户3371355

你使得两个圆的中心“碰撞”了。你需要类似于以下的东西:

if (TX + 25 + 60) >= Xpos then    --25 和 60 是圆的半径
    TX = TX - 35
end

另外。在你的代码中,以下内容只会执行一次:

if Xpos == TX then
   Xpos = Xpos + 0.1
end

这是因为 Xpos300TX50。在每次右箭头保持按下时,TX 增加 5。这样的话, TX 在某个时刻会达到 300。现在 Xpos 变成了 300.1,而 TX == Xpos 永远不会再次为真,因为 TX 增加 5,并且永远不会具有值 300.1。在我的更新的代码中,它根本不会触发,因为圆的中心从未相交。

如果你想要检测到碰撞,你应该使用碰撞检测本身:

if (TX + 25 + 60) >= Xpos then    --25 和 60 是圆的半径
    TX = TX - 35
    --在这里添加代码
end

此外,你的代码是次优的,并且圆的速度将受到每秒帧数的影响(有些情况可能需要,但在游戏中不想这样做),你应该将移动和碰撞检测分离到 love.update 中:

function love.update(dt)
    --先移动圆,再检查碰撞以避免出现可见的交叉
    if love.keyboard.isDown("right") then
        TX = TX + 150 * dt    --每秒移动圆 150 像素
    end
    if (TX + 25 + 60) >= Xpos then
        TX = TX - 35
    end
end

最终代码将类似于以下内容:

win = love.window.setMode(600, 600)

Xpos = 300
Xpos_radius = 25
TX = 50
TX_radius = 60

function love.update(dt)
    if love.keyboard.isDown("right") then
        TX = TX + 150 * dt
    end
    if (TX + Xpos_radius + TX_radius) >= Xpos then
        TX = TX - 35
        --如果要缓慢将白色球推开,可以将 Xpos 加 1
    end
end

function love.draw()
    love.graphics.setColor(1, 1, 1)
    love.graphics.circle("fill", Xpos, 200, Xpos_radius)
    love.graphics.setColor(1, 0, 0)
    love.graphics.circle("fill", TX, 200, TX_radius)
end
2020-09-14 19:20:49