问题描述
我正在尝试通过键盘移动 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();
}
}
解决方法
void game::update()
开头有 while (window->isOpen())
。
这意味着更新函数永远不会返回到 void game::run()
,即您的第二个 while (window->isOpen())
语句所在的位置,并且由于它永远不会返回到那里,因此永远不会再次调用 void game::render()
。>
玩家正在移动,但屏幕没有更新以显示玩家正在移动。去掉 while (window->isOpen())
中的 void game::update()
可以解决问题。
我使用调试器解决了这个问题,在 void player::movePlayer(sf::Vector2f distance)
中设置了一个断点,然后逐步执行代码直到我遇到问题。