纹理没有在屏幕上绘制

Texture not being drawn on Screen

本文关键字:绘制 屏幕 纹理      更新时间:2023-10-16

我试图遵循一个稍微过时的教程,使瓷砖引擎。

问题是,纹理我试图绘制在屏幕上,不显示。我只是黑屏。

我取了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 <SFMLGraphics.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类型,但Image没有Draw()方法,所以我制作了Texture。为什么Texture不能在屏幕上渲染?

问题似乎在:

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>