使用Libtcod在Python中创建/导入自定义映射?
我一直在用Python创建一个类似Roguelike的程序,使用Libtcod 然而,我一直面临的一个主要障碍是,我完全不知道如何制作自定义映射,如中所示,我定义了单元格及其包含的元素,或者,如果可能的话,也不知道如何使用Libtcod将自定义映射导入Python 到目前为止,我使用的定义基本上是在特定的模式、房间数量、无交叉点等之后渲染地图-但我希望这样做,以便我可以导入一个已经定制的地图-或者实际上只是为一个创建了一个定义,以便我可以在给定的标准中加载它使用Libtcod在Python中创建/导入自定义映射?,python,roguelike,libtcod,Python,Roguelike,Libtcod,我一直在用Python创建一个类似Roguelike的程序,使用Libtcod 然而,我一直面临的一个主要障碍是,我完全不知道如何制作自定义映射,如中所示,我定义了单元格及其包含的元素,或者,如果可能的话,也不知道如何使用Libtcod将自定义映射导入Python 到目前为止,我使用的定义基本上是在特定的模式、房间数量、无交叉点等之后渲染地图-但我希望这样做,以便我可以导入一个已经定制的地图-或者实际上只是为一个创建了一个定义,以便我可以在给定的标准中加载它 在此问题上的任何帮助都将不胜感激,谢
在此问题上的任何帮助都将不胜感激,谢谢!: 有很多有趣的方法可以将地图数据导入到程序中 通常,使用roguelike,您将生成该数据。当然,这并不是绝对必要的 一种非常基本的生成方法是试用libtcod的heightmap工具包。这是从我写的一个游戏中摘录出来的,可能会给你一个解决问题的好主意。此代码是从my 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方法接受一个布尔值来确定单元格是否可以通过。生成heightmap后,我将其规格化,使其仅包含0、1和2的值。然后我只做了一个相应的单元格,它的高度是2,是墙,1或0,是开口。这给了我一个很好的平衡
heightmap功能非常适合创建一种有机布局,具有圆形特征,而不是典型的方形房间地牢,这种地牢通常出现在盗贼身上
如果您希望生成更传统的地下城,那么libtcod附带了一个BSP工具包,它正是为这项任务而设计的。请参阅相关文档
还有一个令人难以置信的python教程,其中有一个专门的映射部分
我过去使用过其他方法,包括但不限于读取简单的.bmp图像中的每个像素并解释rgb值,每个都表示地图中给定坐标的不同之处红色可能是墙/开的,蓝色可能表示是否有屋顶,等等
不过,其基本思想是只需要一个坐标数组。它可能像一个数组或整数一样简单,其中0表示可以通过,1表示墙,或者像我的例子一样,一个对象数组,它还存储了一些对游戏有用的其他信息
你可以使用一个二维数组,这非常容易让你的头绕起来,有时,因为你会参考像map[x][y]这样的坐标,而不是map[x+y*width],而不是我在示例代码中使用的一维数组
世界就是你的牡蛎只需将数据放入一个可以读取的结构中,然后检查您感兴趣的坐标