为 SDL 渲染器存储预定义层
Store predefined Layers for SDL Renderer
我在这个问题上被困了很长一段时间:
我的代码看起来像那样
enum class LayerType {Foreground, Terrain, Background, Target};
class Texture
{
private:
...
Texture * target;
LayerType targetLayer;
...
public:
...
Texture & getTarget();
void setTarget(Texture & texture);
...
};
class Renderer
{
private:
...
map<GAME::LayerType, Texture> layers;
...
public:
...
void drawTexture(Texture & texture);
...
};
当调用渲染器的构造函数时,我为地图中的每个枚举类型设置了一个条目,因此每个图层都有自己的纹理(并且 targetLayer 设置为 LayerTypeTarget)。这个想法是我不必以正确的顺序绘制所有纹理,而是在正确的目标纹理上。
渲染器的当前功能如下所示。
void Renderer::present()
{
this->setRendererEmptyTarget();
for(map<LayerType, Texture>::reverse_iterator it = this->layers.rbegin(); it != this->layers.rend(); it++)
{
this->drawTexture(it->second);
}
SDL_RenderPresent(this->ren);
}
绘图函数是这样的:
void Renderer::drawTexture(Texture & texture)
{
if(texture.getTargetLayer() != LayerType::Target)
{
this->setRendererTarget(this->layers.find(texture.getTargetLayer())->second);
}
SDL_RenderCopy(this->ren, texture.getTexture(), NULL, NULL);
}
问题是所有纹理都是按照函数调用的顺序绘制的,而不是按照目标纹理的顺序绘制的。我认为问题可能是缺少对目标纹理的引用。
编辑:
左图显示了它的外观,右图显示了它的实际外观:
http://imgur.com/QafTPuT
左图代码:
// s1, s2 are surfaces
// the targetTexture contains the sdl flags for a target texture
Texture targetTexture = Texture(this->renderer, LayerType::Target);
Texture t1 = Texture(this->renderer, s1, LayerType::Menu);
Texture t2 = Texture(this->renderer, s2, LayerType::Terrain);
while(running)
{
this->renderer.setTarget(targetTexture);
this->renderer.drawTexture(t1);
this->renderer.setEmptyTarget();
this->renderer.drawTexture(t2);
this->renderer.present();
}
以及右图的代码:
// s1, s2 are surfaces
Texture t1 = Texture(this->renderer, s1, LayerType::Menu);
Texture t2 = Texture(this->renderer, s2, LayerType::Terrain);
while(running)
{
this->renderer.drawTexture(t1);
this->renderer.drawTexture(t2);
this->renderer.present();
}
我用指针解决了我的问题。我替换了
map<GAME::LayerType, Texture> layers;
和
map<GAME::LayerType, Texture*> layers;
所以,我现在有了参考资料:-)
我在这个问题上被困了很长一段时间: 我的代码看起来像那样
enum class LayerType {Foreground, Terrain, Background, Target};
class Texture
{
private:
...
Texture * target;
LayerType targetLayer;
...
public:
...
Texture & getTarget();
void setTarget(Texture & texture);
...
};
class Renderer
{
private:
...
map<GAME::LayerType, Texture> layers;
...
public:
...
void drawTexture(Texture & texture);
...
};
当调用渲染器的构造函数时,我为地图中的每个枚举类型设置了一个条目,因此每个图层都有自己的纹理(并且 targetLayer 设置为 LayerTypeTarget)。这个想法是我不必以正确的顺序绘制所有纹理,而是在正确的目标纹理上。
渲染器的当前功能如下所示。
void Renderer::present()
{
this->setRendererEmptyTarget();
for(map<LayerType, Texture>::reverse_iterator it = this->layers.rbegin(); it != this->layers.rend(); it++)
{
this->drawTexture(it->second);
}
SDL_RenderPresent(this->ren);
}
绘图函数是这样的:
void Renderer::drawTexture(Texture & texture)
{
if(texture.getTargetLayer() != LayerType::Target)
{
this->setRendererTarget(this->layers.find(texture.getTargetLayer())->second);
}
SDL_RenderCopy(this->ren, texture.getTexture(), NULL, NULL);
}
问题是所有纹理都是按照函数调用的顺序绘制的,而不是按照目标纹理的顺序绘制的。我认为问题可能是缺少对目标纹理的引用。
编辑:
左图显示了它的外观,右图显示了它的实际外观: http://imgur.com/QafTPuT
左图代码:
// s1, s2 are surfaces
// the targetTexture contains the sdl flags for a target texture
Texture targetTexture = Texture(this->renderer, LayerType::Target);
Texture t1 = Texture(this->renderer, s1, LayerType::Menu);
Texture t2 = Texture(this->renderer, s2, LayerType::Terrain);
while(running)
{
this->renderer.setTarget(targetTexture);
this->renderer.drawTexture(t1);
this->renderer.setEmptyTarget();
this->renderer.drawTexture(t2);
this->renderer.present();
}
以及右图的代码:
// s1, s2 are surfaces
Texture t1 = Texture(this->renderer, s1, LayerType::Menu);
Texture t2 = Texture(this->renderer, s2, LayerType::Terrain);
while(running)
{
this->renderer.drawTexture(t1);
this->renderer.drawTexture(t2);
this->renderer.present();
}
我用指针解决了我的问题。我替换了
map<GAME::LayerType, Texture> layers;
和
map<GAME::LayerType, Texture*> layers;
所以,我现在有了参考资料:-)