[英]C++/SFML2 Sprite is not showing
基本上,我正在嘗試使用C ++和SFML2 API制作井字游戲。 我在主函數中加載了背景和Spritesheet,並且背景顯示得很好。 之后,我繼續創建一個類似於以下內容的Tile類。
平鋪
#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;
}
基本上,我將此 spritesheet作為紋理加載到我的main函數中,然后將其傳遞給Tile函數的構造函數,然后可以設置和更改它的子矩形並執行其他操作。
現在的問題是,即使編譯時沒有任何錯誤,精靈也不會顯示。 但是,當我將代碼(即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;
}
我希望我的代碼不會太混亂。 我還是新手
看來,如果您將Tile構造函數更改為采用sf::Texture&
或const sf::Texture&
可以正常工作,則sf :: Texture可能具有特殊的復制語義。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.