【问题标题】:Why isn't pygame rendering all my sprites?为什么 pygame 不渲染我所有的精灵?
【发布时间】:2020-12-21 14:34:29
【问题描述】:

我正在尝试按照 this 教程学习 pygame。我已经到了试图生成敌人对象的地步,但我认为我犯了一个错误,因为没有显示任何内容。

class Player(pygame.sprite.Sprite):
        def __init__(self):
            super(Player, self).__init__()
            self.surf = pygame.Surface((75,25))
            self.surf.fill((0, 0,0))
            self.rect = self.surf.get_rect()

           #Moves sprite based on keypresses(removed for clarity)
class Enemy(pygame.sprite.Sprite):
    def __init__(self):
        super(Enemy, self).__init__()
        self.surf = pygame.Surface((20,10))
        self.surf.fill((0,0,0))
        self.rect = self.surf.get_rect(
            center = (
            random.randint(SCREEN_WIDTH + 20, SCREEN_WIDTH + 100),
            random.randint(0, SCREEN_HEIGHT),
            )
        )
        self.speed = random.randint(5, 20)
        # moves sprite based on speed, remove when passes left edge
        def update(self):
            self.rect.move_ip(-self.speed, 0)
            if self.rect.right < 0:
                self.kill()
                #How sad for them


pygame.init()
#create screen
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))

#custom events for adding a new Enemy
ADDENEMY = pygame.USEREVENT + 1
pygame.time.set_timer(ADDENEMY, 250)
# Instantiate player
player = Player()
enemies = pygame.sprite.Group()
all_sprites = pygame.sprite.Group()
all_sprites.add(player)
#keep the game running!
running = True


#loop time!
while running:
    #look at all the events
    for event in pygame.event.get():
        #did the user hit a key?
        if event.type == KEYDOWN:
            #Was it escape?  uh oh we gotta stop
            if event.key == K_ESCAPE:
                running = False

        elif event.type ==QUIT:
            running = False

        elif event.type == ADDENEMY:
            #Create the new enemy
            new_enemy = Enemy()
            enemies.add(new_enemy)
            all_sprites.add(new_enemy)
    #gets the keys that were just pressed
    pressed_keys = pygame.key.get_pressed()
    #updates location based on keys
    player.update(pressed_keys)
    #updates enemy position
    enemies.update()
    #fill screen with white
    screen.fill((255, 255, 255))
    #Draw the sprites
    for entity in all_sprites:
        screen.blit(entity.surf, entity.rect)
    # Create a surface and pass in a tuple containing legth and width
    surf = pygame.Surface((50, 50))

    
    pygame.display.flip()

据我所知,我必须创建一个敌人类,然后添加一个添加敌人的事件 (ADDENEMY)。当该事件被调用时(由于计时器,每 250 毫秒)它应该有一个敌人出现,向左移动直到它到达显示的末尾。
我有一组作为敌人的精灵和一组 all_sprites,我正在使用 screen.blit 和 for 循环将 all_sprites 中的每个实体呈现到屏幕上。我错过了什么?当我运行这个(连同我编辑的部分)时,我看到玩家精灵很好,它移动了,但我没有看到任何敌人。

【问题讨论】:

    标签: python python-3.x pygame


    【解决方案1】:

    您的精灵不在窗口中。由于范围指定不正确,所有精灵都在窗口之外:

    random.randint(SCREEN_WIDTH + 20, SCREEN_WIDTH + 100)

    random.randint(20, SCREEN_WIDTH + 100),
    

    另外,Indentation 有问题。方法update需要是Enemy类的作用域:

    class Enemy(pygame.sprite.Sprite):
        def __init__(self):
            # [...]
    
        # INDENTATION
    
        #<--|
        def update(self):
            # [...]
    

    此外,请参阅pygame.sprite.Group.draw()

    将包含的 Sprite 绘制到 Surface 参数。这将Sprite.image 属性用于源表面,并使用Sprite.rect。 [...]

    将属性surf重命名为image并调用all_sprites.draw(screen)

    class Player(pygame.sprite.Sprite):
            def __init__(self):
                super(Player, self).__init__()
                self.image = pygame.Surface((75,25))
                self.image.fill((0, 0,0))
                self.rect = self.image.get_rect()
    
    class Enemy(pygame.sprite.Sprite):
        def __init__(self):
            super(Enemy, self).__init__()
            self.image = pygame.Surface((20,10))
            self.image.fill((0,0,0))
            self.rect = self.image.get_rect(
                center = (
                random.randint(20, SCREEN_WIDTH + 100),
                random.randint(0, SCREEN_HEIGHT),
                )
            )
            self.speed = random.randint(5, 20) 
    
    while running:
        # [...]
    
        #for entity in all_sprites:
        #    screen.blit(entity.surf, entity.rect) <---- DELETE
    
    
        all_sprites.draw(screen)                   <---- ADD
    

    【讨论】:

    • 非常感谢,事实证明并非如此,我确实希望它们稍微偏离屏幕,但是当我用 (20, SCREEN_WIDTH+100) 在屏幕上渲染它们时,我注意到它们不是不动。真正的问题是我在 __init__(self) 函数中定义了我的 update(self) 函数
    猜你喜欢
    • 1970-01-01
    • 2019-06-29
    • 2019-03-27
    • 2021-12-07
    • 1970-01-01
    • 1970-01-01
    • 2020-03-15
    • 1970-01-01
    相关资源
    最近更新 更多