0

Tile Engine の作成に関する少し古いチュートリアルに従おうとしています。

問題は、画面に描画しようとしているテクスチャが表示されないことです。黒い画面が表示されます。

Engine.cpp の最も関連性の高い部分を取り上げました。

bool Engine::Init()
{
    LoadTextures();
    window = new sf::RenderWindow(sf::VideoMode(800,600,32), "RPG");
    if(!window)
        return false;

    return true;
}

void Engine::LoadTextures()
{
    sf::Texture sprite;
    sprite.loadFromFile("C:\\Users\\Vipar\\Pictures\\sprite1.png");
    textureManager.AddTexture(sprite);
    testTile = new Tile(textureManager.GetTexture(0));
}

void Engine::RenderFrame()
{
    window->clear();
    testTile->Draw(0,0,window);
    window->display();
}

void Engine::MainLoop()
{
    //Loop until our window is closed
    while(window->isOpen())
    {
        ProcessInput();
        Update();
        RenderFrame();
    }
}

void Engine::Go()
{
    if(!Init())
        throw "Could not initialize Engine";
    MainLoop();
}

そして、ここに TextureManager.cpp があります

#include "TextureManager.h"
#include <vector>
#include <SFML\Graphics.hpp>

TextureManager::TextureManager()
{

}

TextureManager::~TextureManager()
{

}

void TextureManager::AddTexture(sf::Texture& texture)
{
    textureList.push_back(texture);
}

sf::Texture& TextureManager::GetTexture(int index)
{
    return textureList[index];
}

チュートリアル自体ではImage型を使っていましたが、Draw()メソッドがなかったImageので代わりに作りTextureました。Texture画面にレンダリングされないのはなぜですか?

4

1 に答える 1

1

問題は次のようです。

void Engine::LoadTextures()
{
    sf::Texture sprite;
    sprite.loadFromFile("C:\\Users\\Vipar\\Pictures\\sprite1.png");
    textureManager.AddTexture(sprite);
    testTile = new Tile(textureManager.GetTexture(0));
}

ローカルを作成し、sf::Textureそれを に渡しTextureManager::AddTextureます。おそらく関数の最後で範囲外になり、描画しようとすると有効ではなくなります。これを修正するには、スマート ポインターを使用します。

void Engine::LoadTextures()
{
    textureManager.AddTexture(std::shared_ptr<sf::Texture>(
        new sf::Texture("C:\\Users\\Vipar\\Pictures\\sprite1.png")));

    testTile = new Tile(textureManager.GetTexture(0));
}

そしてTextureManagerそれを使用するように変更します:

void TextureManager::AddTexture(std::shared_ptr<sf::Texture> texture)
{
    textureList.push_back(texture);
}

sf::Texture& TextureManager::GetTexture(int index)
{
    return *textureList[index];
}

もちろん、あなたも変わるtextureList必要がありstd::vector<std::shared_ptr<sf::Texture>ます。

于 2013-05-23T16:33:09.113 に答える