c++ - 我正在尝试在我的 SFML Platformer 中实现双跳,但它没有按预期方式工作

标签 c++ sfml

我正在尝试在 SFML 中为 C++ 制作平台游戏,但我无法让按钮按下正常工作。尝试双跳不起作用,按住跳跃按钮会使我的角色连续跳跃。非常感谢您的帮助。

#include <SFML/Graphics.hpp>

sf::RenderWindow window(sf::VideoMode(200, 200), "Platformer");
float positionX = 100.0;
float positionY = 175.0;
float velocityX = 0.0;
float velocityY = 0.0;
float gravity = 1.3;
bool onGround = false;
sf::RectangleShape player(sf::Vector2f(5, 5));
sf::RectangleShape block(sf::Vector2f(5, 20));
int jumpCounter = 0;


void MoveLeft()
{
    velocityX = -12;
}

void MoveRight()
{
    velocityX = 12;
}

void StartJump()
{
    if (!onGround && jumpCounter == 0)
    {
        velocityY = -12;
        jumpCounter = 1;
    }
    if(onGround)
    {
        velocityY = -12;
        onGround = false;
        jumpCounter = 1;
    }
}

void EndJump()
{
    if(velocityY > -6)
        velocityY = -6;
}

void Update()
{
    velocityY += gravity/400;
    positionY += velocityY/400;
    positionX += velocityX/400;

    if(positionY > 195.0)
    {
        positionY = 195.0;
        velocityY = 0.0;
        onGround = true;
    }

    if(positionX > 195)
    {
        positionX = 195.0;
    }
    if(positionX < 0)
    {
        positionX = 0;
    }
    player.setPosition(positionX, positionY);
    velocityX = 0.0;
    if (onGround)
        jumpCounter = 0;
}

void Render()
{
    window.clear();
    window.draw(player);
    window.display();
}

int main()
{
    window.setKeyRepeatEnabled(false);
    while (window.isOpen())
    {
        sf::Event event;
        while (window.pollEvent(event));
        Update();
        Render();
        if (event.type == sf::Event::Closed)
            window.close();
        if (sf::Keyboard::isKeyPressed(sf::Keyboard::Up))
            StartJump();
        if (sf::Keyboard::isKeyPressed(sf::Keyboard::Left))
            MoveLeft();
        if (sf::Keyboard::isKeyPressed(sf::Keyboard::Right))
            MoveRight();

    }
    return 0;
}

最佳答案

sf::Keyboard::isKeyPressed() 返回所提供键的当前状态。如果键当前被按下,则为 true,否则为 false

当用户按下向上键时,它通常会在数帧内保持按下状态。在这些帧的每一帧上,您测试是否按下了向上键,并调用了 StartJump()。因此,按一次 UP 会多次调用 StartJump()。这会立即耗尽两次跳跃,因此您实际上无法进行第二次跳跃。

您可能更幸运地听到与按下的 UP 键相对应的 sf::Event。每次完整的按键操作只会有一个这样的事件。

关于c++ - 我正在尝试在我的 SFML Platformer 中实现双跳,但它没有按预期方式工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20928165/

相关文章:

c++ - 尝试将指针与结构一起使用时出错

android - 使用 javah 工具时包含 Android 平台 jar

c++ - 多个小部件的信号和插槽

C++ 冲突问题

c++ - 当我继续按下按键时,SFML pollEvent 正在暂停

c++ - 适用于 Windows 的 Linux mingw32 sfml 交叉编译 - 缺少 dll 文件

c++ - 从速度和方向计算速度

c++ - OpenSSL 编译在测试中失败

c++ - 是什么导致此 Visual Studio Pro 2013 警告?

c++ - 为什么 SFML 窗口在类中时不显示?