我正在制作2D游戏。
有许多objects
,每个都有宽度,高度以及X和Y坐标。
每个对象都存储在其类array
中:
为了让游戏有效,我需要明确检测两个元素是否占据相同的空间(让我们称之为“collission”),这样
这需要每帧检查一次,每秒60次。
到目前为止,我一直在做的是遍历每个类,然后循环遍历它可以与之交互的每个类。
例如:
foreach (ally_bullets)
{
foreach (enemies)
{
if ( collision detected between enemy and bullet )
{
remove the bullet and the enemy
}
}
}
这很有意义并且有效,但随着游戏变得越来越复杂,这是非常耗费资源的。元素越多,嵌套for循环渲染的时间越长,最终会降低帧速率。即使我试图尽可能少地运行循环。
有什么更好的解决方法然后嵌套for循环?
答案 0 :(得分:1)
一个常见的解决方案是使用Polymorphism,其中有一个基类(在本例中为Object),它由其他类(如Player,Bullet,Enemy等)继承。而不是每个都有一个单独的数组,你将有一个数组(或通常更合适,一个vector)。现在,您只需遍历一个数组,让每个Object执行更新,并针对数组中的每个Object检查其更新。
这种“矢量方式”更新通常设置为Messaging System。现在,只要继承的Object收到消息(例如'hit by bullet'),该对象就会检查它是否关心该消息。如果是,请接受该消息,否则忽略它。
这是(在我看来)处理你想要完成的事情的更好方法,我相信这就是你所要求的。
如果您仍在使用阵列,我将假设您仍然是编程的新手,我将建议您坚持使用现有的。它绝对有效(让你知道如何完成你的项目),当你完成这个并开始学习更高级的东西时,你会看到你做这件事的方法的缺点,以及它的好处)。
如果你确实看到出现了一些延迟,很可能很久就会出现这种交互性检查成为瓶颈的问题。
无论你走到哪里,碰撞检测本身和渲染将成为你的cpu被吃掉的主要区域,只要你的阵列保持在合理的范围内。
编辑: 如果您追求我提到的主题,那么另一件可以帮助您的事情是Observer Pattern,也称为Listener Pattern。