0

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

但是,我面临的主要障碍之一是我完全不知道如何制作 CUSTOM 地图(例如,我定义了单元格及其包含的元素)或者,如果可能的话 - 你如何导入使用 Libtcod 将自定义映射到 Python。

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

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

4

1 回答 1

0

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

通常,使用 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 为开口的相应单元格制作。这给了我一个很好的平衡。

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

如果您希望生成更传统的地下城,libtcod 中包含一个 BSP 工具包,该工具包专为该任务而设计。请参阅此处的文档。

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

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

然而,基本的想法是只有一个坐标数组。它可能像数组或整数一样简单,其中 0 表示可通过,1 表示墙,或者,在我的例子中,也可以存储一些对您的游戏有用的其他信息的对象数组。

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

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

于 2015-02-06T18:50:55.420 回答