【问题标题】:SFML/C++ Sprite Disappearing After Certain PointSFML/C++ 精灵在某个点后消失
【发布时间】:2016-07-11 23:18:36
【问题描述】:
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 平台游戏横向卷轴。一切正常,除了当精灵超过某个点时它会消失。当我同时在空中跳跃和移动时也会发生这种情况。我不知道为什么会这样,任何帮助将不胜感激:)

【问题讨论】:

  • 它总是有用的: 1. 为 SO 正确格式化代码(您可以使用代码按钮将所有代码向右移动 4 个空格)。 2. 解释代码在做什么。 3. 由于您的问题与精灵有关,因此屏幕截图将非常有用。
  • 我的代码是创建一个玩家,然后摄像机在玩家移动时跟随玩家,然后在某个点之后玩家由于某种原因消失了。我在这里拍了一小段视频:youtube.com/watch?v=YrDB7uwItIY&feature=youtu.be
  • 我找到了问题,很好。由于某种原因,当我包含为我的播放器类创建的 flipX 函数时,会发生此错误。所以现在我有一个新问题;为什么这个函数会导致这个问题:

标签: c++ sprite sfml


【解决方案1】:

我解决了这个问题,只是去掉了我的 FlipX 函数,而是创建了一个面向不同方向的新精灵,然后在每次用户面向新方向时更改它

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-08
    • 1970-01-01
    • 2017-05-19
    • 2012-05-09
    相关资源
    最近更新 更多