【问题标题】:Moving a sprite using keyboard使用键盘移动精灵
【发布时间】:2021-03-30 13:08:11
【问题描述】:

我正在尝试通过键盘移动playerSpaceShip。该函数正在改变它的位置(通过 getcoordinates() 在控制台中检查)但它没有在屏幕上显示它(精灵没有移动)。任何人都可以找出原因吗?

播放器.cpp

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

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

游戏.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();
    }
}


【问题讨论】:

  • 如果您不显示所有代码,而只显示与您的问题有关的部分,这将更容易为您提供帮助...
  • 对不起,现在应该更好了

标签: sprite sfml


【解决方案1】:

void game::update() 开头有 while (window-&gt;isOpen())

这意味着更新函数永远不会返回到void game::run(),您的第二个while (window-&gt;isOpen()) 语句所在的位置,并且由于它永远不会返回到那里,void game::render() 永远不会被再次调用。

玩家正在移动,但屏幕没有更新以显示玩家正在移动。在void game::update() 中去掉while (window-&gt;isOpen()) 即可解决问题。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-21
    • 1970-01-01
    • 1970-01-01
    • 2022-05-29
    • 2015-05-20
    • 1970-01-01
    • 2021-06-15
    相关资源
    最近更新 更多