SFML 不显示精灵

SFML not displaying sprite

我最近开始使用 sfml,但我无法解决这个问题。我有两个 类 应该可以工作并显示我的精灵,但屏幕上没有任何显示。我已经尝试了一些方法,但是 none 到目前为止它们都有效,这就是为什么我决定在这里问:/

感谢您的帮助,我们也将不胜感激 ;)

Main.cpp:

#include <SFML\Graphics.hpp>
#include "Player.hpp"

sf::RenderWindow frame;
sf::Texture player_texture;
Player player(player_texture, 100, 100);
bool quit;

bool handle_events() {
    sf::Event event;
    if (frame.pollEvent(event)) {
        if (event.type == sf::Event::Closed) {
            return true;
        }
    }
    return false;
}

void update() {

}

void render() {
    frame.clear(sf::Color(127, 142, 123));
    player.draw_player(frame);
    frame.display();
}

void run() {
    while (quit != true) {
        quit = handle_events();
        update();
        render();
    }
}

int main() {
    player_texture.loadFromFile("player.png");
    frame.create(sf::VideoMode(800, 600), "frame");

    run();

    return 0;
}

Player.cpp:

#include "Player.hpp"

Player::Player(sf::Texture & player_texture, int pos_x, int pos_y) {
    player_sprite.setTexture(player_texture);
    player_sprite.setPosition(pos_x, pos_y);
    player_sprite.scale(4, 4);
}

void Player::draw_player(sf::RenderWindow & frame) {
    frame.draw(player_sprite);
}

Player.hpp:

#ifndef Player_hpp
#define Player_hpp

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

class Player
{
private:
    sf::Sprite player_sprite;
public:
    Player::Player(sf::Texture & player_texture, int pos_x, int pos_y);
    void Player::draw_player(sf::RenderWindow & frame);
};

#endif

您确定纹理加载正确吗?检查 sf::Texture::loadFromFile 的 return 值进行测试。

此外,为什么你的 class Player 没有从 sf::Sprite 延伸?我认为在这种情况下,继承更适合组合。

另外,在你的函数handle_events中,当用户想要关闭window时,你可以直接调用方法RenderWindow::close。然后,在您的函数 运行 中调用 RenderWindow::isOpen 以检查您的应用是否可以继续。它会比这个丑陋的未初始化退出变量更干净。

您的玩家精灵已使用空纹理进行初始化。然后你将另一张图片加载到纹理中,而玩家精灵并不知道这一点。精灵在纹理上所做的所有计算(例如大小)现在都无效。

确保在将纹理传递给精灵之前加载纹理。之后不要更改它。

nvoigt 完全正确。

首先设置精灵的纹理(在播放器构造函数中)然后加载它(在主函数中):

...
player_sprite.setTexture(player_texture);
...
player_texture.loadFromFile("player.png");
...

您要么必须在加载后在 main 函数中使用 .setTexture 重新加载纹理。或者你必须完成重组你的代码。

顺便说一句,这 if (frame.pollEvent(event)) 不是个好主意。 帧中可能触发了多个事件,例如鼠标移动和 window 之后关闭。使用 if 您将只处理此帧中的第一个事件,即鼠标移动,即使您正在寻找第二个事件。所以你应该用一段时间 (while (frame.pollEvent(event))) 来确保所有事件都得到处理。