屏幕 pygame 上仅添加了 2 个精灵

问题描述

我正在尝试制作一个简单的 pygame 迷宫,但我遇到了一个问题,即只显示了 2 个精灵:一个玩家和一堵墙,而我看到它们都正确地添加到了精灵列表中

PINK = (221,160,221)
WHITE = (255,255,255)
BLUE = (29,32,76)

SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600
FPS = 30


class Player(pygame.sprite.Sprite):

    def __init__(self,x,y,img='alien.png'):
        # Call the parent's constructor
        super().__init__()

        self.image = pygame.image.load(img).convert_alpha()
        self.rect = self.image.get_rect()
        self.rect.x = x
        self.rect.y = y

        # Set speed vector
        self.change_x = 0
        self.change_y = 0
        self.walls = None

    def update(self):

        # Horizontal movement
        self.rect.x += self.change_x

        # Check if object stumbles upon an obstacle
        block_hit_list = pygame.sprite.spritecollide(self,self.walls,False)
        for block in block_hit_list:

            if self.change_x > 0:  # If the object was moving right
                self.rect.right = block.rect.left  # Align its right border with the left border of an obstacle

            else:  # If the object was moving left
                self.rect.left = block.rect.right  # Align its left border with the right border of an obstacle

        # Vetical movement
        self.rect.y += self.change_y

        # Check if object stumbles upon an obstacle
        block_hit_list = pygame.sprite.spritecollide(self,False)
        for block in block_hit_list:

            if self.change_y > 0:  # If the object was moving up
                self.rect.bottom = block.rect.top  # Align its upper border with the down border of an obstacle

            else:  # If the object was moving down
                self.rect.top = block.rect.bottom  # Align its down border with the up border of an obstacle


class Wall(pygame.sprite.Sprite):
    def __init__(self,width,height):
        super().__init__()

        self.image = pygame.Surface([width,height])
        self.image.fill(BLUE)

        self.rect = self.image.get_rect()
        self.rect.y = y
        self.rect.x = x


pygame.init()
screen = pygame.display.set_mode([SCREEN_WIDTH,SCREEN_HEIGHT])
pygame.display.set_caption('Maze game')

all_sprite_list = pygame.sprite.Group()
wall_list = pygame.sprite.Group()

for x in range(len(walls)):
    for y in range(len(walls)):
        if walls[x][y] == 1:
            #print(x,y)
            wall = Wall(x,20,20)
            wall_list.add(wall)
            all_sprite_list.add(wall)

player = Player(maze.start[0],maze.start[1])
player.walls = wall_list
all_sprite_list.add(player)

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.KEYDOWN:
            if event.key == pygame.K_LEFT:
                player.change_x = -3
            elif event.key == pygame.K_RIGHT:
                player.change_x = 3
            elif event.key == pygame.K_UP:
                player.change_y = -3
            elif event.key == pygame.K_DOWN:
                player.change_y = 3

        elif event.type == pygame.KEYUP:
            if event.key == pygame.K_LEFT:
                player.change_x = 0
            elif event.key == pygame.K_RIGHT:
                player.change_x = 0
            elif event.key == pygame.K_UP:
                player.change_y = 0
            elif event.key == pygame.K_DOWN:
                player.change_y = 0
    screen.fill(PINK)

    all_sprite_list.update()
    all_sprite_list.draw(screen)
    pygame.display.flip()
    clock.tick(60)

pygame.quit()

其中 maze.grid一个由 0 和 1 组成的二维 np 数组,maze.start一个像 (0,9) 这样的元组。 当我将 wall = Wall(x,20) 行中的高度和宽度参数更改为 wall = Wall(x,1,1) 时,我看到屏幕上出现一个小迷宫,但如果我增加墙的高度和宽度,我只会看到顶部的一个正方形窗口的左角。我认为问题是我希望它在 20x20px 块上添加每个墙,但它在 1x1px 块上添加。我怎样才能解决这个问题? 有没有办法不只是通过 1x1px 块来处理坐标?

解决方法

实际上,所有对象都被绘制,但绘制在另一个之上。

在嵌套循环中xy是网格中的索引(walls),而不是左上角的坐标。您需要通过乘以一个单元格的大小 (20) 来计算每个单元格的角点坐标:

wall = Wall(x,y,20,20)

wall = Wall(x*20,y*20,20)