为什么 pygame 中的组列表必须具有 "update" 功能,而不是任何其他功能?
Why do group lists in pygame have to have "update" functions, and not any other?
我做了一个小颗粒应用,但我正在测试它,底部的功能必须称为“更新”。我以为函数名,就像变量一样,只是一个名字。我认为它的名字是什么并不重要,只要你叫它的时候是一样的。显然我错了。它只会识别“更新”。如果我将函数更改为“移动”,它将引发错误。谁能解释一下为什么会这样?
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)
It will only recognize "update". If I change the function to "move", it will throw an error.
当然可以。阅读 pygame.sprite.Group
.
的文档
pygame.sprite.Group.update()
and pygame.sprite.Group.draw()
是pygame.sprite.Group
.
提供的方法
前者委托给所包含的 pygame.sprite.Sprite
s 的 update
方法 - 您必须实现该方法。
Calls the update() method on all Sprites in the Group.
后者使用包含的 pygame.sprite.Sprite
的 image
和 rect
属性来绘制对象 - 您必须确保 pygame.sprite.Sprite
具有所需的属性
Draws the contained Sprites to the Surface argument. This uses the Sprite.image attribute for the source surface, and Sprite.rect for the position.
如果您想要一个与您自己的方法类似的机制,那么您必须实现您自己的 class 派生自 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()
我做了一个小颗粒应用,但我正在测试它,底部的功能必须称为“更新”。我以为函数名,就像变量一样,只是一个名字。我认为它的名字是什么并不重要,只要你叫它的时候是一样的。显然我错了。它只会识别“更新”。如果我将函数更改为“移动”,它将引发错误。谁能解释一下为什么会这样?
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)
It will only recognize "update". If I change the function to "move", it will throw an error.
当然可以。阅读 pygame.sprite.Group
.
pygame.sprite.Group.update()
and pygame.sprite.Group.draw()
是pygame.sprite.Group
.
提供的方法
前者委托给所包含的 pygame.sprite.Sprite
s 的 update
方法 - 您必须实现该方法。
Calls the update() method on all Sprites in the Group.
后者使用包含的 pygame.sprite.Sprite
的 image
和 rect
属性来绘制对象 - 您必须确保 pygame.sprite.Sprite
具有所需的属性
Draws the contained Sprites to the Surface argument. This uses the Sprite.image attribute for the source surface, and Sprite.rect for the position.
如果您想要一个与您自己的方法类似的机制,那么您必须实现您自己的 class 派生自 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()