- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我最近一直在寻找 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 的计算机(公认比我的笔记本电脑快)上,程序运行速度轻松十倍
最佳答案
一些尝试:
A) 设置mWindow.setKeyRepeatEnabled(false)
。这将禁用自动重复。
B) 尝试更改您的 Game::processEvents
以使用 if
而不是 while
,如下所示:
void Game::processEvents()
{
sf::Event event;
if (mWindow.pollEvent(event))
{
...
}
}
我怀疑您看到的是事件队列中充斥着自动重复键事件的结果。然后,这将降低调用 update
和 render
等函数的频率,并破坏平滑的帧速率。
第一个建议试图消除这种可能造成队列堵塞的情况。第二个将使更新/刷新在事件处理之间交错进行,而不仅仅是在事件队列变空时执行。
关于c++ - SFML 极慢/不规则的帧率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33904998/
negExpression : (NOT^)* primitiveElement ; 是我的规矩。我现在有这个代码: !!(1==1) 我希望我最终会得到这棵树: NOT | NOT
我遇到以下问题,我正在创建一个作为预算副本的表单,但这种类型的预算不包含增值税%,并且商品不会通过会计。 问题如下我创建了一个名为budget.table的模型如下: class TableEleme
我对 Java 相当陌生,但对一般编程不太熟悉。我在 Windows Vista 上使用 Java 1.7.0_07。我正在尝试弄清楚如何使 Swing Timer 定期计时。 我注意到,即使我设置了
我有一个静态站点,它突然显示不规则的标题。这是一个包含大量 JavaScript 的单一页面,包括页面顶部的表格选择。该网站六个月前运行良好。现在,我在 12 个不同的导航选项卡中的一半上看到无法解释
在我参加的 CS 类(class)中,有一个不规则语言的例子: {a^nb^n | n >= 0} 我可以理解它是不规则的,因为没有有限状态自动机/机器可以编写来验证和接受此输入,因为它缺少内存组件。
给定以下高频但稀疏的时间序列: #Sparse Timeseries dti1 = pd.date_range(start=datetime(2015,8,1,9,0,0),periods=10,fr
我有 X、Y、Z 格式的数据,其中所有数据都是一维数组,Z 是坐标 (X,Y) 处的测量幅度。我想将此数据显示为等高线或“imshow”图,其中等高线/颜色代表 Z 值(幅度)。 用于测量和 X 和
这是 Stackoverflow 上的一个递归问题,但给出的解决方案 here仍然不完美。对我来说,屈服仍然是 python 中最复杂的东西之一,所以我不知道如何自己修复它。 当给定函数的任何列表中的
我使用 PHP 5.3.3 在 RHEL 6 服务器上部署了一个 symfony 1.4 项目。我不定期地在 php 错误日志中收到条目,提示找不到 sfProjectConfiguration 并且
我是一名优秀的程序员,十分优秀!