Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 自动运动_C++_Sfml - Fatal编程技术网

C++ 自动运动

C++ 自动运动,c++,sfml,C++,Sfml,首先,我已经在SFML论坛上问过这个问题,但他们帮不上忙,他们实际上复制了我的代码,它工作得很好,即使有人使用与我相同的操作系统(Windows 8) 我目前正在阅读SFML游戏开发书籍,在第一章中,当介绍运动时,我遇到了一些问题,我在窗口的中心生成了一个白色的圆圈,现在如果我按下任何方向箭头,圆圈会一直朝另一个方向移动,直到我按下它,然后它恢复正常,水平和垂直是分开的 示例:我开始“游戏”,按向上,圆圈继续向下,我按住,圆圈静止不动,我松开,它继续向下,我按下,它停止,现在它对两个键都正常响应

首先,我已经在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();
}
#包括
使用名称空间sf;
班级游戏
{
公众:游戏();
无效运行();
私人:
void processEvents();
无效更新(时间);
void render();
无效handlePlayerInput(键盘::键,布尔);
布尔移动不当,向右移动不当,向左移动不当,向下移动不当;
漂浮运动员速度;
时间帧;
私人:
RenderWindow mWindow;
圆形单层;
};
Game::Game():mWindow(视频模式(640480),“SFML应用程序”),mPlayer(),playerSpeed(20.f),TimePerFrame(秒(1.f/60.f))
{
mPlayer.setRadius(20.f);
mPlayer.setPosition(220.f,220.f);
mPlayer.setFillColor(颜色:白色);
}
无效游戏::掌上游戏输入(键盘::键,按下键)
{
如果(键==键盘::W | |键==键盘::向上)
mIsMovingUp=已按下;
else if(键==键盘::S | |键==键盘::向下)
向下移动错误=按下;
else if(键==键盘::A | |键==键盘::左)
误动左=按下;
else if(键==键盘::D | |键==键盘::右)
误动右=按下;
}
void Game::run()
{
时钟;
Time timeSinceLastUpdate=时间::零;
while(mWindow.isOpen())
{
processEvents();
TimesInclastUpdate+=时钟。重新启动();
同时(TimesInclastUpdate>TimePerFrame)
{
TimesInclastUpdate-=TimePerFrame;
processEvents();
更新(时间段);
}
render();
}
}
void Game::processEvents()
{
事件;
while(mWindow.polleevent(event))
{
开关(事件类型)
{
案例事件::按键:
handlePlayerInput(event.key.code,true);
打破
案例sf::Event::KeyReleased:
handlePlayerInput(event.key.code,false);
打破
案例sf::事件::已结束:
mWindow.close();
打破
}
}
}
无效游戏::更新(时间延迟)
{
矢量2f运动(0.f,0.f);
如果(移动错误)
运动.y-=运动员速度;
如果(向下移动错误)
移动.y+=玩家速度;
如果(左移错误)
运动.x-=运动员速度;
如果(误动权)
运动.x+=运动员速度;
mPlayer.move(movement*deltaTime.asSeconds());
}
void Game::render()
{
mWindow.clear();
mWindow.draw(mPlayer);
mWindow.display();
}
int main()
{
游戏;
game.run();
}
回答: 默认情况下,这些变量必须为
true

bool mIsMovingUp, mIsMovingRight, mIsMovingLeft, mIsMovingDown;
Game::Game()
中,将它们全部声明为false。那应该能解决你的问题

说明: 换句话说,当
mIsMovingUp
和down是
mIsMovingDown
true
时,它保持静止。当您按下向上键并松开时,它会使
mIsMovingUp
false
但使
mIsMovingDown
为true,因此球会移动
mIsMovingDown
。当您按下并放开
mIsMovingDown
后,会使
mIsMovingDown
false
,然后它们都是
false
,移动停止。同样适用于
isMovingLeft
isMovingRight