【问题标题】:SFML not displaying spriteSFML 不显示精灵
【发布时间】:2017-10-27 20:31:44
【问题描述】:

我最近开始使用 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;
}

播放器.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);
}

播放器.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

【问题讨论】:

  • Player 是在哪里创建的?在它的构造函数中,你给它的纹理赋值,我看不到它在哪里被调用。

标签: c++ sfml


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    nvoigt 完全正确。

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

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

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

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

    【讨论】:

      【解决方案3】:

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

      此外,为什么您的课程Player 没有从sf::Sprite 扩展?我认为在这种情况下继承会更适合这种组合。

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

      【讨论】:

      • 这个答案的大部分只是问题和你对如何改变它的看法(应该是 cmets 而不是答案),它真的没有回答问题或解决问题。跨度>
      猜你喜欢
      • 2013-02-25
      • 1970-01-01
      • 2017-05-19
      • 2012-05-09
      • 2018-03-05
      • 2017-07-18
      • 2019-03-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多