c++ - SFML/C++ Sprite 在特定点后消失

标签 c++ sprite sfml

int main() {
sf::RenderWindow window;

sf::Vector2i centerWindow((sf::VideoMode::getDesktopMode().width / 2) - 445, (sf::VideoMode::getDesktopMode().height / 2) - 480);

window.create(sf::VideoMode(900, 900), "SFML Game", sf::Style::Titlebar | sf::Style::Close);
window.setPosition(centerWindow);

window.setKeyRepeatEnabled(true);

sf::Texture wallTxture;
sf::Sprite wall;
if (!wallTxture.loadFromFile("wall.png")) {
    std::cerr << "Error\n";
}
wall.setTexture(wallTxture);

//Gravity Vars:
int groundHeight = 750;
bool isJumping = false;

//Movement Vars:
bool goingRight = false;
bool goingLeft = false;

//Set View Mode:
sf::View followPlayer;
followPlayer.reset(sf::FloatRect(0, 0, window.getSize().x, window.getSize().y));

Player player("newPlayer.png");
player.setPos({ 800, 800 });

sf::Vector2f position(window.getSize().x / 2, window.getSize().y / 2);

//Main Loop:
while (window.isOpen()) {

    const float moveSpeed = 0.1;

    sf::Event Event;

    if (sf::Keyboard::isKeyPressed(sf::Keyboard::Up)) {
        isJumping = true;
        //Handle Movement While Jumping:
        if (goingLeft == true) {
            player.move({ -moveSpeed, -moveSpeed });
        }
        else if (goingRight == true) {
            player.move({ moveSpeed, -moveSpeed });
        }
        else {
            player.move({ 0, -moveSpeed });
        }
    }
    else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Down)) {
        player.move({ 0, moveSpeed });
    }
    else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Left)) {
        player.move({ -moveSpeed, 0 });
        goingLeft = true;
        player.flipX('l');
    }
    else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Right)) {
        player.move({ moveSpeed, 0 });
        goingRight = true;
        player.flipX('r');
    }

    //Event Loop:
    while (window.pollEvent(Event)) {
        switch (Event.type) {

        case sf::Event::Closed:
            window.close();

        case sf::Event::KeyReleased:
            if (Event.key.code == sf::Keyboard::Up) {
                isJumping = false;
            }
            else if (Event.key.code == sf::Keyboard::Left) {
                goingLeft = false;
            }
            else if (Event.key.code == sf::Keyboard::Right) {
                goingRight = false;
            }
        }

    }

    if (player.getX() > window.getSize().x) {
        position.x = player.getX();
    }
    else {
        position.x = window.getSize().x;
    }

    //If player is in air and not jumping:
    if (player.getY() < groundHeight && isJumping == false) {
        player.move({ 0, moveSpeed });
    }

    followPlayer.setCenter(position);

    window.clear();
    window.setView(followPlayer);
    window.draw(wall);
    player.drawTo(window);
    window.display();
}
}

这是我的代码。我想要做的是创建一个 2D 平台横版游戏。一切正常,除了当 Sprite 超过某个点时它就会消失。当我同时在空中跳跃和移动时也会发生这种情况。我不明白为什么会这样,任何帮助将不胜感激:)

最佳答案

我通过删除 flipX 函数解决了这个问题,而是创建一个面向不同方向的新 Sprite ,然后在每次用户面向新方向时更改它

关于c++ - SFML/C++ Sprite 在特定点后消失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38317674/

相关文章:

CSS Sprite 自动化

ios - Sprite Kit iOS 中的慢动作

c++ - PostThreadMessage 不起作用

c++ - 在 Eclipse 中使用 rake 构建 C++ 项目

c++ - CS高级项目思路涉及Unix系统编程

html - 表 TD 上的 CSS Sprite

c++ - SFML 错误 loadFromFile()

c++ - 如何将窗口分为游戏和积分栏

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

c++ - 这个模型需要互斥量吗?