单击时如何让精灵消失?
How to get a sprite to disappear when clicked?
我正在做一个弹出气球的游戏,希望气球在点击时消失。我在主循环中有一个爆炸 class 和一个事件,它正确地检查精灵的位置,然后在鼠标单击气球时显示爆炸动画。尽管如此,原来的气球精灵仍然从屏幕上掉下来。
这是气球CLASS
class Balloon(pygame.sprite.Sprite):
def __init__(self,img):
super(Balloon,self).__init__()
self.image=pygame.image.load(img).convert_alpha()
self.image=pygame.transform.scale(self.image,(40,40))
self.speed = random.randint(1,4)
self.rect=self.image.get_rect()
self.rect.x= random.randrange(screen_width)
self.rect.y= 0
def update(self):
for event in pygame.event.get():
if event.type==pygame.MOUSEBUTTONDOWN:
pos = pygame.mouse.get_pos()
for sprite in balloongroup:
if sprite.rect.collidepoint(pos):
self.kill()
self.rect.y+=self.speed
if self.rect.bottom >screen_height:
self.kill()
现在是主循环:
def start():
#explosion_group.update()
#explosion_group.empty()
balloongroup.empty()
allsprites.empty()
#basket=createBasket()
while True:
clock.tick(fps)
for event in pygame.event.get():
if event.type==QUIT:
return
explosion_group.update()
if event.type==pygame.MOUSEBUTTONDOWN:
pos = pygame.mouse.get_pos()
for sprite in balloongroup:
if sprite.rect.collidepoint(pos):
explosion = Explosion(pos[0], pos[1])
explosion_group.add(explosion)
allsprites.add(explosion)
explosion_group.draw(screen)
screen.fill((0,0,0)) # <--------------- here
screen.blit(pygame.image.load("background.jpg"),(0,0))
balloongroup.update()
if random.randrange(100)<2:
create_balloon()
allsprites.draw(screen)
clock.tick(60)
pygame.display.update()
我认为在气球 class 的更新方法中添加事件会起作用,但可惜它不起作用。我不知道从哪里开始。
首先,请注意您的事件循环不正确。您必须在循环中处理所有事件:
def start():
# [...]
while True:
# [...]
for event in pygame.event.get():
if event.type == QUIT:
return
if event.type == pygame.MOUSEBUTTONDOWN:
for sprite in balloongroup:
if sprite.rect.collidepoint(event.pos):
explosion = Explosion(*event.pos)
explosion_group.add(explosion)
allsprites.add(explosion)
explosion_group.draw(screen)
explosion_group.update()
切勿在应用程序循环中多次调用 pygame.event.get()
。参见 。
为什么不显示爆炸而不是精灵? kill
创建blast对象时的精灵:
def start():
# [...]
while True:
# [...]
for event in pygame.event.get():
if event.type == QUIT:
return
if event.type == pygame.MOUSEBUTTONDOWN:
for sprite in balloongroup:
if sprite.rect.collidepoint(event.pos):
srite.kill() # <----------
explosion = Explosion(event.pos[0], event.pos[1])
# [...]
或者您可以 kill
爆炸动画结束时的精灵。将精灵传递给爆炸 class 并在动画结束时 kill
传递给它:
class Explosion(pygame.sprite.Sprite):
def __init__(self, x, y, target):
pygame.sprite.Sprite.__init__(self)
# [...]
self.target = target
def update(self):
# [...]
if self.index < len(self.red):
self.image = self.red[self.index]
else:
self.kill()
self.target.kill()
def start():
# [...]
while True:
# [...]
for event in pygame.event.get():
if event.type == QUIT:
return
if event.type == pygame.MOUSEBUTTONDOWN:
for sprite in balloongroup:
if sprite.rect.collidepoint(event.pos):
explosion = Explosion(event.pos[0], event.pos[1], sprite) # <---
我正在做一个弹出气球的游戏,希望气球在点击时消失。我在主循环中有一个爆炸 class 和一个事件,它正确地检查精灵的位置,然后在鼠标单击气球时显示爆炸动画。尽管如此,原来的气球精灵仍然从屏幕上掉下来。
这是气球CLASS
class Balloon(pygame.sprite.Sprite):
def __init__(self,img):
super(Balloon,self).__init__()
self.image=pygame.image.load(img).convert_alpha()
self.image=pygame.transform.scale(self.image,(40,40))
self.speed = random.randint(1,4)
self.rect=self.image.get_rect()
self.rect.x= random.randrange(screen_width)
self.rect.y= 0
def update(self):
for event in pygame.event.get():
if event.type==pygame.MOUSEBUTTONDOWN:
pos = pygame.mouse.get_pos()
for sprite in balloongroup:
if sprite.rect.collidepoint(pos):
self.kill()
self.rect.y+=self.speed
if self.rect.bottom >screen_height:
self.kill()
现在是主循环:
def start():
#explosion_group.update()
#explosion_group.empty()
balloongroup.empty()
allsprites.empty()
#basket=createBasket()
while True:
clock.tick(fps)
for event in pygame.event.get():
if event.type==QUIT:
return
explosion_group.update()
if event.type==pygame.MOUSEBUTTONDOWN:
pos = pygame.mouse.get_pos()
for sprite in balloongroup:
if sprite.rect.collidepoint(pos):
explosion = Explosion(pos[0], pos[1])
explosion_group.add(explosion)
allsprites.add(explosion)
explosion_group.draw(screen)
screen.fill((0,0,0)) # <--------------- here
screen.blit(pygame.image.load("background.jpg"),(0,0))
balloongroup.update()
if random.randrange(100)<2:
create_balloon()
allsprites.draw(screen)
clock.tick(60)
pygame.display.update()
我认为在气球 class 的更新方法中添加事件会起作用,但可惜它不起作用。我不知道从哪里开始。
首先,请注意您的事件循环不正确。您必须在循环中处理所有事件:
def start():
# [...]
while True:
# [...]
for event in pygame.event.get():
if event.type == QUIT:
return
if event.type == pygame.MOUSEBUTTONDOWN:
for sprite in balloongroup:
if sprite.rect.collidepoint(event.pos):
explosion = Explosion(*event.pos)
explosion_group.add(explosion)
allsprites.add(explosion)
explosion_group.draw(screen)
explosion_group.update()
切勿在应用程序循环中多次调用 pygame.event.get()
。参见
为什么不显示爆炸而不是精灵? kill
创建blast对象时的精灵:
def start():
# [...]
while True:
# [...]
for event in pygame.event.get():
if event.type == QUIT:
return
if event.type == pygame.MOUSEBUTTONDOWN:
for sprite in balloongroup:
if sprite.rect.collidepoint(event.pos):
srite.kill() # <----------
explosion = Explosion(event.pos[0], event.pos[1])
# [...]
或者您可以 kill
爆炸动画结束时的精灵。将精灵传递给爆炸 class 并在动画结束时 kill
传递给它:
class Explosion(pygame.sprite.Sprite):
def __init__(self, x, y, target):
pygame.sprite.Sprite.__init__(self)
# [...]
self.target = target
def update(self):
# [...]
if self.index < len(self.red):
self.image = self.red[self.index]
else:
self.kill()
self.target.kill()
def start():
# [...]
while True:
# [...]
for event in pygame.event.get():
if event.type == QUIT:
return
if event.type == pygame.MOUSEBUTTONDOWN:
for sprite in balloongroup:
if sprite.rect.collidepoint(event.pos):
explosion = Explosion(event.pos[0], event.pos[1], sprite) # <---