我不知道如何使用SDL2管理我的课程结构

时间:2016-07-07 06:57:36

标签: c++ sdl-2 roguelike

我尝试使用SDL-2创建一些C ++“流氓式”游戏。为此,我按照Lazy foo的教程了解了如何使用SDL。

我已经学习了3年的C ++ / C#,但现在我学习了项目管理,没有更多的IT课程......

以下是代码的github:https://github.com/Paingouin/Roguelike-SDL2-train/tree/master/

我创建了2个类:sudo chmod 777 -R /opt/lampp/htdocs/ 来帮助管理图片的加载和渲染,LTexture来管理动画/缩放和图片的定位......

现在,我想创建一个由Glyph对象组成的实体类,我将用它来代表墙,怪物,物品......但是,我想如果我这样做,我会使用太多记忆...

也许我应该通过初始化Glyph的指针数组来使用聚合,并将它与我的实体对象相关联......我不知道,我迷失了......

你能帮帮我吗?并且,有任何提示或建议可以帮助我正确构建吗?

1 个答案:

答案 0 :(得分:0)

实际上您的问题可以在不直接向SDL提出的情况下得到解答,任何库(如sfml)都可能出现同样的问题,解决方案大致相同: 答案是单身设计模式 既然你的纹理为什么我说单身? 让我们谈谈墙砖。你可能有数千甚至更多的墙砖 所有都具有相同的纹理,你真的想加载每个墙壁的时间和时间吗?没有。它是相同的纹理,你想拥有每个给定纹理的一个实例,甚至更多:如果你使用包含一切的精灵表或者让我们使用sprite表,你可以节省资源的工作量说3张:这里是sfml中的一个例子,尽管SDL中的想法应该是相同的。 https://en.wikipedia.org/wiki/Singleton_pattern

这是一个sfml实现,但它背后的想法应该清晰易懂:

class Resources {
 sf::Clock m_clock; //holds clock
 sf::Texture m_soma,m_lvl,m_enemies; //holds hero,lvl &enemies textures respectively
 sf::Font m_font; //holds game font
 Resources();
public:

 ~Resources() {}
 Resources(const Resources &) = delete;
 Resources& operator=(const Resources &) = delete;


 static Resources& instance();
 sf::Texture& texture();
 sf::Texture& lvlTexture();
 sf::Texture& Enemies();
 sf::Clock& clock();
 sf::Font & Font();
};

cpp文件:注意我可以使用向量而不是3个纹理

Resources::Resources()
{
  //loading textures(hero,lvls,enemies)
   if (!m_soma.loadFromFile("..\\resources\\sprites\\soma.png"))
   {
       std::cerr << "problem loading texture\n";
       throw ResourceExceptions("couldn't load player sprites!: must have    ..\\resources\\sprites\\soma.png");
   }

   if (!m_lvl.loadFromFile("..\\resources\\sprites\\lv.png"))
   {
    std::cerr << "problem loading texture\n";
    throw ResourceExceptions("couldn't load level sprites!: must have ..\\resources\\sprites\\lv.png");
   }

   if (!m_enemies.loadFromFile("..\\resources\\sprites\\enemies.png"))
   {
       std::cerr << "problem loading texture\n";
       throw ResourceExceptions("couldn't load enemies sprites!: must have ..\\resources\\sprites\\enemies.png");
   }
 //loading font once
   if (!m_font.loadFromFile("..\\resources\\font\\gothic.otf"))
   {
       std::cerr << "problem loading font\n";
       throw ResourceExceptions("couldn't load game Font: must have ..\\resources\\font\\gothic.otf");
   }

 }

 Resources & Resources::instance()
 {
    static Resources resource;
    return resource;
 }

sf::Texture & Resources::texture()
{
    return m_soma;
}

sf::Texture & Resources::lvlTexture()
{
     return m_lvl;
}

sf::Texture & Resources::Enemies()
{
     return m_enemies;
}

sf::Clock & Resources::clock()
{
    return m_clock;
}

sf::Font & Resources::Font()
{
  return m_font;
}

例如。用法是:     m_sprite.setTexture(资源::实例()织构());

// ---------------------------------------

同样的想法可以应用于任何地方,甚至更多,如果有机会你处理3d对象并将渲染那些你会发现单身在那里甚至不够的你可以参考到#34; flyweight&#34;设计模式 总的来说,我建议你阅读两件事: gameprogrammingpatterns.com 和传奇的书:设计模式:可重用的面向对象软件的元素

您的代码中存在多个代码问题: 例如。开关箱运动。问自己这个&#34;如果我突然想要添加一个额外的动作会发生什么?&#34; &#34;如果是例如。我希望它根据之前的动作表现得与众不同吗?&#34;您的方法将带您进行广泛和长期的切换案例。两者都将向您展示允许您更轻松地更改代码的方法