Code的游戏地图

时间:2009-03-25 12:16:19

标签: python

这是一个很长的一个,所以你可能想要得到你一直在喝的那杯茶/咖啡;)

我经营一款名为World of Arl的游戏,它是一款类似于风险或外交的回合制战略游戏。每个玩家都有一组城市,军队和诸如此类的东西。问题围绕这些事物的展示。目前,地图是使用背景图像创建的,其中CSS图标位于其上方以代表城市。你可以在这里看到它的样子:WoA Map

地图的背景图片位于此处:Map background并在Omnigraffle中创建。它不是为了绘制地图而设计的,但我绝对没有能力使用Photoshop,这对我的目的很有用。

问题在于我想要执行诸如寻路之类的有趣事情,为此我需要以某种方式将地图存储在代码中。我已经尝试过使用PIL,我已经考虑将其与Blender合并,我试着去“老学校”并从许多旧游戏中创建磁贴,最后我尝试使用SVG。我这样说,所以你可以清楚地看到,这不是因为没有尝试我有这个问题;)

我希望能够将地图布局存储在代码中,并从中创建图像并将其用于路径查找等操作。我正在使用Python,但我怀疑大多数答案都是通用的。其他这样的城市已经存储并且很容易被绘制出来,我想在陆地上存储大陆的布局和特征。

对于寻路,每种类型的地形都有移动成本,当地图仅作为图像存储时,我无法访问给定区域的地形。除了寻路之外,我希望能够知道与游戏相关的各种事物的地形,例如山区城市生产石头。

是否有一个很好的方法可以做到这一点以及我应该在Google使用哪些术语,因为我尝试过的术语都提出了无关的内容(映射在大多数情况下都是完全不同的。)

编辑2: 军队可以放在地图上的任何地方,也可以放在城市的任何地方,但是在水中他们会沉没,淹死并且可能会抱怨(按此顺序)。

在与MSN上的某个人聊天之后,让我了解了非常微小的细节并且对游戏有了更好的理解(由于他正在玩游戏),我发现瓷砖是要走的路但不是我最初想的方式。我把位图放在现在,但也有一个瓦片的数据层,每个瓦片都有一个给定的地形类型,因此可以在它上面进行寻路等,但同时我仍然使用Omnigraffle进行渲染,效果非常好。

我将根据Adam Smith的建议为此编辑。我不知道图表是否相关Xynth但我还没有机会完全研究它们。

我非常感谢那些回答我问题的人,谢谢。

6 个答案:

答案 0 :(得分:5)

我会将代码中的游戏地图存储为graph

每个节点代表一个国家/城市,每个边缘代表邻接。一旦你有了这样的地图,我相信你可以在网上找到很多关于AI(寻路,策略等)的资源。

如果您希望能够以编程方式构建地图图像,请考虑为每个节点添加(x,y)坐标和图像。这样,您可以在给定坐标处显示所有图像,以构建地图视图。

答案 1 :(得分:3)

这里要认识到的关键是你不必只使用一个地图。您可以使用两张地图:

  • 您已经拥有的在屏幕上绘制的那个
  • 未绘制但用于路径查找,碰撞检测等的隐藏地图。

接下来自然的问题是第二张地图来自哪里?很简单,您可以创建自己的工具,可以加载您的第一张地图并显示它。然后,您的工具可以让您在岛屿周围绘制边界,并在您的城市放置标记。这些标记和边界(例如简单多边形)存储为第二个地图,并在您的代码中用于路径查找等。

实际上,您可以让您的工具发出创建图形和多边形的python代码,这样您就不必自己加载任何数据。

我只是告诉你做一个关卡编辑器。这不是很难。您只需要点击一些按钮即可定义要添加的内容。例如如果要添加多边形。然后,如果已切换添加多边形按钮,则每次单击鼠标时都可以将每个鼠标坐标添加到数组中。您可以使用另一个按钮来添加城市,这样每次单击地图时,您都会记录城市的坐标以及可以在文本框中提供的相应名称。

答案 2 :(得分:2)

您将不得不将地图转换为某种抽象表示。网格(十六进制或正方形)或图形为xynth表示。这是你能够将路径寻找算法应用到它的唯一方法。

答案 3 :(得分:1)

IMO,应该首先渲染地图而不是位图。你应该做的是拥有单独的对象,每个对象都清楚地知道它的尺寸,例如一般的Area类和从这个类派生的City,Town等类。您的物品应该包含有关其位置,地形等的所有信息,并且应该进行渲染/绘制等。这样您就可以准确了解一切所在的位置。

另一种选择是保持位图不变,并将这些信息作为数据保存在对象中。通过这样做,对象将没有绘制功能,但是它们将具有其放置等的精确信息。这有点复制数据但是如果你想使用位图选项,我想不出任何其他方式

答案 4 :(得分:1)

如果您只是想做,例如在地图上进行2D点击测试,然后自己存储就可以了。您可以通过以下方式存储信息:

  • 每个岛屿的多边形
  • 将每个岛表示为列表矩形(通常由窗口系统使用)的联合
  • 为每个岛屿创建一个使用唯一纯色的地图的特殊(可能是灰度)位图
  • 更复杂的东西(也许是Omnigiraffe的内部表现形式)

答案 5 :(得分:1)

假设地图是固定的(不是动态创建的),它的“正确”是使用位图作为图形表示 - 你想让它尽可能漂亮。

对于任何与游戏相关的功能,例如寻路或你想要添加的任何花哨的东西,你应该添加足够的数据结构,即使这意味着某些数据是多余的。

E.g。将岛的边界描述为多边形样条(手动或自动从位图创建,由您决定,以及您需要花多少精力来获得所需的功能)。

总结一下:创建匹配您必须解决的问题的数据结构,位图适用于外观,但避免在其上执行路径定义或其他内容。