SFML中的程序纹理

时间:2013-06-25 17:40:03

标签: c++ textures sfml procedural

我在SFML尝试制作程序纹理时遇到问题我有这个代码

sf::Texture* CreateTexture(int w, int h){
   sf::Image tempImage;
   sf::Texture* Tex = new sf::Texture();
   Tex->create(w,h);
   sf::Uint8 *pixelData = GeneratePNoise(w,h);

   tempImage.create(w, h, pixelData);
   Tex->update(tempImage);
   //Tex->loadFromImage(tempImage);
   return Tex;
}
sf::Uint8* GeneratePNoise(int w,int h){
   std::vector<sf::Uint8> data(w*h*4);

   for (int i=0;i<w*h*4;i++){
     data[i]=128;
     if (i+1%4)data[i]=255;
   }

   return data.data();
}
sf::Texture CreateTexturens(int w, int h){
   sf::Image tempImage;
   sf::Texture Tex;
   Tex.create(w,h);
   sf::Uint8 *pixelData = GeneratePNoise(w,h);

   tempImage.create(w, h, pixelData);
   Tex.update(tempImage);
   return Tex;
}

我也有这段代码使用上面的代码

void Star::createStar(){
   sf::CircleShape star(r,30);
   star.setPosition(x,y);
   sf::Texture* t = CreateTexture(256,256);
   star.setTexture(t,false);
   std::cout << "Done!"<<std::endl;
}

这似乎没有呈现任何东西,我相信这是围绕创建和应用纹理的代码,所有帮助都很感激!

1 个答案:

答案 0 :(得分:2)

在GeneratePNoise()函数中,您将从返回该函数时将要销毁的向量返回data(),因此数据将不再可用。

我建议创建一个unique_ptr并从函数中返回unique_ptr而不是向量,例如:

unique_ptr<sf::Uint8[]> GeneratePNoise(int w, int h) 
{
    unique_ptr<sf::Uint8[]> data(new sf::Uint8[w * h * 4]);

    for (int i = 0; i  < w * h * 4; i++) {
      data[i] = 128;
      if (i + 1 % 4) 
         data[i] = 255;
    }

    return data;
}

在这种情况下,您甚至不需要删除返回的资源。您应该对CreateTexture()函数执行相同的操作。