爆炸动画的问题
Trouble with explosion animation
这是我的爆炸 class:我觉得我以适当的方式循环浏览列表,但索引永远不会超过 0,除非我最初将其设置为 self.index
的不同内容。在我的游戏循环中,我设置了鼠标检测,当我单击掉落的气球时,图像仅更改为第一张爆炸图片,而不是循环遍历列表中的所有三个 self.red
class Explosion(pygame.sprite.Sprite):
def __init__(self, x, y):
pygame.sprite.Sprite.__init__(self)
self.red = [pygame.image.load('redImg1.png'),pygame.image.load('redImg2.png'),pygame.image.load('redImg3.png')]
self.index = 0
self.image = self.red[self.index]
self.rect = self.image.get_rect()
self.rect.center = [x, y]
self.counter = 0
def update(self):
self.counter += 1
explosion_speed = 4
#update explosion animation
if self.counter >= explosion_speed and self.index < len(self.red) - 1:
self.image = self.red[self.index]
self.index += 1
#if the animation is complete, reset animation index
if self.index >= len(self.red) - 1 and self.counter >= explosion_speed:
self.kill()
我为我的爆炸制作了一个精灵组 class 这是它在主游戏循环中的实现。
explosion_group=pygame.sprite.Group()
screen.blit(pygame.image.load("background.jpg"),(0,0))
def start():
balloongroup.empty()
allsprites.empty()
while True:
for event in pygame.event.get():
if event.type==QUIT:
return
if event.type==pygame.MOUSEBUTTONDOWN:
pos = pygame.mouse.get_pos()
explosion = Explosion(pos[0], pos[1])
allsprites.add(explosion)
explosion_group.update()
您必须将精灵添加到 explosion_group
。爆炸在连续帧中进行动画处理。因此必须在应用程序循环中调用explosion_group.update()
:
run = True
while run:
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
if event.type == pygame.MOUSEBUTTONDOWN:
explosion = Explosion(event.pos[0], event.pos[1])
explosion_group.add(explosion)
allsprites.add(explosion)
explosion_group.update()
# [...]
kill
永远不会被调用。 update
需要重新设计:
class Explosion(pygame.sprite.Sprite):
# [...]
def update(self):
self.counter += 1
explosion_speed = 4
if self.counter >= explosion_speed:
self.index += 1
self.counter = 0
if self.index < len(self.red):
self.image = self.red[self.index]
else:
self.kill()
我建议限制每秒的帧数。使用 pygame.time.Clock
控制每秒帧数,从而控制游戏速度。
方法tick()
of a pygame.time.Clock
object, delays the game in that way, that every iteration of the loop consumes the same period of time. See pygame.time.Clock.tick()
:
This method should be called once per frame.
例如:
clock = pygame.time.Clock()
while True:
clock.tick(60)
最小示例:
import pygame
class Explosion(pygame.sprite.Sprite):
def __init__(self, x, y):
pygame.sprite.Sprite.__init__(self)
#self.red = [pygame.image.load('redImg1.png'),pygame.image.load('redImg2.png'),pygame.image.load('redImg3.png')]
self.red = img_list
self.index = 0
self.image = self.red[self.index]
self.rect = self.image.get_rect()
self.rect.center = [x, y]
self.counter = 0
def update(self):
self.counter += 1
explosion_speed = 2
if self.counter >= explosion_speed:
self.index += 1
self.counter = 0
if self.index < len(self.red):
self.image = self.red[self.index]
else:
self.kill()
pygame.init()
window = pygame.display.set_mode((400, 400))
clock = pygame.time.Clock()
img_list = []
for i in range(0, 250, 10):
img_list.append(pygame.Surface((80, 80), pygame.SRCALPHA))
pygame.draw.circle(img_list[-1], (255, 255-i, 0), (40, 40), round(1 + 39 * (250-i) / 250))
explosion_group = pygame.sprite.Group()
run = True
while run:
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
if event.type == pygame.MOUSEBUTTONDOWN:
explosion = Explosion(event.pos[0], event.pos[1])
explosion_group.add(explosion)
#allsprites.add(explosion)
explosion_group.update()
window.fill(0)
explosion_group.draw(window)
pygame.display.flip()
clock.tick(100)
pygame.quit()
exit()
这是我的爆炸 class:我觉得我以适当的方式循环浏览列表,但索引永远不会超过 0,除非我最初将其设置为 self.index
的不同内容。在我的游戏循环中,我设置了鼠标检测,当我单击掉落的气球时,图像仅更改为第一张爆炸图片,而不是循环遍历列表中的所有三个 self.red
class Explosion(pygame.sprite.Sprite):
def __init__(self, x, y):
pygame.sprite.Sprite.__init__(self)
self.red = [pygame.image.load('redImg1.png'),pygame.image.load('redImg2.png'),pygame.image.load('redImg3.png')]
self.index = 0
self.image = self.red[self.index]
self.rect = self.image.get_rect()
self.rect.center = [x, y]
self.counter = 0
def update(self):
self.counter += 1
explosion_speed = 4
#update explosion animation
if self.counter >= explosion_speed and self.index < len(self.red) - 1:
self.image = self.red[self.index]
self.index += 1
#if the animation is complete, reset animation index
if self.index >= len(self.red) - 1 and self.counter >= explosion_speed:
self.kill()
我为我的爆炸制作了一个精灵组 class 这是它在主游戏循环中的实现。
explosion_group=pygame.sprite.Group()
screen.blit(pygame.image.load("background.jpg"),(0,0))
def start():
balloongroup.empty()
allsprites.empty()
while True:
for event in pygame.event.get():
if event.type==QUIT:
return
if event.type==pygame.MOUSEBUTTONDOWN:
pos = pygame.mouse.get_pos()
explosion = Explosion(pos[0], pos[1])
allsprites.add(explosion)
explosion_group.update()
您必须将精灵添加到 explosion_group
。爆炸在连续帧中进行动画处理。因此必须在应用程序循环中调用explosion_group.update()
:
run = True
while run:
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
if event.type == pygame.MOUSEBUTTONDOWN:
explosion = Explosion(event.pos[0], event.pos[1])
explosion_group.add(explosion)
allsprites.add(explosion)
explosion_group.update()
# [...]
kill
永远不会被调用。 update
需要重新设计:
class Explosion(pygame.sprite.Sprite):
# [...]
def update(self):
self.counter += 1
explosion_speed = 4
if self.counter >= explosion_speed:
self.index += 1
self.counter = 0
if self.index < len(self.red):
self.image = self.red[self.index]
else:
self.kill()
我建议限制每秒的帧数。使用 pygame.time.Clock
控制每秒帧数,从而控制游戏速度。
方法tick()
of a pygame.time.Clock
object, delays the game in that way, that every iteration of the loop consumes the same period of time. See pygame.time.Clock.tick()
:
This method should be called once per frame.
例如:
clock = pygame.time.Clock()
while True:
clock.tick(60)
最小示例:
import pygame
class Explosion(pygame.sprite.Sprite):
def __init__(self, x, y):
pygame.sprite.Sprite.__init__(self)
#self.red = [pygame.image.load('redImg1.png'),pygame.image.load('redImg2.png'),pygame.image.load('redImg3.png')]
self.red = img_list
self.index = 0
self.image = self.red[self.index]
self.rect = self.image.get_rect()
self.rect.center = [x, y]
self.counter = 0
def update(self):
self.counter += 1
explosion_speed = 2
if self.counter >= explosion_speed:
self.index += 1
self.counter = 0
if self.index < len(self.red):
self.image = self.red[self.index]
else:
self.kill()
pygame.init()
window = pygame.display.set_mode((400, 400))
clock = pygame.time.Clock()
img_list = []
for i in range(0, 250, 10):
img_list.append(pygame.Surface((80, 80), pygame.SRCALPHA))
pygame.draw.circle(img_list[-1], (255, 255-i, 0), (40, 40), round(1 + 39 * (250-i) / 250))
explosion_group = pygame.sprite.Group()
run = True
while run:
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
if event.type == pygame.MOUSEBUTTONDOWN:
explosion = Explosion(event.pos[0], event.pos[1])
explosion_group.add(explosion)
#allsprites.add(explosion)
explosion_group.update()
window.fill(0)
explosion_group.draw(window)
pygame.display.flip()
clock.tick(100)
pygame.quit()
exit()