创建无缝循环的2D多人游戏关卡?


15

最近出现了有关如何创建可以进行循环关卡设计的2D横向滚动多人游戏的讨论(《星际思考》及其世界如何循环)。

我认为最简单的方法是制作一个带有触发区域的矩形地图,该区域可以将玩家从一侧转移到另一侧。但是,这种方法的明显问题是在地图边缘一次有多个玩家的情况。您不希望只是将玩家传送到彼此面前,而是需要一种在不让其他玩家消失的情况下运送玩家的方法。

为了补充这个想法并解决问题,我提出了以下建议:设置一个触发区域(图像中的红色正方形),玩家可以在其中看到“克隆区域”(绿色正方形)。在这个绿色方块中,来自触发区域另一侧的对象将被复制到其相应的克隆区域(可以通过A和B形状看到)。当玩家到达“克隆区域”的起始边缘时,他们将被传送到地图的另一侧。

图片

在此示例中,玩家2会认为他们正在看玩家1,但是实际上他们会在看到他的克隆,反之亦然。

对于当前的问题,这似乎有些极端和复杂。我现在的问题是要知道此解决方案是否是解决该问题的好方法,还是有解决此问题的更简单方法?


是否允许玩家向后移动到上一个区域?
XiaoChuan Yu 2014年

是的,来回,所以给人一种“环游世界”的效果。类似于星际世界
KenQueso 2014年

2
您是否考虑过让世界变得更大?还是将关卡视为一个大圆圈并将其转换为平坦的2D舞台?
Nzall 2014年

您不能总是将摄像机的位置与被控制的播放器对齐吗?
Ali1S232

Answers:


16

具有所有这些触发器的系统听起来有点太复杂且容易出错。

您可以使用模数包装播放器的位置,例如 playerPositionX = playerPositionX % mapWidth

这样,当播放器到达时playerPosition == mapWidthplayerPosition将重置为0。

该解决方案可以扩展到整个渲染系统。


1
玩家看到位置重置传送离开的玩家会不会出现关闭问题?
KenQueso

您如何将其扩展到渲染系统?
MikaelHögström2014年

您可以将播放器始终放在相机的中央,然后环绕地图。就像是地球文明模式下的地图。另一种方法可能是将玩家的可见部分渲染到地图的两侧。
Exaila

4
@MikaelHögström照常进行渲染,但是靠近右侧边缘的东西必须在左侧(即pos - map_width)进行第二次渲染。
Mario 2014年

1
在代码中要查找“对象在此坐标处”或“对象在什么坐标处”的任何位置,都将其设为xcoord%mapWidth。没有您的代码很难说,但这可能会使它正确呈现。
锡曼

13

规范的解决方案是使用门户。在您的示例中,只有一个级别,除了有一个连接左右两端的门户。

在该门户上移动的所有内容均将其坐标转换为该门户的另一端,因此,如果某个东西在门户中向左移动,它将重新出现在级别的右侧,反之亦然。

您的相机也需要支持门户。如果门户位于摄像机内部,则它必须在门​​户的任一侧渲染关卡的一部分。如果您熟悉无缝平铺图形的图像编辑器,则此处的处理相同。

繁琐的部分是,处理距离或路径的所有内容也都需要支持门户。这包括AI,视线算法,声音衰减等。

门户网站的好处是它非常强大。尽管构建引擎不是“真正的” 3d引擎,但仍使用它来模拟多层级别。一些现代引擎也使用门户来创建非欧几里得空间。Portal和Antichamber是3D中值得注意的例子。


2
如果您收听门户游戏的评论,则通过克隆漏洞可见的门户来实现门户工作的部分方式。(但出于物理原因而不是渲染)
Mooing Duck

6

请记住,您在屏幕上显示的内容和内存中的内容是完全不同的两件事。想象一下,您有一个窗口需要填写有关世界的数据。您从左到右填充窗口。解析数据以填充世界时,如果您到达世界的尽头,只需循环回到数据的开头即可。使用模运算是理想的。记住,您需要为所有步骤执行此操作。弹丸,射线,玩家,物理学;在跨越世界边界时,他们都需要包裹自己的位置。

每个玩家共享数据,但是对数据有自己的看法。根据他们在世界上的位置,他们的窗户填充的位置会有所不同。

这意味着无需创建克隆或传送任何人。本质上,您在通过将角色渲染到彼此的屏幕创建克隆。


3

断开渲染与世界的连接,您可以进行环绕并更正渲染,而无需借助任何克隆或传送工件。

首先,在您的世界中,您有一个固定大小的世界,从0Width。每当对象低于0时,都将其包装到末尾,而将对象过度Width包装,则将其包装到起点。这意味着您世界中的所有逻辑对象始终在范围内0...Width

其次,对于渲染,您将对位置进行模运算。因此,屏幕的左侧是“基本”,右侧是“基本+大小”。因此,您可以在自己的世界中寻找该范围内的任何事物。实际上,您将搜索模数范围,将其映射回0...Width

搜索时的技巧是返回对象相对于Base左侧的位置。这将转换为屏幕的本地坐标,因此渲染器本身不必担心模数,只需要查找即可。

您不需要克隆任何东西,因为每个渲染器仅在一个位置处理对象。

如果您的世界是分段产生的,或使用3D结构,则必须对其进行分段。因此,它不是一个相邻的块,但可以移动以适应此渲染。您不需要很多块,至少2个即可。


1

我认为唯一合理的方法是在对游戏和用户完全透明的基础数据结构中实现包裹的世界。因此,在某些低级别上,您具有一个函数mapCoordinate(),它将实际坐标包装到您的基础地图资源中...

因此,如果您的实际世界只有10个单位宽,那么玩家和游戏将不会知道。对于玩家而言,世界是无限的-如果游戏询问位置15处的内容-基础功能将转换此请求,取模10,并将物品包装在位置5。

因此,对于整个游戏逻辑和其他所有事物,就像您拥有一个无限的大世界,那里恰好是所有事物的副本。


1

不太一样,但是我在游戏中遇到了类似的情况。游戏中,玩家在一个小的圆形水平上移动,当玩家到达pi的“ x”位置时,它们被包裹起来。渲染很容易,因为我们只渲染了所有内容,然后旋转了胶印机以跟踪发生了什么。您可以实现类似的建议,如上面建议的那样:

  • 绘制时,请考虑相机位置及其视野,检查相机位置并确定需要绘制的内容。
  • 如果摄像机看到了地图的“边缘”,请从世界的另一端选择适当数量的内容在该边缘上绘制,通常只需在其位置上增加或减去水准仪的宽度即可。
  • 游戏逻辑需要了解这一接缝并按照其他答案中的说明进行调整。要注意的特殊情况是一个物体在一侧但与另一物体碰撞的碰撞。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.