c++ - 为 SDL 渲染器存储预定义层

标签 c++ sdl

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

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);
    ...
};

当渲染器的构造函数被调用时,我为 map 中的每个枚举类型设置一个条目,因此每个层都有自己的纹理(并且 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;

所以,我现在有了我的推荐信:-)

关于c++ - 为 SDL 渲染器存储预定义层,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35117093/

相关文章:

c++ - 如何在C++中使方法更新类的属性

c++ - gcc 中变量模板的错误显式模板特化

c++ - SDL 绘图程序卡住

c++ - 使用 SDL 旋转图像的最佳方法?

c - SDL:无法翻转多个表面

c++ - 具有父类和虚函数的堆栈和队列

c++ - 同一解决方案中不同项目之间的引用(Visual Studio 2012)

c++ - 代码在 CLion 中编译,但不在命令提示符中

c++ - OpenGL 模型在一段时间内呈现良好,然后在随机时间后呈现稀疏

sdl - 编写更好的游戏循环