可变形物体 SFML 上的笨重动作
Clunky movement on transformable objects SFML
所以我正在使用 SFML 开发一款游戏,但遇到了一个奇怪的移动问题。我已经实现了增量时间,所以移动速度是恒定的,但我有一个奇怪的问题,我按下移动键,对象以 speed 单位跳跃,暂停,然后继续平稳移动。我在这方面找不到太多,因为我真的不知道我应该寻找什么问题。这是我当前代码的副本。
#include <SFML/Graphics.hpp>
#include "Player.h"
#include <iostream>
#include <vector>
void handleKeyPress(sf::Event &event, Player &player, float dt);
int main() {
sf::ContextSettings settings;
settings.antialiasingLevel = 16;
sf::RenderWindow window(sf::VideoMode(800, 600), "Title", sf::Style::Default, settings);
sf::Event event;
Player player;
player.setPosition(100, 100);
sf::Clock dtClock;
while (window.isOpen()) {
float dt = dtClock.getElapsedTime().asSeconds();
while (window.pollEvent(event)) {
if (event.type == sf::Event::Closed) {
window.close();
}
handleKeyPress(event, player, dt);
window.clear(sf::Color::Black);
//drawing happens hear
window.draw(player);
//end of frame
window.display();
dtClock.restart();
}
}
}
void handleKeyPress(sf::Event& event, Player& player, float dt) {
sf::Vector2f moveVector(0.0f, 0.0f);
if (sf::Keyboard::isKeyPressed(sf::Keyboard::A))
moveVector.x = -player.speed;
if (sf::Keyboard::isKeyPressed(sf::Keyboard::D))
moveVector.x = player.speed;
if (sf::Keyboard::isKeyPressed(sf::Keyboard::W))
moveVector.y = -player.speed;
if (sf::Keyboard::isKeyPressed(sf::Keyboard::S))
moveVector.y = player.speed;
player.move(moveVector * dt);
}
请注意,播放器只是一个 SFML 可变形 object/drawable 对象。
您的主要任务是将事件处理和状态更新与绘图混合在一起,这使得很难遵守您打算使用 dt
进行的部分更新。
下面的代码取消了:它首先吃掉所有事件,然后更新游戏状态,然后绘制。
为了流畅的移动,您需要记住播放器速度,具体取决于哪个键 pressed/released:
- 向播放器添加
velocity
矢量
- 更改 handleKeyPress 以适当修改速度。注意多个按键,例如 up + right = (+1, +1)
- 向播放器添加
update
方法,将 velocity
的 dt
分数添加到位置。
改为:
while (window.isOpen()) {
float dt = dtClock.getElapsedTime().asSeconds();
// process events
while (window.pollEvent(event)) {
if (event.type == sf::Event::Closed) {
window.close();
} else if (event.type == sf::Event::KeyPressed || event.type == sf::Event::KeyReleased) {
// rewrite this to update player.velocity depending on what key is pressed if released
handleKeyPress(event, player, dt);
}
}
// apply dt * player.velocity to player.position
player.update(dt);
// draw
window.clear(sf::Color::Black);
//drawing happens hear
window.draw(player);
// restart the dtclock here, as display() will pause for a bit
dtClock.restart();
//end of frame
window.display();
}
所以我正在使用 SFML 开发一款游戏,但遇到了一个奇怪的移动问题。我已经实现了增量时间,所以移动速度是恒定的,但我有一个奇怪的问题,我按下移动键,对象以 speed 单位跳跃,暂停,然后继续平稳移动。我在这方面找不到太多,因为我真的不知道我应该寻找什么问题。这是我当前代码的副本。
#include <SFML/Graphics.hpp>
#include "Player.h"
#include <iostream>
#include <vector>
void handleKeyPress(sf::Event &event, Player &player, float dt);
int main() {
sf::ContextSettings settings;
settings.antialiasingLevel = 16;
sf::RenderWindow window(sf::VideoMode(800, 600), "Title", sf::Style::Default, settings);
sf::Event event;
Player player;
player.setPosition(100, 100);
sf::Clock dtClock;
while (window.isOpen()) {
float dt = dtClock.getElapsedTime().asSeconds();
while (window.pollEvent(event)) {
if (event.type == sf::Event::Closed) {
window.close();
}
handleKeyPress(event, player, dt);
window.clear(sf::Color::Black);
//drawing happens hear
window.draw(player);
//end of frame
window.display();
dtClock.restart();
}
}
}
void handleKeyPress(sf::Event& event, Player& player, float dt) {
sf::Vector2f moveVector(0.0f, 0.0f);
if (sf::Keyboard::isKeyPressed(sf::Keyboard::A))
moveVector.x = -player.speed;
if (sf::Keyboard::isKeyPressed(sf::Keyboard::D))
moveVector.x = player.speed;
if (sf::Keyboard::isKeyPressed(sf::Keyboard::W))
moveVector.y = -player.speed;
if (sf::Keyboard::isKeyPressed(sf::Keyboard::S))
moveVector.y = player.speed;
player.move(moveVector * dt);
}
请注意,播放器只是一个 SFML 可变形 object/drawable 对象。
您的主要任务是将事件处理和状态更新与绘图混合在一起,这使得很难遵守您打算使用 dt
进行的部分更新。
下面的代码取消了:它首先吃掉所有事件,然后更新游戏状态,然后绘制。
为了流畅的移动,您需要记住播放器速度,具体取决于哪个键 pressed/released:
- 向播放器添加
velocity
矢量 - 更改 handleKeyPress 以适当修改速度。注意多个按键,例如 up + right = (+1, +1)
- 向播放器添加
update
方法,将velocity
的dt
分数添加到位置。
改为:
while (window.isOpen()) {
float dt = dtClock.getElapsedTime().asSeconds();
// process events
while (window.pollEvent(event)) {
if (event.type == sf::Event::Closed) {
window.close();
} else if (event.type == sf::Event::KeyPressed || event.type == sf::Event::KeyReleased) {
// rewrite this to update player.velocity depending on what key is pressed if released
handleKeyPress(event, player, dt);
}
}
// apply dt * player.velocity to player.position
player.update(dt);
// draw
window.clear(sf::Color::Black);
//drawing happens hear
window.draw(player);
// restart the dtclock here, as display() will pause for a bit
dtClock.restart();
//end of frame
window.display();
}