当前位置: 首页 > 知识库问答 >
问题:

为什么pygame不能渲染我所有的精灵?

司信厚
2023-03-14

我正试图按照本教程学习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毫秒一次),它应该会显示一个向左移动的敌人,直到它到达显示的末尾。
我有一组敌人精灵和一组所有精灵,我使用screen.blit和for循环将所有精灵中的每个实体渲染到屏幕上。我错过了什么?当我运行这个(以及我编辑掉的部分)时,我看到玩家精灵很好,它移动了,但我没有看到任何敌人。

共有1个答案

莘睿
2023-03-14

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

random.randint(SCREEN_WIDTH20,SCREEN_WIDTH100)

random.randint(20, SCREEN_WIDTH + 100),

此外,缩进还有一个问题。方法更新需要是类Enemy的作用域:

class Enemy(pygame.sprite.Sprite):
    def __init__(self):
        # [...]

    # INDENTATION

    #<--|
    def update(self):
        # [...]

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

将包含的精灵绘制到Surface参数。这使用了源表面的Sprite.image属性和Sprite.rect。[...]

通过image重命名属性surf,并调用所有精灵。绘制(屏幕)

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
 类似资料:
  • 目前,当我运行它时,代码没有给出任何错误。即使我只是尝试渲染一个0,0的管道,没有任何弹出。 我已经得到了地板和鸟渲染正确,和其他一切工作正常。只有管道不会渲染。 我在看一段在线视频https://www.youtube.com/watch?v=UZg49z76cLw

  • 这是GitHub上的python项目,我正在为Magic 8 Ball模拟制作GUI。我似乎无法使用.pack()函数,或者我的窗口只是永远加载而没有实例化。 创建时 当我点击按钮时,文本会出现

  • 我遇到了这个简单的React函数组件,它渲染四次,而我希望它最初渲染一次,执行useffect更新状态,然后再次渲染。相反,控制台发送4个日志输出,表示它渲染了4次。了解react功能组件的基本生命周期的原因和资源吗? https://codesandbox.io/s/solitary-tree-t120d?file=/src/App.js:149-191

  • 问题内容: 我的React组件有问题。我组件的嵌套子代似乎没有渲染。这是我的代码: 我在此文件的顶部有以下两行: 这是我的组件: 我努力了: 以完整的HTML标记调用组件(打开和关闭) 将组件嵌套在组件中(在index.jsx文件中) 我知道嵌套组件是可能的。我已经看到了。由于某种原因,它对我不起作用。 问题答案: 要允许组件包含子项并正确渲染它们,必须使用。这是传递到所有组件与孩子为道具,包含组

  • 当我在基于pygame的游戏中使用精灵时,它们似乎不能正常工作——正如你在屏幕截图上看到的那样,它们的形状不正确,并且上部有一些奇怪的变形。 黑色方块顶部有变形;中间的精灵一定是箭头形状的东西。 加载图像时涉及的一段代码(从pygame的教程中复制粘贴): 我在MacOSX上的Python2.7.11和3.4.2上做了我的项目,发现了这个问题。但当我在Windows上的Python3.1上测试它时

  • 问题内容: 输入不存在的URL时,我尝试呈现组件。但是,该组件会在所有路径中保持渲染。我正在使用。这是我设置的路线: 这是我的组件: 我当前面临的问题是消息:更改URL时,在和路由上不断弹出。我很难使消息仅在未定义的路线上显示。最初,我尝试切换路线,并在顶部创建更“详细”的路线,如下所示: 但是,它没有解决问题。有没有一种方法可以防止消息出现在我去的每条路由上(未定义的路由除外)? 问题答案: 您