Загрузка карты в Pygame / Python - PullRequest
0 голосов
/ 14 февраля 2012

Как мне загрузить файл карты в Pygame / Python?

Я хотел бы загрузить файл карты в этом формате;

http://pastebin.com/12DZhrtp

РЕДАКТИРОВАТЬ: Я предполагаю, что это цикл for, но я не уверен, как это сделать.

Ответы [ 3 ]

2 голосов
/ 09 декабря 2012

Хотя некоторые люди помогли открыть файл, я понимаю, что вы действительно хотите импортировать текстовый файл в виде карты: я не писал этого, но использовал его в качестве примера для своей игры:

# This code is in the Public Domain
# -- richard@mechanicalcat.net



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 голос
/ 14 февраля 2012

Если вы буквально спрашиваете, как загрузить файл в 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 голосов
/ 14 февраля 2012

Поскольку карта - это всего лишь двухмерный массив, для ее прохождения используются два цикла.

        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)):

Подробности можно найти во многих местах.Вот один из них: http://www.mechanicalcat.net/richard/log/Python/PyGame_sample__drawing_a_map__and_moving_around_it

Внутри вы определяете, что рисовать.В вашем случае: стена, трава или пол, которые были бы спрайтами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...