Basically i’m trying to make a tic-tac-toe game using C++ and SFML2 API. I loaded the background and the spritesheet in my main function and got the background to show just fine. Afterwards i went on to create a Tile class which looks like this.
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
and 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;
}
Basically i loaded this spritesheet as a texture in my main function and then i pass it to the Tile functions constructor and then i can set and change it’s sub-rectangles and do other stuff.
Now the issue here is that even though it compiles without any errors the sprite is not showing. However when i write the code ,that is in the Tile class, into the main class instead the image shows. Can anyone tell me what i’m doing wrong?
Here’s the 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;
}
I hope my code is not too much of a mess. I’m still a newbie
It seems that if you change your Tile constructor to take a
sf::Texture&or aconst sf::Texture&it works, maybe sf::Texture has special copy semantics.