簡體   English   中英

如何在變量中保存級別布局

[英]How do I save a level layout in a variable

目前,我的下一個項目將是一個平台游戲,當我瀏覽stackoverflow來研究幾種機制時,我看到很多人都在做同樣的事情:他們用一些變量保存一個布局,然后在某個地方去卸載它只是渲染在游戲里。 我感興趣,所以我看得更遠,我沒有發現如何加載/卸載這樣的狀態,或者我可能只是沒有正確地搜索我的搜索。

無論哪種方式,我該怎么做?

例如:我將級別布局保存為數組或單個多行字符串,然后以某種方式為每個字母生成一個tile sprite,如T.

import pygame

# Storage method A
level = '''
X X X X X
X X X X X
T T X X X
X X X T T
T T T T T
'''

# Storage Method B

level2 = [ 
    'XXXXX',
    'XXXXX',
    'TTXXX',
    'XXXTT',
    'TTTTT'
]

# X is blank space, T is tiles

# Then what? Thats what I need to know.
# If someone already answered this and I'm just not using the right keywords let me know.

您需要計算每個圖塊的像素位置。 要繪制任何圖塊,您需要知道

  1. 畫布的大小
  2. 網格的大小
  3. 瓷磚在網格中的位置

1:找到畫布的大小應該是微不足道的。

2:對於第二種存儲方法,您可以這樣做

height = len(level2)
width = len(level2[0]) #Assuming all rows are of equal length and there's at least one row

3:我們將遍歷行和字符,這些行和字符將跟蹤我們在側面網格中的位置。

def draw_tiles(canvas_width, canvas_height, width, height, level2):
  for row in range(height):
    for column in range(width):
      if list(level2[row])[column] == 'T':
        pixel_x = int(canvas_width/width)*column
        pixel_y = int(canvas_height/height)*row
        draw_tile(pixel_x, pixel_y)

現在您需要做的就是定義draw_tile(x,y)函數,在畫布上繪制一個平鋪,其左上角位於像素坐標(x,y)上。 我確定pygame有一些東西。

確保設置網格寬度/高度,以便canvas_width / width和canvas_height / height都是整數。 否則,由於四舍五入,您的瓷磚會略微偏移。

您可以迭代布局中的枚舉行和字符,創建切片實例並將它們添加到精靈組。

在示例中,我只是根據布局中的字符(X =藍色,T =綠色)給予圖塊不同的顏色,然后再將它們添加到組中,但如果字符是a,您還可以創建完全不同的Tile類型或子類'T'或'X'。

import pygame


class Tile(pygame.sprite.Sprite):

    def __init__(self, pos, color):
        super().__init__()
        self.image = pygame.Surface((50, 50))
        self.image.fill(color)
        self.rect = self.image.get_rect(topleft=pos)


def create_tile_group(layout):
    """Turn the layout into a sprite group with Tile instances."""
    group = pygame.sprite.Group()
    for y, row in enumerate(layout):
        for x, tile in enumerate(row):
            if tile == 'T':
                color = (50, 150, 50)
            else:
                color = (0, 0, 200)
            group.add(Tile((x*tile_size, y*tile_size), color))
    return group


pygame.init()
screen = pygame.display.set_mode((250, 250))
clock = pygame.time.Clock()

layout1 = [
    'XXXXX',
    'XTXXX',
    'XXXXT',
    'XXXXX',
    'TTTTT',
    ]

tile_size = 50
tile_group = create_tile_group(layout1)

loop = True
while loop:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            loop = False

    tile_group.update()

    screen.fill((30, 30, 30))
    tile_group.draw(screen)

    pygame.display.flip()
    clock.tick(30)

如果你因為太多的小表面而出現性能問題,你可以在while循環開始之前將它們blit到一個大的背景表面上,然后在每一幀時將blit背景一次。

這里沒有魔力:“它只是在游戲中呈現”並不准確。 渲染調用背后有更多軟件,一個定義tile精靈的模塊,逐個字符地掃描關卡,並相應地放置精靈。 開發人員(例如您)決定級別表示,精靈形式,精靈位置等。

你有幾個代碼要編寫。 好消息是決定格式; 你只需要在編寫這些模塊時保持一致。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM