SFML.Код не выполняется, но он должен на 100% - PullRequest
0 голосов
/ 07 июля 2019

Я пытаюсь реализовать механику прыжков, чтобы у меня было 2 состояния: падение и прыжок. Я кодирую это так, что если он не прыгает, а падает, и наоборот, bool переключается, когда игрок находится на пике прыжка, и тот, когда jumpSpedDecrease> 0.299f, в коде вы можете видеть, что в том операторе if theres cout говорится «Этот код должен работать». Когда я запускаю программу, я вижу это в коде, но значения, которые я там изменяю, остаются такими же, но это, очевидно, должно измениться.

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

1 Ответ

3 голосов
/ 07 июля 2019

Пересмотрите эти строки:

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), тем самым не модифицируя поля класса.Например, для параметра fallSpeed ​​(поле класса) здесь установлено значение 0:

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

не устанавливается обратно в 1, когда прыжок заканчивается.И вы используете это поле в методе fall ().Я предлагаю сначала удалить спецификаторы типа с плавающей точкой (внутри оператора if (jumpSpedDecrease> 0.299f) {}).

...