【问题标题】:C++ SFML Sprite not drawing, however no errors occurC++ SFML Sprite 未绘制,但未出现错误
【发布时间】:2015-04-08 07:47:24
【问题描述】:

我一直在尝试在 C++ SFML 中显示精灵,但使用了类。但是,当我编译并运行程序时,什么也没有出现:也没有错误。如果有人愿意在这里帮助我,我很确定这是一个愚蠢的错误。不太确定问题出在哪里,所以我也包含了头文件:

(在 main 中唯一发生的事情是创建了一个“游戏”对象)

Game.h

    #ifndef GAME_H
    #define GAME_H
    #include <SFML/Graphics.hpp>
    #include "Player.h"


    class Game
    {
        public:
            Game();
        private:
            //Variables
            sf::RenderWindow _mainWindow;
            enum _gameState { Playing, Paused, Splash, Menu };

            //Methods
            void gameLoop();
    };

    #endif // GAME_H

Game.cpp

#include "Game.h"
#include "Player.h"

Game::Game() {

    //Variables
    _mainWindow.create(sf::VideoMode(960, 640), "Game", sf::Style::Titlebar | sf::Style::Close);
    _mainWindow.setFramerateLimit(60);

   //Start Game Loop
    gameLoop();

}

void Game::gameLoop() {

    Player player;

    while(_mainWindow.isOpen()) {

        sf::Event ev;
        while(_mainWindow.pollEvent(ev)) {
            if(ev.type == sf::Event::Closed)
                _mainWindow.close();
            if(ev.type == sf::Event::KeyPressed) {
                if(ev.key.code == sf::Keyboard::Escape)
                    _mainWindow.close();
            }
        }


        //Draw Stuff
        _mainWindow.clear(sf::Color::White);
        player.drawSprite(_mainWindow);
        _mainWindow.display();

    }

}

Player.h

#ifndef PLAYER_H
#define PLAYER_H
#include <SFML/Graphics.hpp>
#include <iostream>


class Player
{
    public:
        Player();
        void drawSprite(sf::RenderWindow& window);
    private:
        bool loadSprite();
        sf::Texture _playerTexture;
        sf::Sprite _playerSprite;
};

#endif // PLAYER_H

Player.cpp

#include "Player.h"
#include "Game.h"


Player::Player()
{
    if(!Player::loadSprite()){
        return;
    }
}

bool Player::loadSprite() {

    sf::Texture _playerTexture;
    if(!_playerTexture.loadFromFile("img/darkguy.png", sf::IntRect(32,32,32,32))) {
        std::cout << "Failed to load player image" << std::endl;
        return false;
    } else {
        sf::Sprite _playerSprite;
        _playerSprite.setTexture(_playerTexture);
    }

    return true;
}

void Player::drawSprite(sf::RenderWindow& window) {

    //sprite.setTextureRect(sf::IntRect(10, 10, 32, 32));
    window.draw(_playerSprite);
    std::cout << "Sprite Drawn Successfully" << std::endl;

}

很抱歉,我在编程方面有点初学者,这是我在 stackoverflow 上的第一篇文章。另外,如果有人发现任何更有效的方法在这里做某事,请随时指出:)

提前致谢:P

【问题讨论】:

  • Player 构造函数中的if 没有用,只需调用loadSprite 而不使用if

标签: c++ class sfml


【解决方案1】:

您在这里声明一个新的本地 _playerSprite:

} else {
    sf::Sprite _playerSprite;
    _playerSprite.setTexture(_playerTexture);
}

改为使用现有的类成员:

} else {
    _playerSprite.setTexture(_playerTexture);
}

你可能也想从这段代码中删除第一行,同样的问题:

bool Player::loadSprite() 
{
    sf::Texture _playerTexture; // <--- local redeclaration

【讨论】:

  • 感谢您发现这个错误,但仍然没有显示精灵 - 有什么猜测吗?编辑:谢谢,更改纹理后它可以工作 - 非常感谢:P
【解决方案2】:

从我的记忆中:纹理必须是你班级的成员;在您使用它时它必须存在。在您的代码中,_playerTexture 在 loadSprite() 结束时被销毁。 _playerSprite 也有同样的问题。


编辑:

你不必在你的方法中重新声明你的类的成员:

bool Player::loadSprite() {
    sf::Texture _playerTexture;
    if(!_playerTexture.loadFromFile("img/darkguy.png", sf::IntRect(32,32,32,32))) {
        std::cout << "Failed to load player image" << std::endl;
        return false;
    } else {
        sf::Sprite _playerSprite;
        _playerSprite.setTexture(_playerTexture);
    }
    return true;
}

应该是:

bool Player::loadSprite() {
    if(!_playerTexture.loadFromFile("img/darkguy.png", sf::IntRect(32,32,32,32))) {
        std::cout << "Failed to load player image" << std::endl;
        return false;
    } else {
        _playerSprite.setTexture(_playerTexture);
    }
    return true;
}

(PS:您的代码不遵守SRP(单一责任原则),播放器不必显示自己。)

【讨论】:

  • 我觉得我必须注意:SRP 是一个定义问题。如果你觉得你必须有一个观点来渲染一切,那么这就是一种观点。但是,如果您认为每个类都应该将自己呈现为在该类中保留与该类相关的所有内容,那么这是另一种观点。我确实同意,尽管这里的操作做了一些不敏感的事情。
猜你喜欢
  • 1970-01-01
  • 2013-09-09
  • 2014-03-16
  • 2013-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多