可变形物体 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 方法,将 velocitydt 分数添加到位置。

改为:

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();
}