python和libtcod:使用柏林噪波生成地形
我发现了一个关于世界一代的好帖子,可以找到 它很好地描述了需要做的事情,但是我很难弄清楚如何在python中完成它。我相信它是在as3中完成的,但我不确定。不管怎样,我还发现了柏林噪声的libtcod函数:python和libtcod:使用柏林噪波生成地形,python,libtcod,Python,Libtcod,我发现了一个关于世界一代的好帖子,可以找到 它很好地描述了需要做的事情,但是我很难弄清楚如何在python中完成它。我相信它是在as3中完成的,但我不确定。不管怎样,我还发现了柏林噪声的libtcod函数: noise2d=libtcod.noise_new(2) value = libtcod.noise_turbulence_perlin(noise2d,[0.5,0.7],32.0) 我真的不知道如何实现这一点,然后根据高度分配字符 如果有人能帮我将文章中的步骤翻译成python,我将不
noise2d=libtcod.noise_new(2)
value = libtcod.noise_turbulence_perlin(noise2d,[0.5,0.7],32.0)
我真的不知道如何实现这一点,然后根据高度分配字符
如果有人能帮我将文章中的步骤翻译成python,我将不胜感激。谢谢这是我几年前写的一个类,它为我的roguelike原型创建了一个世界地图。有关部分载于附件 它将噪波应用于高度贴图,对其进行规格化,并基于高度贴图的值创建平铺 我正在使用颜色贴图创建从一种瓷砖到另一种瓷砖的平滑过渡
from constants.constant import *
from world import World
from worldtile import WorldTile
class WorldGenerator(object):
"""Randomly generates a new world with terrain and objects"""
def regular(self):
"""Randomly generate a new world with some water, swamps, hills, some objects etc"""
idx = [ 0 , 15, 75, 90, 101 ] # indexes of the keys
col = [ T.Color(0,100,100),
T.Color(0,75,0),
T.Color(50,150,0),
T.Color(150,120,80),
T.Color(180,180,180)]
map=T.color_gen_map(col,idx)
tiles = zip(idx, [[SWAMP, PLAINS],
[PLAINS, FOREST],
[HILLS, FOREST],
[HILLS, HILLS, MOUNTAINS],
[HILLS, MOUNTAINS,MOUNTAINS]])
world = self.__generate(map, tiles)
return world
def __generate(self, colormap, mtiles, noise_zoom=1, noise_octaves=10):
hm = T.heightmap_new(WORLD_WIDTH, WORLD_HEIGHT)
hm1 = T.heightmap_new(WORLD_WIDTH, WORLD_HEIGHT)
hm2 = T.heightmap_new(WORLD_WIDTH, WORLD_HEIGHT)
noise = T.noise_new(2)
T.heightmap_add_fbm(hm1, noise, noise_zoom, noise_zoom, 0.0, 0.0, noise_octaves, 0.0, 1.0)
T.heightmap_add_fbm(hm2, noise, noise_zoom*2, noise_zoom*2, 0.0, 0.0, noise_octaves/2, 0.0, 1.0)
T.heightmap_multiply_hm(hm1, hm2, hm)
T.heightmap_normalize(hm, mi=0.0, ma=1)
tiles = {}
# 0...100 -> value from noised heightmap
for x in xrange(0, 101):
lower = [c for c in mtiles if c[0] <= x][-1] # tile is between lower and upper color
upper = [c for c in mtiles if c[0] > x][0]
# calculating percentage
lower_c = x - lower[0]
upper_c = upper[0] - x
count = lower_c + upper_c
tiles[x] = colormap[x], lower[1], int(upper_c * 1.0 / count * 100), upper[1]
# generate world grid
grid = []
for x in xrange(WORLD_WIDTH):
grid.append([])
for y in xrange(WORLD_HEIGHT):
hm_v = T.heightmap_get_value(hm, x, y)
grid[x].append(WorldTile(*tiles[int(hm_v * 100)]))
T.heightmap_delete(hm)
T.heightmap_delete(hm1)
T.heightmap_delete(hm2)
objects = []
while len(objects) < 5:
for x in xrange(WORLD_WIDTH):
for y in xrange(WORLD_HEIGHT):
r = random.randrange(0, 10000)
pos = [wo for wo in WORLDOBJECTS if wo.chance >= r and grid[x][y].tile in wo.tiles]
if pos:
o = random.choice(pos).create(x, y)
objects.append(o)
return World(grid, objects)
from constants.constant import*
从世界进口世界
从worldtile导入worldtile
类WorldGenerator(对象):
“”“随机生成具有地形和对象的新世界”“”
def常规(自我):
“”“随机生成一个包含一些水、沼泽、山丘、一些对象等的新世界”“”
idx=[0,15,75,90,101]#键的索引
col=[T.Color(0100),
T.颜色(0,75,0),
T.Color(50150,0),
T.Color(150120,80),
T.Color(180180)]
map=T.color\u gen\u map(col,idx)
tiles=zip(idx,[[沼泽,平原],
[平原,森林],
[山林],
[山,山,山],
[山,山,山])
世界=自我。\u生成(地图、分幅)
回归世界
定义生成(自、彩色贴图、mtiles、噪波缩放=1、噪波倍频程=10):
hm=T.高度地图(世界宽度、世界高度)
hm1=T.heightmap\u new(世界宽度、世界高度)
hm2=T.heightmap\u new(世界宽度、世界高度)
噪音=T.噪音\新(2)
T.heightmap_添加_fbm(hm1,噪音,噪音缩放,噪音缩放,0.0,0.0,噪音八度,0.0,1.0)
T.heightmap_添加_fbm(hm2,噪音,噪音缩放*2,噪音缩放*2,0.0,0.0,噪音八度/2,0.0,1.0)
T.heightmap_multiply_hm(hm1,hm2,hm)
T.heightmap_归一化(hm,mi=0.0,ma=1)
tiles={}
#0…100->有噪高度贴图中的值
对于x范围内的x(0,101):
lower=[c表示多文件中的c,如果c[0]x][0]
#计算百分比
下_c=x-下[0]
上_c=上[0]-x
计数=下限值+上限值
tiles[x]=colormap[x],下[1],int(上[u c*1.0/计数*100),上[1]
#生成世界网格
网格=[]
对于x范围内的x(世界宽度):
grid.append([])
对于X范围内的y(世界高度):
hm_v=T.heightmap_获取值(hm,x,y)
网格[x].追加(WorldTile(*tiles[int(hm_v*100)])
T.heightmap_删除(hm)
T.heightmap_删除(hm1)
T.heightmap_删除(hm2)
对象=[]
而len(对象)<5:
对于x范围内的x(世界宽度):
对于X范围内的y(世界高度):
r=random.randrange(0,10000)
pos=[如果wo.chance>=r和网格[x][y,则WORLDOBJECTS中wo的wo.平铺]
如果pos:
o=随机选择(位置)。创建(x,y)
objects.append(o)
返回世界(网格、对象)
示例世界地图如下所示:
请注意,此游戏使用libtcod1.5.1b1,一些函数名在较新版本中有所更改。几年前,a编写了一个类似流氓的原型,使用不同的地下城/世界生成器,使用litcod/noise。你可以找到它(注意它使用的是旧的litcod版本),尤其是。谢谢Dominic,这真是太棒了!告诉我,如果我做对了:你创建一个高度贴图,给它添加噪音,然后根据每个位置的高度分配瓷砖?这看起来真的很好。然而,我查看了它,我不确定如何在我当前的设计中实现它。我正在关注,也许我会在不久的将来扩展这个教程。好的,那很好。再次感谢你迄今为止的帮助