Проблема с использованием обнаружения столкновений для увеличения игрового счета в SFML 2.4 - PullRequest
0 голосов
/ 07 мая 2019

Я делаю игру с птицами, чтобы понять, как делать игры с использованием SFML 2.4 и C ++. У меня есть система подсчета очков, которая должна увеличивать счет на 1 каждый раз, когда спрайт птицы пересекается с невидимой трубкой. Однако вместо того, чтобы увеличивать счет на 1, счет приближается к 57 и 60. Любые идеи получить эту работу действительно приветствуются.

int main()
{
    int score = 0;

    float PipeInvisi = 200.0;

    while(window.isOpen())
    {
        if (state == State::PLAYING)
        {
            // Setup the Invisible Pipe for Movement
            if (!PipeInvisbleActive)
            {
                // How fast is the Pipe
                spriteInvisi.setPosition(905, 0);
                PipeInvisbleActive = true;
            }
            else
            {
                spriteInvisi.setPosition(spriteInvisi.getPosition().x - (PipeInvisi * dt.asSeconds()), spriteInvisi.getPosition().y);
                // Has the pipe reached the right hand edge of the screen?
                if (spriteInvisi.getPosition().x < -165)
                {
                    // Set it up ready to be a whole new cloud next frame
                    PipeInvisbleActive = false;
                }
            }

            // Has the Bird hit the invisible pipe
            Rect<float> Birdie = spriteBird.getGlobalBounds();
            Rect<float> Paipu5 = spriteInvisi.getGlobalBounds();
            if (Birdie.intersects(Paipu5))
            {
                // Update the score text
                score++;
                std::stringstream ss;
                ss << "Score = " << score;
                scoreText.setString(ss.str());
                clock.restart();
            }
        }
    }
}

1 Ответ

1 голос
/ 08 мая 2019

Предполагая, что ваша проблема связана с постоянным пересечением, вы можете ввести простой флаг, который помечает пересечение.

bool isBirdIntersectingPipe = false;

Тогда в игровом цикле вы можете обнаружить начало пересечения следующим образом.

if (birdRect.intersects(pipeRect)) // Intersection this frame.
{
    if (!isBirdIntersectingPipe) // No intersection last frame, so this is the beginning.
    {
        ++score;
        isBirdIntersectingPipe = true;
    }

    // Still intersecting, so do nothing.
}
else // No intersection this frame.
{
    isBirdIntersectingPipe = false;
}

В идеале у вас должна быть специальная система столкновений или даже физика, которая будет отслеживать все объекты на сцене, но в этом случае достаточно простого решения, подобного этому.

...