【问题标题】:Store predefined Layers for SDL Renderer为 SDL 渲染器存储预定义层
【发布时间】:2016-02-06 01:52:24
【问题描述】:

我在这个问题上被困了很长时间: 我的代码看起来像这样

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&lt;GAME::LayerType, Texture&gt; layers 中最多存储一个LayerType,因此每个LayerType 只有一个Texture。我想你想要每个图层类型有多个纹理,不是吗?所以也许你想要一个std::map&lt;LayerType, std::vector&lt;Texture&gt;&gt; 或类似的东西。
  • 存储在此地图中的图层是目标(前景、背景等),因此当调用drawTexture方法时,渲染器目标设置为此纹理目标。事实上,纹理会被绘制到另一个纹理上。

标签: c++ sdl


【解决方案1】:

我用指针解决了我的问题。我换了

map<GAME::LayerType, Texture> layers;

map<GAME::LayerType, Texture*> layers;

所以,我现在有了我的参考资料 :-)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-06
    • 1970-01-01
    • 2017-06-09
    • 2013-06-06
    • 2019-07-08
    • 2016-10-28
    • 1970-01-01
    相关资源
    最近更新 更多