【问题标题】:C++ SFML 2.1 collisionC++ SFML 2.1 冲突
【发布时间】:2015-06-11 07:03:47
【问题描述】:

我刚刚开始使用 SFML 2.1,我想制作一款 Pong 游戏。但是我遇到了一个问题,我无法进行碰撞检测。当它检测到碰撞时,即使它没有站在任何地方,它也会移动到另一个位置。这是您需要的代码(抱歉英语不好,这不是我的母语):

bool Game::collision()
{
    if (mPlayer.getGlobalBounds().intersects(mBall.getGlobalBounds()))
    {
        mBall.setFillColor(sf::Color::Green);
        score++;
        std::cout << score << std::endl;
        return true;
    }
    else
        return false;
}
void Game::update(sf::Time deltaTime)
{
    sf::Vector2f movement(0.f, 0.f);

    if (mIsMovingLeft)
        movement.x -= PlayerSpeed;
    if (mIsMovingRight)
        movement.x += PlayerSpeed;

    sf::Vector2f gravity(0.f, 4.f);

    mPlayer.move(movement * deltaTime.asSeconds());

    mBall.move(gravity);

    if (collision() == true) {
        mBall.setFillColor(sf::Color::Green);
    }
}
void Game::render()
{
    mWindow.clear(sf::Color::White);
    mWindow.setFramerateLimit(60);
    mWindow.draw(mPlayer);
    mWindow.draw(mBall);
    mWindow.display();
}

【问题讨论】:

  • 我无法理解这一点。 1) mPlayer 是否代表玩家桨?如果是,为什么要在交叉点上加分?这是Pong的一些奇怪的方言吗? :D 2) 在交叉路口,你应该“纠正”球在桨旁边。球不应该通过桨,对吧?你也应该改变球的运动矢量。 在桨-球碰撞时改变它 3) 你设置了两次球的颜色,首先在collision(),然后在update() 4) 乒乓球和重力?这是如何运作的? 5) 您不必每帧都设置帧限制()。在您的 c-tor 中执行此操作。
  • Tilemap Collision SFML C++ 上查看我的回答,这可能会帮助您看到碰撞的到来,而不是检查球在移动后是否发生碰撞。

标签: c++ collision-detection sfml


【解决方案1】:

你需要把每个形状都变成一个 floatrect:

sf::floatrect mBallCollide;
sf::floatrect mplayerCollide;

然后每次转换时都为它们设置浮动矩形:

mBallCollide = mBall.getGlobalBounds();
mPlayerCollide = mBall.getGlobalBounds();

然后测试碰撞使用:

if(mBallCollide.intersects(mPlayerCollide))

【讨论】:

    猜你喜欢
    • 2016-07-09
    • 2017-05-06
    • 1970-01-01
    • 1970-01-01
    • 2012-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-15
    相关资源
    最近更新 更多