1

基本上我正在尝试使用 C++ 和 SFML2 API 制作井字游戏。我在我的主要功能中加载了背景和精灵表,并让背景显示得很好。之后我继续创建一个看起来像这样的 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;
}

基本上我将这个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;
}

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

4

1 回答 1

0

似乎如果您将 Tile 构造函数更改为采用 asf::Texture&或 aconst sf::Texture&它可以工作,也许 sf::Texture 具有特殊的复制语义。

于 2012-08-19T18:51:37.473 回答