使用键盘移动精灵
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)
中设置了一个断点,然后单步执行代码,直到我遇到问题。
我正在尝试通过键盘移动 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)
中设置了一个断点,然后单步执行代码,直到我遇到问题。