我开始从Arthur Moreira的“SFML Game Development”一书中学习SFML。我正在尝试使用键盘在屏幕上移动圆形对象。这是给出的代码:
#include <SFML/Graphics.hpp>
class Game
{
public:
Game();
void run();
private:
void ProcessEvents();
void update();
void render();
void handlePlayerInput(sf::Keyboard::Key key, bool isPressed);
private:
sf::RenderWindow myWindow;
sf::CircleShape myPlayer;
bool movingLeft, movingUp, movingRight, movingDown;
};
Game::Game() : myWindow(sf::VideoMode(640, 480), "SFML Game"), myPlayer()
{
myPlayer.setRadius(40.f);
myPlayer.setFillColor(sf::Color::Red);
myPlayer.setPosition(100.f, 100.f);
}
void Game::run()
{
while (myWindow.isOpen())
{
ProcessEvents();
update();
render();
}
}
void Game::ProcessEvents()
{
sf::Event event;
while (myWindow.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 : myWindow.close(); break;
}
}
}
void Game::handlePlayerInput(sf::Keyboard::Key key, bool isPressed)
{
if (key == sf::Keyboard::W) movingUp = isPressed;
else if (key == sf::Keyboard::S) movingDown = isPressed;
else if (key == sf::Keyboard::A) movingLeft = isPressed;
else if (key == sf::Keyboard::D) movingRight = isPressed;
}
void Game::update()
{
sf::Vector2f movement(0.f, 0.f);
if (movingUp) movement.y -= 1.f;
if (movingDown) movement.y += 1.f;
if (movingLeft) movement.x -= 1.f;
if (movingRight) movement.x += 1.f;
myPlayer.move(movement);
}
void Game::render()
{
myWindow.clear();
myWindow.draw(myPlayer);
myWindow.display();
}
int main()
{
Game game;
game.run();
return 0;
}
以下是我的问题所在: 在函数 update()中,我正在更新cicle应该去的方向。但是当我第一次尝试向左移动时,圆圈向右移动。反之亦然。如果我在开始时尝试向右移动,则圆圈向左移动。当我尝试上下移动时,结果是一样的。所以,正如我所说,当我离开时,它向右走。但如果我再次向左按,则运动停止,我可以正确地向左和向右移动圆圈。如果我想上下移动,我应该做同样的事情来修复方向。我的代码中有错误吗?
我的第二个问题是: 在更新功能中,我编写了书中的代码。但是如果我想上升,我认为我应该在'y'中添加1,而不是减去1.如果我想要下降,我不应该减1吗?我认为更新功能应如下所示:
void Game::update()
{
sf::Vector2f movement(0.f, 0.f);
if (movingUp) movement.y += 1.f; //Here we should add 1
if (movingDown) movement.y -= 1.f; //Here we should substract 1
if (movingLeft) movement.x -= 1.f;
if (movingRight) movement.x += 1.f;
myPlayer.move(movement);
}
如果您能够查看到底发生了什么,可能会更好地运行代码。
答案 0 :(得分:2)
您的moving
变量未初始化,因此其中一些变量可能最初具有真值。
您应该在Game
构造函数中将它们全部设置为false。