SFML不显示精灵

时间:2017-10-27 20:31:44

标签: c++ sfml

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

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

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

3 个答案:

答案 0 :(得分:1)

您的播放器精灵初始化为空纹理。然后你将另一张图片加载到纹理中,玩家精灵不知道这一点。精灵对纹理所做的所有计算(例如大小)现在都无效。

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

答案 1 :(得分:0)

你确定纹理是否正确加载?检查sf::Texture::loadFromFile的返回值以进行测试。

更重要的是,为什么您的课程Player不会延伸到sf::Sprite?我认为在这种情况下,继承会更合适于组合。

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

答案 2 :(得分:0)

nvoigt是完全正确的。

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

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

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

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