如何解决Pygame 精灵不会删除自己
我正在制作一个游戏,当精灵“炸弹”在 y 轴上低于 450 时,它应该被删除。
import pygame
BLACK = ( 0,0)
WHITE = (255,255,255)
RED = (255,0)
GREY = (129,129,129)
class SpriteSheet(object):
def __init__(self,file_name):
self.sprite_sheet = pygame.image.load(file_name).convert()
def get_image(self,x,y,width,height,colour):
image = pygame.Surface([width,height]).convert()
image.set_colorkey(colour)
image.blit(self.sprite_sheet,(0,0),(x,height))
return image
class Bomb(pygame.sprite.Sprite):
change_x =0
change_y = 0
def __init__(self):
super().__init__()
sprite_sheet = SpriteSheet("Untitled.png")
self.image = sprite_sheet.get_image(2,2,48,WHITE)
self.rect = self.image.get_rect()
def move(self,y):
self.rect.y += y
if self.rect.y > 450:
self.kill()
print (self.rect.y)
pygame.init()
screen_width = 1000
screen_height = 500
screen = pygame.display.set_mode([screen_width,screen_height])
pygame.display.set_caption("Game")
clock = pygame.time.Clock()
done = False
bomb = Bomb()
all_sprites = pygame.sprite.Group()
all_sprites.add(bomb)
while not done:
for event in pygame.event.get():
if event.type == pygame.QUIT:
done = True
screen.fill(WHITE)
all_sprites.draw(screen)
bomb.move(2)
clock.tick(60)
pygame.display.flip()
pygame.quit()
(请注意,我正在打印炸弹的 y 轴以检查它是否被删除。)我尝试使用“kill()”方法,但结果是,它确实 消失,但 y 轴继续打印,我认为这是不应该发生的。
我尝试在另一段代码中使用 kill() 方法。它被删除,y 轴停止打印。两个代码之间的唯一区别是,在这个代码中,我将图像块传输到屏幕上以用作精灵,而在那个代码中,我使用“Rect”来制作精灵。
有人可以指导我如何从内存中永久删除精灵吗,或者如果 y 轴的值一直在打印(应该删除精灵)是否可以?
解决方法
kill()
方法不会神奇地从内存中删除对象。它所做的只是从它的所有组中删除一个 Sprite。
因此在您的代码中,炸弹不再显示,因为在调用 all_sprites
后它不再位于 kill()
中。但是您仍然拥有对对象的引用 (bomb
),并且您仍然在对象上的每一帧调用 move
函数。因此执行 print
语句。
在调用 bomb
后,您希望 kill()
变量发生什么变化?
通常,您应该在名为 update
的方法中实现所有 sprite 逻辑,而不是直接调用该方法,而是通过 group 调用,就像 draw
方法一样。
像这样:
class Bomb(pygame.sprite.Sprite):
change_x =0
change_y = 0
def __init__(self):
super().__init__()
sprite_sheet = SpriteSheet("Untitled.png")
self.image = sprite_sheet.get_image(2,2,48,WHITE)
self.rect = self.image.get_rect()
self.speed = 2
def update(self,y):
self.rect.y += self.speed
if self.rect.y > 450:
self.kill()
print (self.rect.y)
...
all_sprites = pygame.sprite.Group()
all_sprites.add(Bomb())
while not done:
for event in pygame.event.get():
if event.type == pygame.QUIT:
done = True
screen.fill(WHITE)
all_sprites.draw(screen)
all_sprites.update()
clock.tick(60)
pygame.display.flip()
pygame.quit()
这样,在调用 kill()
之后,不会保留对该对象的引用(并且 Python 运行时最终会将其从内存中删除)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。