Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Pygame精灵不删除自身_Python_Pygame_Sprite - Fatal编程技术网

Python Pygame精灵不删除自身

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

我正在做一个游戏,当精灵“炸弹”在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.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.我如何调用类中定义的函数?