I'm trying to move playerSpaceShip
by keyboard. The function is changing its position (checked in the console by getcoordinates()) but it's not displaying it on the screen(sprite is not moving). Anyone can figure out why?
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()
has while (window->isOpen())
at the start.
This means that the update function never returns back to void game::run()
, where your second while (window->isOpen())
statement is, and since it never returns to there, void game::render()
never gets called again.
The player is moving, but the screen is not updating to show the player moving. Getting rid of while (window->isOpen())
in void game::update()
solves the problem.
I solved this using a debugger, setting a breakpoint inside void player::movePlayer(sf::Vector2f distance)
, and stepping through the code until I came across the problem.