SFML rendertexture не возвращает текстуру

У меня возникла проблема с получением текстуры рендеринга sfml для правильного возврата текстуры. Я считаю, что сузил ее до этого фрагмента кода. Я считаю, что это как-то связано с тем, как я пытаюсь скопировать текстуру в текстуре рендеринга в карту текстур.

renderedchunks будет частным, я просто сделал его общедоступным для быстрого тестирования функции.

Вот заголовочный файл

#ifndef TILE_MAP_H
#define TILE_MAP_H
#include "SFML/Graphics.hpp"
#include <map>
#include "Chunk.h"
//Class designed to manipulate chunks
//


class Tile_Map
{
public:
    Tile_Map();
    void RenderChunk(Texture_Manager&, int x, int y);
    void CreateChunk(int x, int y); //Eventually will create based on biomes
    std::map<int, std::map<int, sf::Texture> > renderedchunks;



protected:
private:



    std::map<int, std::map<int, Chunk> > chunkmap; //Used to store all created chunks



};

Вот файл cpp

#include "Tile_Map.h"

Tile_Map::Tile_Map()
{
//ctor
}

void Tile_Map::CreateChunk(int x, int y)
{

chunkmap[x][y];
Chunk& chunk = chunkmap[x][y];
chunk.SetBiome("grass");
}

void Tile_Map::RenderChunk(Texture_Manager& tempmanager, int x, int y)
{
sf::RectangleShape drawable[8][8];
sf::RenderTexture drawingtexture;
Chunk& rchunk = chunkmap[x][y];

float renderx = 0;
float rendery = 0;

if(rchunk.GetBiome() == "grass")
{
    for(int it = 0; it < 8; it++)
    {
        for(int it2 = 0; it2 < 8; it2++)
        {
            drawable[it][it2].setTexture(&tempmanager.GetTexture("grass"));
            drawable[it][it2].setPosition(renderx, rendery);
            drawingtexture.draw(drawable[it][it2]);
            std::cout << "x = " << renderx << std::endl;
            renderx += 32;

        }
        renderx = 0;
        std::cout << "y = " << rendery << std::endl;
        rendery += 32;
    }
}
drawingtexture.display();
renderedchunks[x][y] = drawingtexture.getTexture();

}

person Joshua    schedule 19.10.2015    source источник


Ответы (2)


зачем вам копия sf::Texture? Каждый фрагмент будет иметь копию текстуры, представьте, если это изображение размером 1024x1024 пикселей и размером 1 мб, 50 * 50 будет равно 2500 мб оперативной памяти, поэтому лучше всего будет хранить указатель на текстура, поэтому у вас может быть одна исходная текстура, а все остальные будут указывать на ее адрес в памяти и использовать исходную текстуру.

person Nazar Zebrovich    schedule 19.10.2015
comment
в моем классе фрагментов не сохранена текстура. класс tile_map отвечает за создание для него текстуры и ее хранение. будут отображаться только фрагменты вокруг игрока. затем освобождается из памяти, когда его больше нельзя увидеть. - person Joshua; 19.10.2015
comment
Кроме того, не каждый фрагмент будет выглядеть одинаково, в конечном итоге все они будут иметь определенные плитки, основанные на их биоме и биомах окружающего фрагмента. - person Joshua; 19.10.2015
comment
если у вас есть что-то вроде менеджера ресурсов, то вы можете просто выбрать конкретный кусок текстуры, это не проблема, основная идея в том, что ваша исходная текстура будет в этом менеджере ресурсов, а все остальные будут просто ссылками, которые делают ссылку на этой исходной текстуре - person Nazar Zebrovich; 19.10.2015
comment
У меня есть менеджер ресурсов, который возвращает ссылку на текстуру 32*32. Я хотел построить кусок из 8 * 8 из этих 32 * 32 текстур. Затем сохраните его в моем классе менеджера текстур. - person Joshua; 19.10.2015
comment
Texture* getTexture(string name) { return map[name]; } - person Nazar Zebrovich; 19.10.2015
comment
Я уже настроил это в моем классе менеджера текстур, который, как я доказал, работает, поэтому проблема не в этом классе, а в этом. Единственное отличие состоит в том, что класс диспетчера текстур я возвращаю по ссылке, а не по указателю. - person Joshua; 19.10.2015
comment
ссылка возвращает исходный объект, это означает, что вы можете изменить исходный объект, лучше вернуть указатель, он дает копию, а зачем вам матрица или карты? Почему бы вам просто не назначить им позицию в матрице и не сделать единую карту? - person Nazar Zebrovich; 19.10.2015
comment
Это не имеет ничего общего с моим методом проектирования. Я просто пытаюсь понять, почему мой rendertexure не работает - person Joshua; 19.10.2015
comment
может быть, drawingtexture.draw(drawable[it][it2].getTexture()); ? - person Nazar Zebrovich; 19.10.2015
comment
Мне интересно, имеет ли это какое-то отношение к текстуре рендеринга и локальным переменным. например, я на самом деле делаю копию текстуры в rendertexture или просто даю адрес? - person Joshua; 19.10.2015

При вызове только конструктора по умолчанию вашей RenderTexture вы получите

пустая, недопустимая текстура рендеринга. Вы должны вызвать create, чтобы иметь действительную текстуру рендеринга.

Так что вызовите create в вашей RenderTexture, потому что:

Перед вызовом этой функции рендер-текстура находится в недопустимом состоянии, поэтому ее необходимо вызвать, прежде чем что-либо делать с рендер-текстурой.

См. файл справки для RenderTexture.

person nvoigt    schedule 21.10.2015
comment
Я понял это и исправил, но по какой-то причине он все еще не работал. - person Joshua; 21.10.2015