2015-01-03 2 views
0

저는 Libtcod를 사용하여 Python으로 Roguelike를 만드는 작업을 해왔습니다!Libtcod를 사용하여 파이썬에서 사용자 정의 맵 생성/가져 오기?

그러나 내가 직면 한 주요 장애물 중 하나는 사용자 정의지도를 만드는 방법을 전혀 알지 못한다는 것입니다 (셀을 정의하고 요소가 어떤 요소인지 정의). 가능하다면 - Libtcod를 사용하여 사용자 정의 맵을 Python으로 가져 오는 방법.

필자는 essentialy가 특정 패턴 (객실 수, 교차로 없음 등) 다음에지도를 렌더링한다는 정의를 사용하고 있습니다.하지만 이미 맞춤형지도를 가져올 수 있도록 만들고 싶습니다. 또는 실제로 하나에 대한 정의를 만들었습니다. 그래서 주어진 특정 기준에서로드 할 수 있습니다.

이 주제에 대한 도움을 주시면 감사하겠습니다. :)

답변

0

지도 데이터를 프로그램으로 가져올 수있는 흥미로운 방법이 많이 있습니다.

일반적으로, 로그 류에 해당 데이터를 생성합니다. 물론 이것은 꼭 필요한 것은 아닙니다. 생성의

예쁜 기본적인 방법은 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] 같은 좌표를 참조하기 때문에). 예제 코드에서 사용되었습니다.

세상은 당신의 굴입니다! :) 당신이 그것을 읽을 수있는 구조로 그 데이터를 가져온 다음 관심있는 좌표를 조사하십시오.

관련 문제