SFML自动移动
SFML Auto Movement
首先,我已经在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
,运动停止。与isMovingLeft
和isMovingRight
相同。
相关文章:
- SFML 向下移动时如何围绕屏幕中心旋转?
- SFML 在屏幕上移动矩形时滞后/小卡顿
- 移动后未绘制 SFML 形状
- SFML 视图:设置中心与移动。快把我逼疯了
- SFML无法正确移动精灵
- 带有 SFML 的 c++ 中的过程无法正常工作,移动算法
- 您如何使形状沿着更BE的曲线SFML移动
- 当在SFML C 中移动一个圆圈时,球后面会有口吃的束缚小故障
- 精灵不在SFML中移动
- 如何使用SFML鼠标移动分别移动多个图像
- 我的 SFML/C++ 程序按预期工作,但如何使移动变慢
- 使对象在 C++-SFML 中平滑移动
- 使投射物移动与时间相关SFML C++
- 将聚焦的精灵逐渐移动到目标位置(C++和SFML)
- SFML中移动位置的居中视图
- 如何在 SFML 中对角线移动对象
- C++ SFML 鼠标移动
- 使用另一个类 SFML c++ 中的函数时,子画面不移动
- 在 SFML 中移动球
- SFML在另一个类中绘制移动精灵