C ++ / SFML Sprite未显示

时间:2012-08-19 18:19:43

标签: c++ sprite sfml

基本上我正在尝试使用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;
}

我希望我的代码不会太乱。我还是个新手

1 个答案:

答案 0 :(得分:0)

似乎如果你改变你的Tile构造函数来使sf::Texture&const sf::Texture&工作,也许sf :: Texture有特殊的复制语义。