微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Pygame 精灵不会删除自己

如何解决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 举报,一经查实,本站将立刻删除。