使用SFML移动对象

时间:2013-11-18 19:38:23

标签: c++ sfml

我开始从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);
    }

如果您能够查看到底发生了什么,可能会更好地运行代码。

1 个答案:

答案 0 :(得分:2)

您的moving变量未初始化,因此其中一些变量可能最初具有真值。

您应该在Game构造函数中将它们全部设置为false。