2012-08-19 39 views
1

基本上我正在嘗試使用C++和SFML2 API製作井字棋遊戲。我在我的主要功能中加載了背景和spritesheet,並獲得了很好的背景。之後我繼續創建一個Tile類,看起來像這樣。C++/SFML2雪碧沒有顯示

Tile.h

#ifndef TILE_H 
#define TILE_H 

#include <SFML\Graphics.hpp> 

enum TileStatus 
{ 
    FREE = 0, 
    CROSS = 1, 
    CIRCLE = 2 
}; 

class Tile 
{ 

private: 

    float xPos, 
      yPos; 

    sf::Sprite tileSprite; 


    int  height, 
      width; 

    TileStatus tileStatus; 

public: 

    //Constructors 
    Tile(); 
    Tile(sf::Texture tileTexture , TileStatus tileStatus , float xPos , float yPos); 

    //Methods 
    sf::Sprite getTileSprite(); 
    void setTileStatus(TileStatus tileStatus); 
    TileStatus getTileStatus(); 
}; 

#endif 

和Tile.cpp

#include "tile.h" 

Tile::Tile() 
{ 
    xPos = 0; 
    yPos = 0; 

    height = 0; 
    width = 0; 

    tileStatus = FREE; 

} 

Tile::Tile(sf::Texture tileTexture , TileStatus tileStatus , float xPos , float yPos) 
{ 
    this->tileStatus = tileStatus; 

    height = 126; 
    width = 126; 

    this->xPos = xPos; 
    this->yPos = yPos; 

    this->tileSprite.setTexture(tileTexture); 
    this->tileSprite.setTextureRect(sf::IntRect(0,0,126,126)); 
    this->tileSprite.setPosition(this->xPos , this->yPos); 

    if(this->tileStatus == FREE) 
    { 
     tileSprite.setTextureRect(sf::IntRect(0,0,126,126)); 
    } 
    else if(this->tileStatus == CROSS) 
    { 
     tileSprite.setTextureRect(sf::IntRect(126,0,126,126)); 
    } 
    else if(this->tileStatus == CIRCLE) 
    { 
     tileSprite.setTextureRect(sf::IntRect(252,0,126,126)); 
    } 
} 

void Tile::setTileStatus(TileStatus tileStatus) 
{ 
    this->tileStatus = tileStatus; 

    if(this->tileStatus == FREE) 
    { 
     tileSprite.setTextureRect(sf::IntRect(0,0,width,height)); 
    } 
    else if(this->tileStatus == CROSS) 
    { 
     tileSprite.setTextureRect(sf::IntRect(126,0,width,height)); 
    } 
    else if(this->tileStatus == CIRCLE) 
    { 
     tileSprite.setTextureRect(sf::IntRect(252,0,width,height)); 
    } 
} 

sf::Sprite Tile::getTileSprite() 
{ 
    return tileSprite; 
} 

TileStatus Tile::getTileStatus() 
{ 
    return this->tileStatus; 
} 

基本上我加載this spritesheet如在我的主要功能的紋理,然後我將其傳遞到瓷磚功能構造函數,然後我可以設置和更改它的子矩形和其他東西。

現在這裏的問題是,即使它編譯沒有任何錯誤的精靈沒有顯示。但是,當我將代碼寫入Tile類時,代之以圖像顯示。任何人都可以告訴我我做錯了什麼?

這裏的main.cpp中

#include <SFML\System.hpp> 
#include <SFML\Graphics.hpp> 
#include <SFML\Window.hpp> 

#include "tile.h" 

int main() 
{ 
    sf::RenderWindow window(sf::VideoMode(800,600,32) , "Tic - Tac - Toe"); 

    // Load background image and display it 
    sf::Texture BackgroundTexture; 
    if(!BackgroundTexture.loadFromFile("background.jpeg")) 
    { 
     return EXIT_FAILURE; 
    } 
    sf::Sprite Background(BackgroundTexture); 
    Background.setTextureRect(sf::IntRect(0,0,800,600)); 
    Background.setPosition(0,0); 

    // Load the spritesheet 
    sf::Texture Spritesheet; 
    if(!Spritesheet.loadFromFile("sprites.png")) 
    { 
     return EXIT_FAILURE; 
    } 


    // Load font and create graphical text 
    sf::Font font; 
    if (!font.loadFromFile("arial.ttf")) 
    { 
     return EXIT_FAILURE; 
    } 
    sf::Text TurnNotification; 

    //limit the framerate to 30FPS 
    window.setFramerateLimit(30); 

    /*********************************************/ 
    //THIS WORKS BUT IT'S NOT WHAT I NEED 
    //sf::Sprite tileSprite; 
    //tileSprite.setTexture(Spritesheet); 
    //tileSprite.setTextureRect(sf::IntRect(126,0,126,126)); 
    //tileSprite.setPosition(126,126); 


    //This doesn't work 
    Tile cTile(Spritesheet, CROSS, 0 , 0); 

    while(window.isOpen()) 
    { 

     window.draw(Background); 
     window.draw(cTile.getTileSprite()); 
     //window.draw(tileSprite); 

     sf::Event event; 
     while(window.pollEvent(event)) 
     { 
      if(event.type == sf::Event::Closed) 
      { 
       window.close(); 
      } 
      if((event.type == sf::Event::KeyPressed) && (sf::Keyboard::Escape)) 
      { 
       window.close(); 
      } 
     } 
     window.display(); 
    } 

    return EXIT_SUCCESS; 
} 

我希望我的代碼是不是太亂。我仍然是一個新手

回答

0

看來,如果您更改您的瓷磚構造函數採取sf::Texture&const sf::Texture&它的工作,也許sf ::紋理具有特殊的複製語義。

+0

感謝您對解決方案的快速反應和巨大的感謝。這是如此簡單,但我從來沒有想過改變參數作爲參考。謝謝!! – MrPlow 2012-08-19 18:58:51

+0

沒問題,玩得開心編程:) – lccarrasco 2012-08-19 19:00:03