【问题标题】:Pygame - Limiting instances of spritesPygame - 限制精灵的实例
【发布时间】:2013-04-09 19:35:56
【问题描述】:

我正在使用一个关于精灵生成的示例,用于我正在开发的空间卷轴射击。通过慢慢尝试了解它是如何工作的,我设法让多个精灵横穿屏幕。但是,会生成许多精灵。

所以我遇到的问题是限制精灵的初始数量,而不是代码产生的数量。我曾想过使用if sprites.__len__ < 10: sprites.add(drone),但当我尝试时,它不起作用。

我的想法是,每次循环时,它都会检查组中精灵的数量,如果少于 10 个,则将一个精灵添加到组中,直到达到 10。这样,如果它离开屏幕或者是销毁,然后它会继续检查并保持不变。

这是播放器类:

class Player(pygame.sprite.Sprite):
    def __init__(self, *groups):
        super(Player, self).__init__(*groups)
        self.image = pygame.image.load('player.png')
        self.rect = pygame.rect.Rect((screen_width, (random.randrange(0,screen_height))), self.image.get_size())
        self.dx = -10
        self.pos = random.randrange(0,screen_height)

    def update(self):
       self.rect.centerx += self.dx

       if self.rect.right < 0:
           self.kill()

这是关于添加精灵的部分。

        sprites.update()
        screen.fill((200, 200, 200))
        sprites.draw(screen)


        drone = Player()
        self.y = random.randrange(0,screen_height)
        sprites.add(drone)

        pygame.display.flip()

这可能很明显,但我仍在学习,所以指导会很棒。

第二个问题 - 更多的是对思想的确认。如果我不希望精灵在屏幕底部绘制一半。我基本上是说如果self.rect.bottom > screen_height,那么定位精灵@screen_height

完整来源:http://pastebin.com/PLRVHtxz

编辑 - 我想我已经解决了,只需要让精灵运行更流畅。

while 1:
            clock.tick(40)
            numberAlien = 5

            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    return
                if event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE:
                    return


                sprites.update()
                screen.fill((200, 200, 200))
                sprites.draw(screen)


                drone = Player()
                if sprites.__len__() < numberAlien:
                    self.y = random.randrange(0,screen_height)
                    sprites.add(drone)

                pygame.display.flip()

【问题讨论】:

  • 那你有什么问题?
  • 对不起,基本上是,如何让一定数量的精灵顺利通过屏幕。
  • 这可能会有所帮助,但不是完整的解决方案:if not_in_bounds(sprite): sprite.die() 自动删除您不再需要的任何内容。
  • 注意:如果您为每个项目符号创建Player 的实例,它每次都会加载一个 new 的 png 图像副本。你可以创建一个纹理字典,这样你就不会重复了。

标签: pygame sprite


【解决方案1】:

你可以继承SpriteGroup,添加一个新的精灵总数字段,并在add方法中检查是否可以添加。 您不应该使用 __ 测试检查任何变量。

至于运动,我相信,因为clock.tick(40),你看不到平滑的运动。 它等待 40 毫秒,直到它恢复运行。您可以将刻度减少到 10,并调整您为精灵更改的 dx,或者尝试更通用的方法。

对clock.tick() 的调用返回自上次调用以来的毫秒数。这将是您的时间增量。然后,您可以拥有一个全局 SPEED。要移动的像素数量将从SPEED * delta 计算得出。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-09-14
  • 1970-01-01
  • 1970-01-01
  • 2023-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多