我在获取sfml rendertexture以正确返回其纹理时遇到问题我相信我已将其缩小到这段代码。我相信这与我试图将rendertexture中的纹理复制到纹理贴图中的方式有关。
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();
}
答案 0 :(得分:0)
为什么你需要sf :: Texture的副本?每个块都有一个纹理副本,想象一下它的1024x1024像素图片,它的大小是1 mb,50 * 50将等于2500 mb的ram,所以对你来说最好的,将存储指向纹理的指针,这样你就可以拥有一个原始纹理,而其他所有纹理将指向它在内存中的地址并使用原始纹理
答案 1 :(得分:0)
只调用RenderTexture的默认构造函数,您将获得
一个空的无效渲染纹理。您必须调用create才能拥有有效的渲染纹理。
请在RenderTexture上调用create
,因为:
在调用此函数之前,渲染纹理处于无效状态,因此在对渲染纹理执行任何操作之前必须先调用它。