我一直在使用Libtcod在Python中创建一个类似于流氓的东西!
然而,我面临的一个主要障碍是,我完全不知道如何创建自定义映射(如在中,我定义了单元格及其包含的元素),或者,如果可能的话-如何使用Libtcod将自定义映射导入Python。
到目前为止,我正在使用一个定义,它本质上是在某些模式(房间数量,没有交叉点等)之后渲染地图-但我希望这样就可以导入已经定制的地图-或者实际上只是为一个地图做了一个定义,这样我就可以在给定的条件下加载它。
非常感谢您在这个问题上的任何帮助!:)
发布于 2015-02-07 02:50:55
有许多有趣的方法可以将地图数据导入到程序中。
通常,使用类似于盗贼的方式,您将生成该数据。当然,这并不是绝对必要的。
一种非常基本的生成方法是尝试libtcod的heightmap工具包。这是从我写的一个游戏中摘录出来的,可能会给你一个很好的想法来解决这个问题。以下代码是从我的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的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]),而不是我在示例代码中使用的一维数组。
世界是你的!:)只需将数据放入一个你可以读取的结构中,然后检查你感兴趣的坐标。
https://stackoverflow.com/questions/27750977
复制相似问题