在基于3d网格的环境中编程电线的最有效方法是什么?

时间:2013-03-29 03:08:43

标签: java performance algorithm

我目前正致力于基于2D网格的沙盒类游戏。从技术上讲,它的3D地图是一个三维数组,网格图块可以放在彼此后面。然而,它以2D呈现。游戏中的所有脚本都需要非常高效,因为我希望将其发布为Android。

游戏将有一个主要的布线机制,允许玩家使用电线将机器连接到电源。我需要一种有效的方法来计算每个电路通过导线连接的所有实体。

我能想到的唯一一种故障安全方式是使用泛洪填充算法从一个点扩散并记录所有连接的对象,但我觉得这对Android应用来说效率太低。

以下是有关游戏结构和电线的一些信息。

  • 游戏是用java编写的。
  • 目前所有对象都是静态的。
  • 每个对象都保存在一个数组中 这反映了物体的位置。相邻物体及其相应物体 可以简单地引用变量来引用x / y值 array。这意味着可以根据需要更新相邻的块。
  • 玩家可以随意放置电线,也可以随意移动 图案。
  • 导线可以在所有x / y / z轴上连接到其他导线和 机械。
  • 某些物体会输出电力而其他物体会使用 功率。

我正在考虑使用wireGroup 包含一组导线的所有连接对象的对象 包括电线本身。每个导线对象都包含 wireGroup ID允许新线(和机器)轻松添加到wireGroup。

我真正需要的是一种在拆除一根电线时检测连接物体的方法。 在放置连接对象时检测它很简单:只需将新线旁边的任何机器添加到相邻导线的wireGroup中的列表中。

拆线时出现问题。由于它们可能是连接两个物体的7或8条独特的导线路径,因此很难找到移除一根导线的效果。

例如:

EG1

您可以在此处看到连接对象不会发生任何更改。

EG2

这里的wireGroup将分为两个wireGroups,一个包含蓝色和底部白色,另一个包含两个白色。

即使有人能够提出仅2D算法,这仍然很棒。

对不起如果我错过了任何重要内容,请告诉我,以便我可以补救。

1 个答案:

答案 0 :(得分:3)

将所有“可连接”点(无论是空的,电源还是机器)视为(断开连接)图中的节点。电线可以连接两个节点。假设每个节点跟踪连接到它的电线,并认为每根电线是两种类型之一:“供电”和“无电源”,其中“供电”电线是向该节点传输电力的电线。每个节点在一对集合中跟踪这些节点。如果节点在“有电”设备中有任何电线,或者它本身是电源,则该节点被“供电”。

所以有趣的问题是,如何处理添加或删除电线:

当线路放置在两个节点之间时,对于两个节点中的每一个,根据另一个节点的“电源”状态,将其置于有电或无电设备中。因此,如果此节点从无动力转为供电,则通过将电线从“无动力”移动到“有电”来走动图形,从而适当地改变节点和电线的状态。

如果有线被移除,请将其从存在的连接线组中移除。如果任一端点节点现在有一组空的“有电”连接,请从该节点走出图表,关闭所有人。

这应该非常有效地处理多个有源输入,只有在状态发生变化时才需要访问多个节点。如果状态在子图中的任何节点发生变化,那么它将改变子图中所有节点。