You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Joust克隆游戏碰撞失效求助:角色站平台后约5秒穿模

经典街机Joust克隆版碰撞检测穿模问题

我正在开发经典街机游戏Joust的基础克隆版,目前实现了碰撞检测功能。该功能起初正常,但角色在平台上静止或移动时,约5秒后会出现穿模现象。

我先做了代码清理、测试及小幅重构,简化检测逻辑后代码更简洁,但问题依旧——碰撞检测仍能正常工作约5秒。随后我考虑到重力因素:角色在地面时重力仍可能生效导致穿模,因此添加了isGrounded变量,规划的逻辑顺序为:

  • 角色初始略高于地面
  • handleCollision判定无碰撞→isGrounded=false
  • 角色更新时应用重力
  • 角色下落
  • 随后角色与平台碰撞
  • handleCollision判定角色在平台上→isGrounded=true
  • 角色更新时不再受重力影响

附上相关代码:

#include "game.h"

Game::Game() : window(sf::VideoMode(windowWidth, windowHeight), "App")
{
    // stuff //

    isGrounded = true;
}
void Game::handleCollision(sf::RectangleShape &A, const sf::RectangleShape &B)
{
    sf::FloatRect BoxA = A.getGlobalBounds();
    sf::FloatRect BoxB = B.getGlobalBounds();

    // Check collision from above
    if (BoxA.intersects(BoxB) && BoxA.top + BoxA.height < BoxB.top + BoxB.height)
    {
        A.setPosition(A.getPosition().x, B.getPosition().y - BoxA.height); // A.getSize().y);
        isGrounded = true;
        std::cout << "Grounded: " << std::endl;
    }
    else
    {
        isGrounded = false;
        std::cout << "In The Air: " << std::endl;
    }
}

void Game::handleCollisions()
{
    handleCollision(player1, platformGround);
}

void Game::update()
{
    float deltaTime = frameTime.asSeconds();

    // Player 1 movement control using keyboard input
    if (sf::Keyboard::isKeyPressed(sf::Keyboard::Left))
    {
        player1.move(-playerSpeed * deltaTime, 0);
    }
    else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Right))
    {
        player1.move(playerSpeed * deltaTime, 0);
    }

    // Player 1 flapping control using spacebar
    if (sf::Keyboard::isKeyPressed(sf::Keyboard::Space))
    {
        player1Velocity = flapVelocity;
    }

    // Apply gravity only when player is not grounded
    if (!isGrounded)
    {
        player1Velocity += gravity * deltaTime;
    }
    else
    {
        player1Velocity = 0.0f;
    }

    // Update position
    player1.move(0, player1Velocity * deltaTime);

    handleCollisions();
}

这肯定是个显而易见的问题,提前感谢各位的帮助。

内容的提问来源于stack exchange,提问作者Akrokan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 09:05:19