我正在用SDL编写2D游戏,在这个游戏中,我想创建一个“鸟”类,它将在屏幕上为一只简单的鸟动画。我认为最好的方法是通过一个基类来绘制我想要的东西,然后有子类('鸟'类,'玩家'类,最后是子弹类等)。基类的draw成员函数将调用子类的成员函数来绘制自己(使用基类中的函数),所以首先,这是构建我的游戏的合理方法吗?
其次,当我调用绘图函数,例如我的'bird'类时,函数需要知道动画的哪个帧,并返回适当的图像。每次调用函数时增加帧数是不是更好,或者让函数在一个单独的线程上运行,这样在调用函数的任何时候都会返回正确的帧,但这就意味着我为屏幕上的每个动画精灵都需要一个单独的线程。
我考虑做第二种方法的原因是,在第一种方法中,运行相同程序的不同计算机将以不同的速度运行,因此动画也是如此,因此我唯一的选择是修复数量每秒调用渲染函数的次数。在第二种方法中,帧计数器在一个单独的线程中运行,我可以在允许函数显示下一帧之前设置一个特定的时间延迟,这意味着整个动画的速度完全不受渲染次数的影响函数被调用。
最后一个快速问题 - 对于我的'鸟'课程,如果班级的每个实例都是单独的鸟类,或者有一个控制X许多鸟类的实例,那会更好吗?它有什么不同吗?
答案 0 :(得分:1)
您应该在https://gamedev.stackexchange.com/
上提出这类问题但无论如何要回答你的问题,你可以用很多方法来构建它。对于小游戏,你可能最好使用某种基本的OOP结构,这种结构倾向于组合而不是继承。 (wikipedia entry和an SO question on this topic)。这应该会给你一些灵活性和可重用性,并有助于防止意大利面。
通常,您希望在主线程上进行帧更新。无需在已经具有随机性要素的编码项目中完全消除决定论!虽然跨多个线程执行对象更新并不是闻所未闻,但在您绝对需要它之前,您可能希望这样做。避免使用premature optimization。
您需要研究时序机制并管理FPS&游戏时钟。有一些可访问的简单技术,不需要多线程编程。
另一件需要考虑的事情是,有时游戏体验并不会因为你的编程概念很花哨而变得更加愉快。你可能会发现,当动画和FPS减速与动作不能很好地同步时,玩家会感到沮丧。
有很多与游戏效率相关的变量很难回答这个问题 - 但是现在我不太关心慢速机器而不是我第一次用有趣的机制制作一款很酷的游戏并且足够酷图形和着色器,它在视觉上刺激,而不必感觉我需要与John Carmack竞争。
其次,当我调用绘图功能时,例如我的'bird'类,该函数需要知道动画的哪一帧,并且返回适当的图像。 < / p>
这给我带来了红旗。我可能会假设最糟糕的,但不是掩饰它,让我们谈谈它。在具有少量精灵的“游戏”中,您可能会将单独的图像加载到内存中并根据需要显示它们。但随着时间的推移,随着时间的推移,您可能会匆忙地变得丑陋,并开始向应用程序添加对象。对于您要显示的每个图像,硬件(实现您要定位的任何GL规范的东西)都需要为这些图像保留一些内存。本身并不是一件可怕的事情。这个问题的粘性,瓶颈部分是图形硬件想要实际绘制内容的时候。它必须将硬件中的内存放在一般内存中并将其粘贴在视频内存中。因此,精灵表(或纹理地图集)变得非常有用 - 而不是说“嘿画另一个图像”你只是说“嘿画同一个大图像的不同部分”(而那些不同的“部分”将是框架你的动画;多个动画可以存在于纹理图集中;纹理图集通常以2的幂为大小,这对GPU来说是最佳的。 Side note on powers of 2
GPU编程的神圣规则是,你越少与GPU交谈,她就越爱你。
当然,您需要在管理着色器时对此进行平衡,但是当您进入此时,您可以查看并尝试这些内容。
另一种途径,实际上就像裂缝上的构图一样,是Entity-Based Component System。这允许您向对象添加行为和属性(例如,能够对来自控制器/键盘的输入命令做出反应,或者绘制到屏幕的能力,或者能够获取伤害或修改'健康'或立于不败之地,能够对物理/重力作出反应。)
对于一个小游戏,我建议你不要这样做,除非你把它当作一次大规模的学习练习。但即便如此,将这些概念中的一些概念分解为一口大小的块并一次接近一个游戏可能是一个好主意。
我希望有所帮助,祝你好运。
答案 1 :(得分:0)
一般的经验法则是拥有一组动画容器。
由于对象具有不同的动画规则,您可能希望拥有“动画”功能并传递对象的位置信息(例如框架; x,y和z纵坐标等)。
另一种观点是让对象记住它们的位置。这可以简化帧的编码。框架将告诉所有对象动画,并且对象将改变它们的位置,框架关心它们的位置。