【问题标题】:Only 2 sprites added on screen pygame屏幕pygame上只添加了2个精灵
【发布时间】:2021-04-08 20:00:21
【问题描述】:

我正在尝试制作一个简单的 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, self.walls, 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, x, y, 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, y, 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, y, 20, 20) 行中的高度和宽度参数更改为wall = Wall(x, y, 1, 1) 时,我看到屏幕上出现了一个小迷宫,但是如果我增加墙的高度和宽度,我只会在左上角看到一个正方形窗户。我假设问题是我希望它在 20x20px 块上添加每面墙,而是在 1x1px 块上添加。我怎样才能解决这个问题? 有没有办法通过 1x1px 块来处理坐标?

【问题讨论】:

    标签: python pygame


    【解决方案1】:

    实际上,所有对象都被绘制出来了,只是一个在另一个之上。

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-25
      • 2020-04-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多