2015-02-08 49 views
1

我一直在嘗試在C++ SFML中做一個精靈顯示,但使用類。但是,當我編譯並運行該程序時,沒有出現任何內容:也沒有錯誤。如果有人願意在這裏幫助我,我肯定這是一個愚蠢的錯誤。真的不知道其中的問題所在,所以我已經包含頭文件太:C++ SFML雪碧沒有繪製,但沒有發生錯誤

(即發生在主要的唯一事情是一個「遊戲」對象被創建)

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; 

} 

對不起,文字的牆,我有點在編程初學者的,這是我的第一篇文章在這裏的計算器。此外,如果任何人察覺任何更有效的方式做的東西在這裏隨時指出來:)

在此先感謝:P

+0

你的'Player'構造函數中的'if'是無用的,只需調用'loadSprite'而不用'if' – emlai 2015-02-08 14:33:16

回答

3

您在這裏宣佈一個新的,局部_playerSprite:

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

而是使用現有的類成員:

} else { 
    _playerSprite.setTexture(_playerTexture); 
} 

您可能要放棄從這個第一行代碼爲好,同樣的問題:

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

感謝您發現錯誤,但仍然沒有精靈顯示 - 任何猜測?編輯:謝謝,改變了它的紋理後 - 非常感謝:P – TheInfernalCow 2015-02-08 14:36:56

1

從我的記憶中:紋理必須是你班上的一員;它在使用它時必須存在。在你的代碼中,_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(單一責任原則),Player doe )

+0

我覺得我必須注意:SRP是一個定義的問題。如果你覺得你必須有一個能夠渲染一切的點,那麼這就是一個觀點。但是如果你覺得每個班級都應該讓自己保持與班上這個班級有關的一切,那麼這就是另一個觀點。我同意,雖然這裏做了一些不敏感的事情。 – Kiruse 2017-08-02 23:48:30