【问题标题】:Clunky movement on transformable objects SFML可变形物体 SFML 上的笨拙运动
【发布时间】:2021-10-21 03:01:20
【问题描述】:

所以我正在开发一款 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 可转换对象/可绘制对象。

【问题讨论】:

    标签: c++ sfml


    【解决方案1】:

    您的主要任务是将事件处理和状态更新与绘图混合在一起,这使得您难以尊重您打算使用 dt 进行的部分更新。 下面的代码取消了这一点:它首先吃掉所有事件,然后更新游戏状态,然后绘制。

    为了平滑移动,您需要根据按下/释放的键来记住播放器速度:

    • velocity 向量添加到播放器
    • 更改 handleKeyPress 以适当地修改速度。注意多个按键,例如向上 + 向右 = (+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();
    }
    

    【讨论】:

      猜你喜欢
      • 2011-10-17
      • 1970-01-01
      • 2011-02-10
      • 1970-01-01
      • 2023-03-05
      • 2019-09-03
      • 1970-01-01
      • 1970-01-01
      • 2014-09-16
      相关资源
      最近更新 更多