SFML自动移动

SFML Auto Movement

本文关键字:移动 SFML      更新时间:2023-10-16

首先,我已经在SFML论坛上问过这个问题,但他们帮不上忙,他们实际上复制了我的代码,它运行得很好,即使是与我操作系统相同的人(Windows 8)

我目前正在阅读SFML游戏开发的书,在第一章中,当引入移动时,我遇到了一些问题,我在窗口的中心产生了一个白色的圆圈,现在如果我按下任何方向箭头,圆圈会一直朝另一个方向移动,直到我按下它,然后它会恢复正常,水平和垂直的箭头是分开的。

示例:我启动"游戏",向上按,圆圈一直向下,我按住,圆圈静止不动,我释放,它一直向下,按下,它停止,现在它对两个键都有正常响应,左右键都会再次发生,在最初的错误后得到修复,但我想知道如何删除它

#include <SFML/Graphics.hpp>
using namespace sf;
class Game
{
    public:Game();
        void run();
    private:
        void processEvents();
        void update(Time);
        void render();
        void handlePlayerInput(Keyboard::Key,bool);
        bool mIsMovingUp, mIsMovingRight, mIsMovingLeft, mIsMovingDown;
        float playerSpeed;
        Time TimePerFrame;

    private:
        RenderWindow mWindow;
        CircleShape mPlayer;
};
Game::Game():mWindow(VideoMode(640, 480), "SFML Application"),mPlayer(), playerSpeed(20.f), TimePerFrame(seconds(1.f / 60.f))
{
    mPlayer.setRadius(20.f);
    mPlayer.setPosition(220.f, 220.f);
    mPlayer.setFillColor(Color::White);
}
void Game::handlePlayerInput(Keyboard::Key key, bool isPressed)
{
    if (key == Keyboard::W || key == Keyboard::Up)
        mIsMovingUp = isPressed;
    else if (key == Keyboard::S || key == Keyboard::Down)
        mIsMovingDown = isPressed;
    else if (key == Keyboard::A || key == Keyboard::Left)
        mIsMovingLeft = isPressed;
    else if (key == Keyboard::D || key == Keyboard::Right)
        mIsMovingRight = isPressed;
}
void Game::run()
{
    Clock clock;
    Time timeSinceLastUpdate = Time::Zero;
    while (mWindow.isOpen())
    {
        processEvents();
        timeSinceLastUpdate += clock.restart();
        while (timeSinceLastUpdate > TimePerFrame)
        {
            timeSinceLastUpdate -= TimePerFrame;
            processEvents();
            update(TimePerFrame);
        }
    render();
    }
}
void Game::processEvents()
{
    Event event;
    while (mWindow.pollEvent(event))
    {
        switch (event.type)
        {
            case 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::update(Time deltaTime)
{
    Vector2f movement(0.f, 0.f);
    if (mIsMovingUp)
        movement.y -= playerSpeed;
    if (mIsMovingDown)
        movement.y += playerSpeed;
    if (mIsMovingLeft)
        movement.x -= playerSpeed;
    if (mIsMovingRight)
        movement.x += playerSpeed;
    mPlayer.move(movement * deltaTime.asSeconds());
}
void Game::render()
{
    mWindow.clear();
    mWindow.draw(mPlayer);
    mWindow.display();
}
int main()
{
    Game game;
    game.run();
}

答案:

默认情况下,这些变量必须是true:

bool mIsMovingUp, mIsMovingRight, mIsMovingLeft, mIsMovingDown;

Game::Game()中,将它们全部声明为false。这应该能解决你的问题。

说明:

换句话说,当mIsMovingUp和down是mIsMovingDown true时,它保持静止。当你向上按压并放开时,它会使mIsMovingUp变成false,但使mIsMovingDown变成true,因此球会移动mIsMovingDown。按下并放开mIsMovingDown后,它会使mIsMovingDown成为false,然后它们都是false,运动停止。与isMovingLeftisMovingRight相同。