首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Libtcod在Python中创建/导入自定义地图?

使用Libtcod在Python中创建/导入自定义地图?
EN

Stack Overflow用户
提问于 2015-01-03 09:56:43
回答 1查看 850关注 0票数 0

我一直在使用Libtcod在Python中创建一个类似于流氓的东西!

然而,我面临的一个主要障碍是,我完全不知道如何创建自定义映射(如在中,我定义了单元格及其包含的元素),或者,如果可能的话-如何使用Libtcod将自定义映射导入Python。

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

非常感谢您在这个问题上的任何帮助!:)

EN

回答 1

Stack Overflow用户

发布于 2015-02-07 02:50:55

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

通常,使用类似于盗贼的方式,您将生成该数据。当然,这并不是绝对必要的。

一种非常基本的生成方法是尝试libtcod的heightmap工具包。这是从我写的一个游戏中摘录出来的,可能会给你一个很好的想法来解决这个问题。以下代码是从我的Map类中提取的:

代码语言:javascript
复制
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的map功能。当然可以,这将允许您使用内置的视野工具包(这是非常棒的!)。

Cell类的dig方法接受一个布尔值来确定该单元格是否可以通过。生成高度图后,我对其进行标准化,使其只包含0、1和2的值。然后,我只需将“高度”为2的相应单元格设置为墙,将1或0作为洞口。这给了我一个很好的平衡。

heightmap函数非常适合创建一种有机的布局,具有圆形特征,而不是通常在盗贼中看到的典型的方形房间的地下城。

如果您希望生成更传统的地下城,libtcod中包含的BSP工具包就是专门为此任务设计的。请参阅here的相关文档。

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

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

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

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27750977

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档