Python Pygame精灵不删除自身
我正在做一个游戏,当精灵“炸弹”在y轴上低于450时,它应该被删除Python Pygame精灵不删除自身,python,pygame,sprite,Python,Pygame,Sprite,我正在做一个游戏,当精灵“炸弹”在y轴上低于450时,它应该被删除 import pygame BLACK = ( 0, 0, 0) WHITE = (255, 255, 255) RED = (255, 0, 0) GREY = (129, 129, 129) class SpriteSheet(object): def __init__(self, file_name): self.sprite_sheet = pygame.image.loa
import pygame
BLACK = ( 0, 0, 0)
WHITE = (255, 255, 255)
RED = (255, 0, 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, y, width, 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, 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()
之后,炸弹不再位于all\u sprite
中。但是仍然有对对象的引用(bomb
),并且仍然在对象上的每一帧调用move
函数。因此执行print
语句
调用kill()
后,您的bomb
变量会发生什么变化
通常,您应该在一个名为的方法中实现所有sprite逻辑,而不是直接调用此方法,而是通过组调用,就像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, 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运行时最终会将其从内存中删除)。我理解这一点,但有没有办法将其从内存中永久删除?正如我在回答中所说的,不要保留对该对象的另一个引用。使用组管理您的精灵。我已经在使用组了。你能再解释一下吗?如果我这样做,(all_sprites.add(Bomb()),1.我能同时创建多个这样的Bomb吗?2.我如何调用类中定义的函数?