基本上我正在尝试使用C ++和SFML2 API制作一个tic-tac-toe游戏。我在我的main函数中加载了背景和spritesheet,得到的背景显示得很好。之后我继续创建一个看起来像这样的Tile类。
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;
}
基本上我在我的main函数中加载this spritesheet作为纹理,然后我将它传递给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;
}
我希望我的代码不会太乱。我还是个新手
答案 0 :(得分:0)
似乎如果你改变你的Tile构造函数来使sf::Texture&
或const sf::Texture&
工作,也许sf :: Texture有特殊的复制语义。