【发布时间】:2015-11-24 22:22:18
【问题描述】:
我最近一直在寻找 C++ 游戏开发框架,并决定尝试 SFML。我已经实现了“SFML 游戏开发”一书中的一个早期示例,以查看一切是否正常。可惜他们没有。
该代码应该在按下“wasd”键之一时使圆形对象快速移动。实际上,圆圈开始缓慢移动大约十个像素的距离,然后停止,如果我进一步按住相应的键,圆圈会在感觉时再跳跃几个像素。
//the header game.h
class Game
{
public:
Game();
void run();
private:
void processEvents();
void handlePlayerInput(sf::Keyboard::Key, bool);
void update();
void render();
sf::RenderWindow mWindow;
sf::CircleShape mPlayer;
bool mIsMovingUp;
bool mIsMovingDown;
bool mIsMovingLeft;
bool mIsMovingRight;
};
//the implementation
#include<SFML/Graphics.hpp>
#include "game.h"
Game::Game()
: mWindow(sf::VideoMode(640, 480), "SFML Application")
, mIsMovingUp(false), mIsMovingDown(false), mIsMovingLeft(false), mIsMovingRight(false)
, mPlayer()
{
mPlayer.setRadius(40.f);
mPlayer.setPosition(100.f, 100.f);
mPlayer.setFillColor(sf::Color::Cyan);
}
void Game::run()
{
while (mWindow.isOpen())
{
processEvents();
update();
render();
}
}
void Game::render()
{
mWindow.clear();
mWindow.draw(mPlayer);
mWindow.display();
}
void Game::processEvents()
{
sf::Event event;
while (mWindow.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:
mWindow.close();
break;
}
}
}
void Game::handlePlayerInput(sf::Keyboard::Key key, bool isPressed)
{
if (key == sf::Keyboard::W)
mIsMovingUp = isPressed;
else if (key == sf::Keyboard::S)
mIsMovingDown = isPressed;
else if (key == sf::Keyboard::A)
mIsMovingLeft = isPressed;
else if (key == sf::Keyboard::D)
mIsMovingRight = isPressed;
}
void Game::update()
{
sf::Vector2f movement(0.f, 0.f);
if (mIsMovingUp)
movement.y -= 1.0f;
if (mIsMovingDown)
movement.y += 1.0f;
if (mIsMovingLeft)
movement.x -= 1.0f;
if (mIsMovingRight)
movement.x += 1.0f;
mPlayer.move(movement);
}
//main file
#include <SFML/Graphics.hpp>
#include "game.h"
int main()
{
Game game;
game.run();
return 0;
}
老实说,我什至不知道从哪里开始寻找解决方案。 我想这可能与驱动程序有关,我明天将在另一台计算机上测试它。 对此的任何建议将不胜感激。
编辑以回应艾克: 我从 Debian 存储库中获得了 SFML 库,正在运行
`dpkg -l | grep sfml`
返回:
ii libsfml-audio2:amd64 2.1+dfsg2-1+b2
ii libsfml-dev:amd64 2.1+dfsg2-1+b2
ii libsfml-graphics2:amd64 2.1+dfsg2-1+b2
ii libsfml-network2:amd64 2.1+dfsg2-1+b2
ii libsfml-system2:amd64 2.1+dfsg2-1+b2
ii libsfml-window2:amd64 2.1+dfsg2-1+b2
我使用 -O2 标志使用 g++ 编译了上面的代码。 我无法想象这是一个优化问题,因为游戏循环似乎每秒可能经历两打迭代(最多)。我不能肯定地说,但我相信这个数字应该是数千。
另一个编辑:好的,所以我再次使用 repo-libraries 在 Ubuntu-VM 中编译了相同的代码。圆圈现在移动得相当快,这比我猜的好(并且还暗示了 debian 的一些问题,可能与驱动程序相关?)。在另一台运行 arch 并使用 sfml 2.3.2 的计算机上(公认比我的笔记本电脑快),程序运行速度轻松十倍
【问题讨论】:
-
你最终完全解决了这个问题吗?我没有您遇到的跳过问题,但对我来说,移动似乎缓慢而笨重。