Вопрос:
Я пытаюсь заставить астероиды спуститься сверху вниз в нижнюю часть экрана, а затем исчезнуть. Для этого я сделал несколько объектов класса Asteroid, но впоследствии их не удалять.
A = [] while gameLoop: … a = Asteroid() A.append(a)’ for i in A: i.move() if i.pos > dWidth: del i # This doesn’t remove the object
Есть ли способ удалить их?
Лучший ответ:
Вам необходимо реализовать метод delete в классе Asteroid и вызвать i.delete() в вашем if.
Как удалить зависит от того, как они отображаются в первую очередь.
Ответ №1
В pygame ваши объекты обычно должны быть подклассами pygame.sprite.Sprite и должны храниться в группах спрайтов, которые позволяют вам обновлять и отображать все содержащиеся спрайты, вызывая методы update и draw. Вы можете удалить спрайты из соответствующих групп, вызвав их метод kill.
В этом примере я добавляю спрайты Projectile к группе all_sprites каждого кадра и kill их, если они находятся за пределами game_area rect. pygame.Rect имеют метод contains который вы можете использовать, чтобы проверить, находится ли один прямоугольник внутри другого прямоугольника. Кроме того, вы можете просто проверить, меньше ли атрибутов rect x или y меньше, чем ширина и высота экрана.
import random import pygame as pg from pygame.math import Vector2 class Projectile(pg.sprite.Sprite): def __init__(self, pos, game_area): super().__init__() self.image = pg.Surface((5, 5)) self.image.fill(pg.Color(‘aquamarine2’)) self.rect = self.image.get_rect(center=pos) self.vel = Vector2(2, 0).rotate(random.randrange(360)) self.pos = Vector2(pos) self.game_area = game_area def update(self): self.pos += self.vel self.rect.center = self.pos if not self.game_area.contains(self.rect): self.kill() def main(): screen = pg.display.set_mode((640, 480)) game_area = pg.Rect(60, 60, 520, 360) game_area_color = pg.Color(‘aquamarine2’) clock = pg.time.Clock() all_sprites = pg.sprite.Group(Projectile(game_area.center, game_area)) done = False while not done: for event in pg.event.get(): if event.type == pg.QUIT: done = True all_sprites.add(Projectile(game_area.center, game_area)) all_sprites.update() screen.fill((30, 30, 30)) all_sprites.draw(screen) pg.draw.rect(screen, game_area_color, game_area, 2) pg.display.flip() clock.tick(60) if __name__ == ‘__main__’: pg.init() main() pg.quit()