【问题标题】:Why do group lists in pygame have to have "update" functions, and not any other?为什么 pygame 中的组列表必须具有“更新”功能,而没有其他功能?
【发布时间】:2020-11-14 14:53:41
【问题描述】:

我做了一个小粒子应用程序,但我正在测试它,底部的功能必须称为“更新”。我认为函数名称,就像变量一样,只是一个名称。我认为它的名字并不重要,只要你叫它时它是一样的。显然我错了。它只会识别“更新”。如果我将函数更改为“移动”,它将引发错误。有人能解释一下为什么会这样吗?

import pygame
import random
pygame.init()
win_height=600
win_width=800
win=pygame.display.set_mode((win_width,win_height))
pygame.display.set_caption("List practice")
white=(255,255,255)
black=(0,0,0)
clock=pygame.time.Clock()

class particle_class(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image=pygame.Surface((25,25))
        self.image.fill(white)
        self.rect=self.image.get_rect()
        self.speed=0
    def update(self):
        self.rect.y+=self.speed
        
particles=pygame.sprite.Group()

for i in range(10):
    particle=particle_class()
    particle.speed=random.randrange(5,11)
    particle.rect.y=0
    particle.rect.x=random.randrange(0,win_width+1)
    particles.add(particle)

while True:
    clock.tick(60)
    for event in pygame.event.get():
        if event.type==pygame.QUIT:
            pygame.quit()
    win.fill(black)
    particles.update()
    particles.draw(win)
    pygame.display.update()
    for particle in particles:
        if particle.rect.y>win_height:
            particle.rect.y=0
            particle.speed=random.randrange(5,11)
            particle.rect.x=random.randrange(0,win_width+1)

【问题讨论】:

  • 你是对的;他们只是名字。但这是pygame.sprite.Group 检查的名称。所以从这个意义上说,这并不是什么特别的事情,只是制作库的人想让你的事情变得更容易,并说“如果他们使用名为 update 的方法将对象添加到组中,那么我们将调用它来更新对象”。

标签: python list function pygame sprite


【解决方案1】:

它只会识别“更新”。如果我将函数更改为“移动”,则会引发错误。

当然可以。阅读pygame.sprite.Group的文档。

pygame.sprite.Group.update()pygame.sprite.Group.draw()pygame.sprite.Group提供的方法。
前者委托给包含的pygame.sprite.Spritesupdate 方法 - 你必须实现该方法。

pygame.sprite.Group.update()

对组中的所有 Sprite 调用 update() 方法。

后者使用包含的pygame.sprite.Sprites 的imagerect 属性来绘制对象-您必须确保pygame.sprite.Sprites 具有所需的属性

pygame.sprite.Group.draw()

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


如果你想用你自己的方法实现类似的机制,那么你必须实现你自己的从pygame.sprite.Group派生的类。例如:

class MyGroup(pygame.sprite.Group):

    def __init__(self, *args):
        super().__init__(*args) 

    def move(self):
        for sprite in self:
            sprite.move()
class particle_class(pygame.sprite.Sprite):
    # [...]

    def move(self):
        self.rect.y+=self.speed
particles = MyGroup()

for i in range(10):
    particle=particle_class()
    particle.speed=random.randrange(5,11)
    particle.rect.y=0
    particle.rect.x=random.randrange(0,win_width+1)
    particles.add(particle)
particles.move()

【讨论】:

  • @ree 我已经扩展了答案。
猜你喜欢
  • 1970-01-01
  • 2014-06-09
  • 1970-01-01
  • 2015-10-21
  • 2021-12-08
  • 2019-09-27
  • 2018-12-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多