关于使用pygame和Python时释放内存

时间:2017-10-30 09:15:35

标签: python pygame

例如,射弹飞离屏幕,程序是否仍在计算其位置,速度等?

如果是的话,如何释放它?

import pygame
from pygame.locals import *
from sys import exit

pygame.init()

screen = pygame.display.set_mode((640, 480), 0, 32)

background = pygame.image.load(background_image_filename).convert()
sprite = pygame.image.load(sprite_image_filename)


x = 0.

while True:

    for event in pygame.event.get():
        if event.type == QUIT:
            exit()

    screen.blit(background, (0,0))
    screen.blit(sprite, (x, 100))
    x+= 10.
    pygame.display.update()

2 个答案:

答案 0 :(得分:1)

是的,但由于你只有一个射弹(使用x增加),你可以使用一些if语句轻松选择做什么。当有多个射弹(你需要存放在一个容器中)时,这个过程会变得更加困难,你应该应用它。

这是一个例子

for projectile in projectile_list:

    # Check if the position is inside the screen
    if 0 < projectile.x < WIDTH and 0 < projectile.y < HEIGHT:
         # Do position operations

这样,您只需处理所需内容。您可以应用类似的方法从列表或您正在使用的任何容器中移除未使用的射弹。

答案 1 :(得分:1)

是的,仍然需要计算位置,速度等,否则屏幕外的任何物体都不能再次进入屏幕区域。 Pygame非常聪明,不会尝试渲染这些对象。

通常建议使用pygame sprites and sprite groups,只需拨打self.kill()即可删除精灵。您也可以使用列表或集来存储对象,但是您必须自己编写更多代码。

因此,我首先定义一个pygame.Rectgame_area),其大小与屏幕相同或稍大一些(在下面的示例中,我使用较小的一个)。 Rects有一个contains方法,你可以用它来检查你的精灵的矩形是否在game_area矩形内。如果精灵在外面,只需调用self.kill(),pygame将从所有相关的精灵组中删除精灵。

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()