2012-02-14 73 views
0

我該如何去加載Pygame/Python中的地圖文件?在Pygame/Python中載入地圖

我想加載這種格式的地圖文件;

http://pastebin.com/12DZhrtp

編輯:我猜這是一個循環,但我不知道如何做到這一點。

+0

您可以在[Python教程](http://docs.python.org/3.2/tutorial/)中找到如何執行'for'循環。 – 2012-02-14 14:51:57

回答

2

雖然有些人幫助打開一個文件時,我明白你實際上是在尋找導入文本文件作爲地圖: 我沒有寫這一點,但已經使用它作爲我的比賽爲例進行了:

# This code is in the Public Domain 
# -- [email protected] 



class Map: 
    def __init__(self, map, tiles): 
     self.tiles = pygame.image.load(tiles) 

     l = [line.strip() for line in open(map).readlines()] 
     self.map = [[None]*len(l[0]) for j in range(len(l))] 
     for i in range(len(l[0])): 
      for j in range(len(l)): 
       tile = l[j][i] 
       tile = tile_coords[tile] 
       if tile is None: 
        continue 
       elif isinstance(tile, type([])): 
        tile = random.choice(tile) 
       cx, cy = tile 
       if random.choice((0,1)): 
        cx += 192 
       if random.choice((0,1)): 
        cy += 192 
       self.map[j][i] = (cx, cy) 

    def draw(self, view, viewpos): 
     '''Draw the map to the "view" with the top-left of "view" being at 
      "viewpos" in the map. 
     ''' 
     sx, sy = view.get_size() 
     bx = viewpos[0]/64 
     by = viewpos[1]/64 
     for x in range(0, sx+64, 64): 
      i = x/64 + bx 
      for y in range(0, sy+64, 64): 
       j = y/64 + by 
       try: 
        tile = self.map[j][i] 
       except IndexError: 
        # too close to the edge 
        continue 
       if tile is None: 
        continue 
       cx, cy = tile 
       view.blit(self.tiles, (x, y), (cx, cy, 64, 64)) 

    def limit(self, view, pos): 
     '''Limit the "viewpos" variable such that it defines a valid top-left 
      rectangle of "view"'s size over the map. 
     ''' 
     x, y = pos 
     # easy 
     x = max(x, 0) 
     y = max(y, 0) 

     # figure number of tiles in a view, hence max x and y viewpos 
     sx, sy = view.get_size() 
     nx, ny = sx/64, sy/64 
     mx = (len(self.map[0]) - nx) * 64 
     my = (len(self.map) - ny) * 64 
     print y, my 

     return (min(x, mx), min(y, my)) 

def main(): 
    pygame.init() 
    win = pygame.display.set_mode((640, 480)) 

    map = Map('map.txt', 'tiles.png') 
    viewpos = (0,0) 
    move = False 
    clock = pygame.time.Clock() 
    sx, sy = win.get_size() 
    while 1: 
     event = pygame.event.poll() 
     while event.type != NOEVENT: 
      if event.type in (QUIT, KEYDOWN): 
       sys.exit(0) 
      elif event.type == MOUSEBUTTONDOWN: 
       x, y = viewpos 
       dx, dy = event.pos 
       x += dx - sx/2 
       y += dy - sy/2 
       viewpos = map.limit(win, (x, y)) 
       move = True 
      event = pygame.event.poll() 

     win.fill((0,0,0)) 
     map.draw(win, viewpos) 
     pygame.display.flip() 

     clock.tick(30) 


if __name__ == '__main__': 
    main() 
1

如果你真的在問如何使用Python加載文件 - 忽略pygame這一問題 - 那麼它很簡單。

>>> with open('a.map', 'r') as f: 
...  for line in f: 
...   print line, 
... 
x g g g x 
x g g g x 
x g x g x 
x g g g x 
x x x x x 

KEY: 
x = wall 
g = grass/floor 

現在不是打印每一行,你可以簡單地通過它讀取並存儲在任何數據結構,你正在使用。

雖然我不知道pygame什麼 - 如果它有一些自定義功能,我不能幫助。

+0

有爲pygame構建的地圖庫,但不清楚id是Jack正在尋找的東西。如:http://www.pygame.org/project-map+loader+for+'tiled'-1158-3692.html – 2012-02-14 14:41:57