SFML。代码未执行,但 100% 应该执行

SFML. Code is not executed but it 100% should

我正在尝试实现跳跃机制,所以我有 2 种状态,即坠落和跳跃。我用这种方式编码,如果它不跳它的下落,反之,当玩家选择跳跃时 bool 切换,当 jumpSpedDecrease > 0.299f 时,在代码中你可以看到那个 if 语句中有 cout 说"This code should work"。当我 运行 程序时,我可以在代码中看到这一点,但我在那里更改的值保持不变,但它显然应该改变。

if (isJumping)
    {
        fallingSpeed = 0;
        falSpedIncrease = 0;
        birdSprite.setPosition(pos.x, pos.y - (jumpStartSped - jumpSpedDecrease) * time.asMilliseconds() * jumpingSpeed);
        jumpSpedDecrease += jumpSpedDcrsValue;
        std::cout << " jumpStartSped: " << jumpStartSped << " jumpSpedDecrease: " << jumpSpedDecrease << " jumpSpedDcrsValue: " << jumpSpedDcrsValue << " fallingSpeed: " << fallingSpeed << std::endl;
        if (jumpSpedDecrease > 0.299f) 
        {
            float fallingSpeed = 1;
            float startSped = 0.004f;
            float falSpedIcrsValue = 0.001f;
            float falSpedIncrease = 0;
            float jumpingSpeed = 1;
            float jumpStartSped = 0.3f;
            float jumpSpedDcrsValue = 0.001f;
            float jumpSpedDecrease = 0; 
            std::cout << "This code should work" << std::endl;
        }
        if (jumpSpedDecrease > 0.3f) isJumping = false;`

完整代码在这里:

#include <SFML\Graphics.hpp>
#include <iostream>

using namespace sf;



class Player
{
public:
float fallingSpeed = 1; 
float startSped = 0.004f;
float falSpedIcrsValue = 0.001f;
float falSpedIncrease = 0;
float jumpingSpeed = 1;
float jumpStartSped = 0.3f;
float jumpSpedDcrsValue = 0.001f;
float jumpSpedDecrease = 0;
bool isJumping = false;
Vector2u windowSize;
Time time;
Texture birdTex;
Sprite birdSprite;
void loadingSprite() 
{
    if (!birdTex.loadFromFile("./../Textures/flappyBird.png"))
    {
        std::cerr << "Cannot load texture" << std::endl;
    }
    birdSprite.setTexture(birdTex);
    Vector2u size = birdTex.getSize();
    birdSprite.setOrigin(size.x/2, size.y/2);
    birdSprite.setScale(0.1f, 0.1f);
    birdSprite.setPosition(windowSize.x/2, windowSize.y/2);
}
void falling()
{
    if (!isJumping)
    {
        Vector2f pos = birdSprite.getPosition();
        birdSprite.setPosition(pos.x, pos.y + (startSped + 
falSpedIncrease) * time.asMilliseconds() * fallingSpeed);
        falSpedIncrease += falSpedIcrsValue;
    }
}
void jump()
{
    Vector2f pos = birdSprite.getPosition();

    if (Keyboard::isKeyPressed(Keyboard::Space)) isJumping = true;

    if (isJumping)
    {
        fallingSpeed = 0;
        falSpedIncrease = 0;
        birdSprite.setPosition(pos.x, pos.y - (jumpStartSped - 
jumpSpedDecrease) * time.asMilliseconds() * jumpingSpeed);
        jumpSpedDecrease += jumpSpedDcrsValue;
        std::cout << " jumpStartSped: " << jumpStartSped << " 
jumpSpedDecrease: " << jumpSpedDecrease << " jumpSpedDcrsValue: " << 
jumpSpedDcrsValue << " fallingSpeed: " << fallingSpeed << std::endl;
        if (jumpSpedDecrease > 0.299f) 
        {
            float fallingSpeed = 1;
            float startSped = 0.004f;
            float falSpedIcrsValue = 0.001f;
            float falSpedIncrease = 0;
            float jumpingSpeed = 1;
            float jumpStartSped = 0.3f;
            float jumpSpedDcrsValue = 0.001f;
            float jumpSpedDecrease = 0; 
            std::cout << "This code should work" << std::endl;
        }
        if (jumpSpedDecrease > 0.3f) isJumping = false;
    }

}
};

int main()
{
Clock clock;
RenderWindow window(VideoMode(600, 600), "Dupako");
window.setFramerateLimit(240);
Player player;
player.windowSize = window.getSize();
player.loadingSprite();

// MAIN LOOP //
while (window.isOpen())
{
    Event event;
    while (window.pollEvent(event)) {
        if (event.type == Event::Closed) window.close();
    }


    Time time = clock.getElapsedTime();
    // MOVEMENT FUNCTIONS START //


    player.time = time;
    player.falling();
    player.jump();


    // MOVEMENT FUNCTIONS END //
    clock.restart().asMilliseconds();

    window.clear();
    /// DRAW ///


    window.draw(player.birdSprite);



    /// DRAW END ///
    window.display();

    // MAIN LOOP END //
}

return 0;
}

重新考虑这些行:

if (jumpSpedDecrease > 0.299f) 
{
    float fallingSpeed = 1;
    float startSped = 0.004f;
    float falSpedIcrsValue = 0.001f;
    float falSpedIncrease = 0;
    float jumpingSpeed = 1;
    float jumpStartSped = 0.3f;
    float jumpSpedDcrsValue = 0.001f;
    float jumpSpedDecrease = 0; 
    std::cout << "This code should work" << std::endl;
}
if (jumpSpedDecrease > 0.3f) isJumping = false;

这里你只是创建了一些局部变量(例如 float jumpSpedDecrease = 0),因此没有修改 class 字段。例如这里的fallingSpeed(class字段)设置为0:

if (isJumping)
{
    fallingSpeed = 0;
    falSpedIncrease = 0;

未设置回1,跳转结束时。你在 falling() 方法中使用这个字段。我建议首先删除 float 类型说明符(在 if (jumpSpedDecrease > 0.299f) {} 语句内)。