지도 데이터를 프로그램으로 가져올 수있는 흥미로운 방법이 많이 있습니다.
일반적으로, 로그 류에 해당 데이터를 생성합니다. 물론 이것은 꼭 필요한 것은 아닙니다. 생성의
예쁜 기본적인 방법은 libtcod의 하이트 툴킷을 시도하는 것입니다. 이것은 제가 작성한 게임에서 발췌 한 것이며, 문제에 접근하는 방법을 알려줄 것입니다. 이 코드는 내지도 클래스에서 추출되었습니다.
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의지도 기능을 사용하지 않습니다. 당신은 분명히 할 수 있습니다. 그리고 그것은 여러분이 Field of View 툴킷을 사용할 수있게 해줄 것입니다 (꽤 멋지 네요!).
는 셀 클래스의 파기에있어서, 상기 셀이 무난인지의 여부를 결정하는 부울 값을 수용한다. 하이트 맵이 생성 된 후에 나는 0, 1, 2의 값만 포함하도록 정규화합니다. 그러면 벽의 "고도", 1 또는 0의 개구부로 끝나는 대응하는 셀을 만듭니다. 이것은 나와 함께 일하는 좋은 균형을주었습니다.
하이트 기능은 오히려 종종 로그 류 게임에서 볼 수있는 전형적인 평방 4 방 던전보다, 라운드 기능, 레이아웃의 유기 종류를 만들기를 위해 중대하다.
당신이 전통적인 던전을 생성하기 위해 찾고 있다면,이 작업에 대해 정확하게 설계 libtcod에 포함 된 BSP 툴킷이있다. 문서
here을 참조하십시오.
은 전용 맵 섹션 here이있는 놀라운 파이썬 튜토리얼이있다.
나는 단순한 .bmp 이미지의 각 픽셀을 읽고 rgb 값을 해석하는 것을 포함하여 다른 방법을 사용했습니다. 각 값은지도에서 주어진 좌표에 대해 다른 것을 나타냅니다 (빨간색은 벽/열린, 파란색은 지붕의 존재/부재를 나타낼 수 있습니다.
기본 아이디어는 단지 좌표 배열을 갖는 것입니다. 배열이나 정수처럼 간단 할 수도 있습니다. 0은 통과 가능을 의미하고 1은 벽을 의미합니다. 또는 제 경우처럼 게임에 유용한 다른 정보를 저장하는 객체 배열을 의미합니다.
2 차원 배열을 사용할 수 있습니다 (머리를 감싸기가 훨씬 쉬우 며 때로는 map[x + y*width]
이 아닌 map[x][y]
같은 좌표를 참조하기 때문에). 예제 코드에서 사용되었습니다.
세상은 당신의 굴입니다! :) 당신이 그것을 읽을 수있는 구조로 그 데이터를 가져온 다음 관심있는 좌표를 조사하십시오.