Hi
i wrote the code same as the book but the after the key is released the bool variables won't reset to false
and object moves without stopping
also the object moves opposite direction, when i press W set the mPlayer.move(0,-1) but it moves to down
Main.cpp
#ifdef SFML_STATIC
#pragma comment(lib, "glew.lib")
#pragma comment(lib, "freetype.lib")
#pragma comment(lib, "jpeg.lib")
#pragma comment(lib, "opengl32.lib")
#pragma comment(lib, "winmm.lib")
#pragma comment(lib, "gdi32.lib")
#endif // SFML_STATIC
#include "game.h"
#include <SFML/Graphics.hpp>
#include <SFML/Audio.hpp>
#include <SFML/Window.hpp>
#include <iostream>
#include <string>
#include <cstdlib>
#include <ctime>
int main()
{
Game game;
game.run();
return 0;
}
game.h
#include <SFML/Graphics.hpp>
#include <SFML/Audio.hpp>
#include <SFML/Window.hpp>
#include <iostream>
#include <string>
#include <cstdlib>
#include <ctime>
#ifndef GAME_H
#define GAME_H
class Game{
private:
void processEvents();
void update();
void render();
private:
sf::RenderWindow mWindow;
sf::CircleShape mPlayer;
bool mIsMovingUp, mIsMovingDown, mIsMovingLeft, mIsMovingRight;
public:
Game();
void HandlePlayerInput(sf::Keyboard::Key, bool);
void run();
};
#endif // GAME_H
game.cpp
#include "game.h"
Game::Game() : mWindow(sf::VideoMode(640, 480), "SFML Application"), mPlayer(){
mPlayer.setRadius(40.f);
mPlayer.setPosition(100.f, 100.f);
mPlayer.setFillColor(sf::Color::Cyan);
}
void Game::run(){
while (mWindow.isOpen()){
processEvents();
update();
render();
}
}
void Game::processEvents(){
sf::Event event;
while (mWindow.pollEvent(event)){
switch (event.type){
case sf::Event::KeyPressed:
HandlePlayerInput(event.key.code, true);
break;
case sf::Event::KeyReleased:
HandlePlayerInput(event.key.code, false);
break;
case sf::Event::Closed:
mWindow.close();
break;
}
}
}
void Game::HandlePlayerInput(sf::Keyboard::Key key, bool isPressed){
if (key == sf::Keyboard::W)
mIsMovingUp = isPressed;
else if (key == sf::Keyboard::S)
mIsMovingDown = isPressed;
else if (key == sf::Keyboard::A)
mIsMovingLeft = isPressed;
else if (key == sf::Keyboard::D)
mIsMovingRight = isPressed;
}
void Game::update(){
sf::Vector2f movement(0.f, 0.f);
if (mIsMovingUp)
movement.y -= 1.f;
if (mIsMovingDown)
movement.y += 1.f;
if (mIsMovingLeft)
movement.x -= 1.f;
if (mIsMovingRight)
movement.x += 1.f;
mPlayer.move(movement);
}
void Game::render(){
mWindow.clear();
mWindow.draw(mPlayer);
mWindow.display();
}
Main.cpp
#ifdef SFML_STATIC
#pragma comment(lib, "glew.lib")
#pragma comment(lib, "freetype.lib")
#pragma comment(lib, "jpeg.lib")
#pragma comment(lib, "opengl32.lib")
#pragma comment(lib, "winmm.lib")
#pragma comment(lib, "gdi32.lib")
#endif // SFML_STATIC
This is (IMO) a bad idea/habit.
Information about what libs to link against is platform specific and belongs in your build system (SCons, CMake, QMake, make or similar), not in your source files. You are needlessly tying your source to Windows and a specific compiler that understands those (non-standard) pragma's. There is no good reason to do that.
You never initialize your bools in your constructor, so they start out with undefined/random values.
Do this:
Game::Game() : mWindow(sf::VideoMode(640, 480), "SFML Application"), mPlayer(),
mIsMovingUp(false), mIsMovingDown(false), mIsMovingLeft(false), mIsMovingRight(false)
and your code runs as I believe you expect it to :)
Edit: By the way, why are your include guards in "game.h" below the includes?
It would be more straightforward if you put your keyboard handling directly into update function instead passing bools around. Something like this:
void Game::update(){
sf::Vector2f movement(0.f, 0.f);
if (sf::Keyboard::isKeyPressed(sf::Keyboard::W))
movement.y -= 1.f;
if (sf::Keyboard::isKeyPressed(sf::Keyboard::S))
movement.y += 1.f;
if (sf::Keyboard::isKeyPressed(sf::Keyboard::A))
movement.x -= 1.f;
if (sf::Keyboard::isKeyPressed(sf::Keyboard::D))
movement.x += 1.f;
mPlayer.move(movement);
}
Is this working for you? (I didn't test it)
This solution should work as long you want to move your objects while a key is pressed.