我正在使用python中的柏林噪声库来尝试创建程序生成的地图。我这样做了,在某些层面上,有黑色的方块,在其他层面上,有白色的方块。我希望我的玩家能够在白色方块上行走,但会与黑色方块发生碰撞(希望这是以后的事)。问题是,有时候白色区域是相互分离的,就像这个例子(绿色方块是玩家)。我想要的是通过黑色方块创造某种路径,以便玩家能够到达白色区域。下面是我的代码:
from perlin_noise import PerlinNoise
import pygame
pygame.init()
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
BLUE = (0, 0, 255)
SCREENWIDTH = 800
SCREENHEIGHT = 800
###################################################################################
class Block(pygame.sprite.Sprite):
def __init__(self, colour, x, y):
super(Block, self).__init__()
self.image = pygame.Surface([4, 4]) # create a surface to draw onto
self.image.fill(colour) # Set a fill colour, as the R,G,B are in equal proportion this will be a grey
self.rect = self.image.get_rect()
self.rect.x = x * 4
self.rect.y = y * 4
####################################################################################
noise1 = PerlinNoise(octaves=4)
noise2 = PerlinNoise(octaves=8)
noise3 = PerlinNoise(octaves=16)
noise4 = PerlinNoise(octaves=32)
xpix, ypix = 250, 250
pic = []
for i in range(xpix):
row = []
for j in range(ypix):
noise_val = noise1([i/xpix, j/ypix])
noise_val += 0.5 * noise2([i/xpix, j/ypix])
noise_val += 0.25 * noise3([i/xpix, j/ypix])
noise_val += 0.125 * noise4([i/xpix, j/ypix])
row.append(noise_val)
pic.append(row)
#################################################################################
size = (SCREENWIDTH, SCREENHEIGHT)
window = pygame.display.set_mode((size))
screen = pygame.display.get_surface()
block_group = pygame.sprite.Group()
y = 0
for row in pic:
x = 0
for col in row:
if -0.1 > pic[y][x]:
b = Block(BLACK, x, y)
else:
b = Block(WHITE, x, y)
block_group.add(b)
x += 1
y += 1
###################################################################
carryOn = True
while carryOn:
for event in pygame.event.get():
if event.type == pygame.QUIT:
carryOn = False
block_group.draw(screen)
p.draw(screen)
pygame.display.flip()
本教程(从ep5到ep8)可以帮助您(他使用行军广场算法来显示他的地图,但原理与您相同)。一般思路是检测隔离区域,然后找到需要连接的点,以便连接两个区域(对于每个区域,距离另一个区域最近的点),最后绘制连接。您可以在ep8的末尾看到最终结果,看看它是否像您想要做的那样。