使用 libtcod 在 Python 中创建/导入自定义映射



我一直在使用Libtcod在Python中创建Roguelike!

然而,我面临的主要障碍之一是我完全不知道如何制作自定义地图(例如,我定义单元格以及它们包含哪些元素)或者,如果可能的话 - 如何使用 Libtcod 将自定义地图导入 Python。

截至目前,我正在使用一个定义,该定义基本上在某些模式(房间数量,没有交叉点等)之后渲染地图 - 但我希望这样做,以便我可以导入已经定制的地图 - 或者实际上只是为一个做了定义,所以我可以在给定的某些条件下加载它。

关于

这个主题的任何帮助将不胜感激,谢谢! :)

有许多

有趣的方法可以将地图数据导入到程序中。

通常,使用 Roguelike 时,您将生成该数据。当然,这并不是绝对必要的。

一个非常基本的生成方法是尝试libtcod 的高度图工具包。这是从我写的一个游戏中提取的,可能会给你一个不错的主意,如何处理这个问题。此代码是从我的 Map 类中提取的:

import random
import libtcodpy as libtcod
class Map
  def __init__(self,w,h) :
    self.width = w
    self.height = h
    self._hm = libtcod.heightmap_new(w,h)
    self._cells = []
    self.initMap()
  def initMap(self) :
    print "Initing map"
    for y in range(self.height) :
      for x in range(self.width) :
        c = cell.Cell(x,y)
        self._cells.append(c)
    self.resetMap()
    return
  def resetMap(self):
    print "Resetting map"
    for y in range(self.height) :
      for x in range(self.width) :
        self._cells[x + y * self.width].reset()
    ## Heightmap generation
    self.randomizeHeightmap()
    for y in range(self.height) :
      for x in range(self.width) :
        alt = libtcod.heightmap_get_value(self._hm, x, y)
        self._cells[x + y * self.width].dig(alt > 1)
  def randomizeHeightmap(self) :
    print "Setting up heightmap"
    hills = 1000
    hillSize = 7
    halfX = self.width / 2
    halfY = self.height / 2
    libtcod.heightmap_clear(self._hm)
    for i in range(hills) :
      size = random.randint(0,hillSize)
      hillX1 = random.randint(0,halfX - hillSize / 2)
      hillY1 = random.randint(0,self.height)
      hillX2 = random.randint(halfX + hillSize / 2, self.width)
      hillY2 = random.randint(0,self.height)
      libtcod.heightmap_add_hill(self._hm,hillX1, hillY1, size, size)
      libtcod.heightmap_add_hill(self._hm,hillX2, hillY2, size, size)
    libtcod.heightmap_normalize(self._hm, 0.0, 2.0)
[...]

请注意,我在这里没有使用 libtcod 的地图功能。您当然可以,这也将允许您使用内置的视野工具包(这非常棒!

Cell 类的 dig 方法接受布尔值以确定单元格是否可传递。生成高度图后,我对其进行规范化,使其仅包含 0、1 和 2 的值。然后,我只需制作任何相应的单元格,最终的"高度"为2,为一面墙,1或0为开口。这给了我一个很好的平衡。

高度图功能非常适合创建具有圆形特征的有机布局,而不是在 Roguelike 中常见的典型方形房间地牢。

如果你想生成更传统的地下城,libtcod 附带了一个 BSP 工具包,它是专门为此任务而设计的。请参阅此处的文档。

还有一个令人难以置信的python教程,这里有一个专门的地图部分。

我过去使用过其他方法,包括但不限于读取简单.bmp图像中的每个像素并解释 rgb 值,每个值都指示地图中给定坐标的不同之处(红色可能是墙壁/开放,蓝色可能表示存在/不存在屋顶等)。

不过,基本的想法是只有一个坐标数组。它可能像数组或整数一样简单,其中 0 表示可通过,1 表示墙,或者,就像我的情况一样,一个对象数组,这些对象还存储了一些对您的游戏有用的其他信息。

您可以使用 2-D 数组(有时这更容易绕开,因为您会引用 map[x][y] 而不是 map[x + y*width] 等坐标),而不是我在示例代码中使用的一维数组。

世界是你的牡蛎!:)只需将这些数据放入一个可以读取的结构中,然后检查您感兴趣的坐标。

最新更新