gpt4 book ai didi

c++ - SFML 自动运动

转载 作者:行者123 更新时间:2023-11-30 04:16:06 25 4
gpt4 key购买 nike

首先,我已经在 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。那应该可以解决您的问题。

说明:

换句话说,当 mIsMovingUpmIsMovingDown true 时,它保持静止。当您按下并松开时,它使 mIsMovingUp false 但让 mIsMovingDown 为真,因此球会移动 mIsMovingDown .当你按下并松开mIsMovingDown后,它使mIsMovingDownfalse,然后它们都是false并且移动停止。 isMovingLeftisMovingRight 相同。

关于c++ - SFML 自动运动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17901309/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com