簡體   English   中英

C ++ / SFML2 Sprite沒有顯示

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM