Как работает символьная карта списка в Python? - PullRequest
0 голосов
/ 11 февраля 2019

Как работает карта списка?Я видел, что они выглядят так:

level = [
    "PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP",
    "P                                          P",
    "P                                          P",
    "P                                          P",
    "P                    PPPPPPPPPPP           P",
    "P                                          P",
    "P                                          P",
    "P                                          P",
    "P    PPPPPPPP                              P",
    "P                                          P",
    "P                          PPPPPPP         P",
    "P                 PPPPPP                   P",
    "P                                          P",
    "P         PPPPPPP                          P",
    "P                                          P",
    "P                     PPPPPP               P",
    "P                                          P",
    "P   PPPPPPPPPPP                            P",
    "P                                          P",
    "P                 PPPPPPPPPPP              P",
    "P                                          P",
    "P                                          P",
    "P                                          P",
    "P                                          P",
    "PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP",]

Я видел такие, представленные также многомерными массивами ... и я знаю, что мы их перебираем, но как именно мы заставляем их отображать их внаша игра вообще и как их на самом деле называют в сообществе разработчиков игр ??

1 Ответ

0 голосов
/ 11 февраля 2019

«Карта списка», как вы ее назвали, - это просто 2D-карта, где каждый символ / буква представляет отдельную текстуру плитки на экране.Каждая строка на карте определяет строку на экране.

Приведенный ниже код берет массив / список из вопроса и выводит его на экран в виде плитки кирпича или травы.Текстуры взяты из https://opengameart.org. В основном, когда вызывается функция drawMap(), двойной цикл перебирает строки уровня, рисуя сетку из 32x32 графических растровых изображений, которые меняются для каждой буквы.

grass_32.png brick_32.png

Остальная часть кода предназначена для простой обработки основного окна, ввода с помощью клавиши со стрелкой и изменения размераwindow.

import pygame
import time
import sys

# Window size
WINDOW_WIDTH=400
WINDOW_HEIGHT=400

pygame.init()
WINDOW  = pygame.display.set_mode( ( WINDOW_WIDTH, WINDOW_HEIGHT ), pygame.HWSURFACE|pygame.DOUBLEBUF|pygame.RESIZABLE )
pygame.display.set_caption("Map Loader")

clock = pygame.time.Clock()

TILE_SIZE = 32
wall_image  = pygame.image.load('brick_32.png')
grass_image = pygame.image.load('grass_32.png')

level = [
    "PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP",
    "P                                          P",
    "P                                          P",
    "P                                          P",
    "P                    PPPPPPPPPPP           P",
    "P                                          P",
    "P                                          P",
    "P                                          P",
    "P    PPPPPPPP                              P",
    "P                                          P",
    "P                          PPPPPPP         P",
    "P                 PPPPPP                   P",
    "P                                          P",
    "P         PPPPPPP                          P",
    "P                                          P",
    "P                     PPPPPP               P",
    "P                                          P",
    "P   PPPPPPPPPPP                            P",
    "P                                          P",
    "P                 PPPPPPPPPPP              P",
    "P                                          P",
    "P                                          P",
    "P                                          P",
    "P                                          P",
    "PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP",]


def drawMap( screen, level ):
    level_width = len(level[0])  # width for first row
    level_height = len(level)    # number of rows

    for y in range( level_height ):
        for x in range ( level_width ):
            if ( level[y][x] == 'P' ):
                screen.blit( wall_image, ( x*TILE_SIZE, y*TILE_SIZE) )
            elif ( level[y][x] == ' ' ):
                screen.blit( grass_image, (x*TILE_SIZE, y*TILE_SIZE) )

def drawGameWindow( screen ):
    global WINDOW_WIDTH, WINDOW_HEIGHT
    drawMap( screen, level )
    pygame.display.update()
    pygame.display.flip()


clock = pygame.time.Clock()
done = False
while not done:

    for event in pygame.event.get():
        if ( event.type == pygame.QUIT ):
            done = True
        elif ( event.type == pygame.VIDEORESIZE ):
            WINDOW_WIDTH  = event.w
            WINDOW_HEIGHT = event.h
            WINDOW  = pygame.display.set_mode( ( WINDOW_WIDTH, WINDOW_HEIGHT ), pygame.HWSURFACE|pygame.DOUBLEBUF|pygame.RESIZABLE )

    # Movement keys
    keys = pygame.key.get_pressed()
    if ( keys[pygame.K_UP] ):
        print("up")
    elif ( keys[pygame.K_DOWN] ):
        print("down")
    elif ( keys[pygame.K_LEFT] ):
        print("left")
    elif ( keys[pygame.K_RIGHT] ):
        print("right")

    drawGameWindow( WINDOW )
    clock.tick_busy_loop( 60 )


pygame.quit()

Очевидно, что в реальной игре карта намного больше экрана.Поэтому необходимо написать код, чтобы нарисовать только правильный участок карты на экране.Пример кода выше наивно просто рисует из верхнего левого угла.Если карта списка была довольно сложной, возможно, стоит загрузить все текстуры тайлов в словарь, а затем просто рисовать по номерам , например: textures['P'] -> textures[ level[y][x] ]

Существуют также библиотеки Python, которые уже справятся со всем этим.Один популярный пример - TMX , но есть и несколько других.

Оффтоп, но соответствующее примечание :

Если вы когда-либо видели Roguelike-игра (мой личный фаворит Angband ), они используют буквы в качестве "графических" элементов, например, игрок @, Дракон d или D,им никогда не требовалось использовать причудливую графику, и они сделали великолепную игру, используя только текстовые символы.

...