2015-10-19 33 views
1

我有一个问题得到sfml rendertexture正确地返回它的纹理我相信我已经缩小到这一点的代码。我相信这与我试图将rendertexture中的纹理复制到纹理贴图的方式有关。SFML 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

为什么你需要SF ::纹理的副本?每个块都有一个纹理的副本,想象一下如果它是1024x1024的px图片,它的大小是1 mb,50 * 50将等于2500 mb的RAM,所以对你来说最好的办法是将指针存储到质地,让你可以有一个原有的质感和所有其他将指向它的地址在内存中,使用原有的质感

+0

我的块类没有存储纹理。 tile_map类负责为它创建纹理并存储它。只有玩家周围的区块才会被渲染。然后在不能再被看见时从记忆中释放出来。 – Joshua

+0

也不是每个块看起来都一样,它们最终都会根据它们的生物群落和周围块的生物群落拥有特定的瓷砖 – Joshua

+0

如果您有类似资源管理器的东西,那么您可以选择特定的块纹理,它不是问题,主要想法是,你的原始纹理将在该资源管理器中,其他所有将只是引用,对原始纹理做参考 –

0

一个名为您的渲染纹理的只有默认的构造函数,你会得到

一空,无效的渲染纹理。您必须调用create才能获得有效的渲染纹理。

于是呼create您渲染纹理,这是因为:

之前调用此函数,渲染纹理处于无效状态,因此它是强制性与render-做任何事情之前调用它质地。

请参阅the help file for RenderTexture

+0

我认识到并修复了它,但由于某些原因,它仍然无法正常工作。 – Joshua