如何在变量中保存级别布局

时间:2017-11-16 22:04:47

标签: python pygame

目前,我的下一个项目将是一个平台游戏,当我浏览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.

3 个答案:

答案 0 :(得分:2)

您需要计算每个图块的像素位置。要绘制任何图块,您需要知道

  1. 画布的大小
  2. 网格的大小
  3. 网格中瓷砖的位置
  4. 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都是整数。否则,由于四舍五入,您的瓷砖会略微偏移。

答案 1 :(得分:1)

您可以迭代布局中的枚举行和字符,创建切片实例并将它们添加到精灵组。

在示例中,我将瓷砖添加到不同的颜色,具体取决于布局中的字符(X =蓝色,T =绿色),然后再添加到组中,但您也可以创建完全不同的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进行一次blit。

答案 2 :(得分:0)

这里没有魔法:"它只是在游戏中呈现"不准确。渲染调用背后还有更多软件,一个定义tile精灵的模块,逐个字符地扫描关卡,并相应地放置精灵。开发人员(例如您)决定级别表示,精灵形式,精灵位置等。

您需要编写几个代码。好消息是决定格式;你只需要在编写这些模块时保持一致。