使用键盘移动精灵

Moving a sprite using keyboard

我正在尝试通过键盘移动 playerSpaceShip。该函数正在改变它的位置(通过 getcoordinates() 在控制台中检查)但它没有在屏幕上显示它(精灵没有移动)。谁能知道为什么?

player.cpp

void player::movePlayer(sf::Vector2f distance)
{
    playerSpaceShipSprite.move(playerMoveSpeed * distance.x, playerMoveSpeed * distance.y);
}

void player::render(sf::RenderTarget* target)
{
    target->draw(playerSpaceShipSprite);
}

game.cpp

void game::update()
{
    while (window->isOpen())
    {
        while (window->pollEvent(sfEvent))
        {
            if (sfEvent.type == sf::Event::Closed)
                window->close();

            playerMovement(sfEvent);
        }
    }
}

void game::renderPlayer()
{
    if (Player)
        Player->render(window);
}

void game::render()
{
    window->clear();

    renderBackground();
    renderPlayer();
    renderBlueAlien();

    window->display();
}

void game::playerMovement(sf::Event sfEvent)
{
    if (sfEvent.type == sf::Event::EventType::KeyPressed)
    {
        switch (sfEvent.key.code)
        {
        case sf::Keyboard::Left:
            {
                Player->movePlayer(sf::Vector2f(-1,0));
                std::cout << "Left key pressed\n";
                break;
            }

        case sf::Keyboard::Right:
            {
                Player->movePlayer(sf::Vector2f(1, 0));
                std::cout << "Right key pressed\n";
                break;
            }

        case sf::Keyboard::Up:
            {
                Player->movePlayer(sf::Vector2f(0, -1));
                std::cout << "Up key pressed\n";
                break;
            }

        case sf::Keyboard::Down:
            {
                Player->movePlayer(sf::Vector2f(0, 1));
                std::cout << "Down key pressed\n";
                break;
            }

        case sf::Keyboard::Space:
            {
                std::cout << "Space key pressed\n";
                break;
            }

        }
    }
}

void game::run()
{
    while (window->isOpen())
    {
        render();
        update();
    }
}


void game::update() 开头有 while (window->isOpen())

这意味着更新函数永远不会 returns 回到 void game::run(),你的第二个 while (window->isOpen()) 语句所在的位置,并且因为它永远不会 returns 到那里,void game::render() 再也不会被调用了。

玩家正在移动,但屏幕没有更新以显示玩家正在移动。在 void game::update() 中删除 while (window->isOpen()) 解决了问题。

我使用调试器解决了这个问题,在 void player::movePlayer(sf::Vector2f distance) 中设置了一个断点,然后单步执行代码,直到我遇到问题。