避免在2D游戏引擎

时间:2018-05-18 19:48:15

标签: algorithm loops game-engine

我正在制作2D游戏。

有许多objects,每个都有宽度,高度以及X和Y坐标。

每个对象都存储在其类array中:

  • 播放器
  • 同盟
  • 敌人
  • 障碍
  • power ups
  • 敌人射击的子弹
  • 玩家射击的子弹&同盟

为了让游戏有效,我需要明确检测两个元素是否占据相同的空间(让我们称之为“collission”),这样

  • 玩家可以收集电源
  • 没有人可以通过障碍
  • 盟友可以射击敌人
  • 敌人可以射击盟友
  • 友好之火可以启用或禁用

这需要每帧检查一次,每秒60次。

到目前为止,我一直在做的是遍历每个类,然后循环遍历它可以与之交互的每个类。

例如:

foreach (ally_bullets)
{
    foreach (enemies)
    {
        if ( collision detected between enemy and bullet )
        {
            remove the bullet and the enemy
        }
    }
}

这很有意义并且有效,但随着游戏变得越来越复杂,这是非常耗费资源的。元素越多,嵌套for循环渲染的时间越长,最终会降低帧速率。即使我试图尽可能少地运行循环。

有什么更好的解决方法然后嵌套for循环?

1 个答案:

答案 0 :(得分:1)

一个常见的解决方案是使用Polymorphism,其中有一个基类(在本例中为Object),它由其他类(如Player,Bullet,Enemy等)继承。而不是每个都有一个单独的数组,你将有一个数组(或通常更合适,一个vector)。现在,您只需遍历一个数组,让每个Object执行更新,并针对数组中的每个Object检查其更新。

这种“矢量方式”更新通常设置为Messaging System。现在,只要继承的Object收到消息(例如'hit by bullet'),该对象就会检查它是否关心该消息。如果是,请接受该消息,否则忽略它。

这是(在我看来)处理你想要完成的事情的更好方法,我相信这就是你所要求的。

如果您仍在使用阵列,我将假设您仍然是编程的新手,我将建议您坚持使用现有的。它绝对有效(让你知道如何完成你的项目),当你完成这个并开始学习更高级的东西时,你会看到你做这件事的方法的缺点,以及它的好处)。

如果你确实看到出现了一些延迟,很可能很久就会出现这种交互性检查成为瓶颈的问题。

无论你走到哪里,碰撞检测本身和渲染将成为你的cpu被吃掉的主要区域,只要你的阵列保持在合理的范围内。

编辑:     如果您追求我提到的主题,那么另一件可以帮助您的事情是Observer Pattern,也称为Listener Pattern