如何在不使用 SpriteGroups 的情况下从内存中删除 pygame 中的图像?

How to remove an image from memory in pygame without using SpriteGroups?

我正在尝试从内存中删除图像以提高我的代码效率而不使用 SpriteGroup,因为我不熟悉该概念。

import pygame
import sys
pygame.init()

#constants
LENGTH = 454
SCREEN = pygame.display.set_mode((LENGTH, LENGTH))


def show(img, x, y):
    image = pygame.image.load(img)
    SCREEN.blit(image, (x, y))


def home():
    show('image1.png', 10, 10)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_SPACE:
                #code to remove the image
                pass


def main():
    while True:
        SCREEN.fill((0, 0, 0))
        home()
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()
        pygame.display.update()


main()

这是一个简单的最小代码,可以使问题尽可能普遍。所有这些代码所做的就是在按下 space 时删除图像。 早些时候我尝试通过将它带到屏幕外来接近它, 或者只是在其上渲染其他对象。 但是图像并没有完全删除我不仅要从播放中删除它,还要从内存中删除它。

从过去几天开始,'www.pygame.org' 网站一直处于团结状态,因此无法参考文档

您的代码中存在多个问题。

pygame.event.get() 获取所有消息并将它们从队列中删除。请参阅文档:

This will get all the messages and remove them from the queue. [...]

如果在多个事件循环中调用pygame.event.get(),则只有一个循环接收事件,而不是所有循环都接收所有事件。结果,一些事件似乎被遗漏了。每帧获取一次事件并在多个循环中使用它们或将事件列表传递给处理它们的函数和方法(参见 )。

不加载每帧图像。 pygame.image.load 是一个非常昂贵的操作。它必须从卷中加载图像并解释图像数据。在初始化时加载一次图像。

删除图像就是不绘制图像。设置 image = None 并只绘制图像 if image != None。使用 global statement 在函数内更改 gloabl 命名空间中的变量:

import pygame
import sys
pygame.init()

#constants
LENGTH = 454
SCREEN = pygame.display.set_mode((LENGTH, LENGTH))

image = pygame.image.load('image1.png')

def show(img, x, y):
    SCREEN.blit(img, (x, y))

def home(event_list):
    global image
    for event in event_list:
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_SPACE:
                image = None

    if image:
        show(image, 10, 10)

def main():
    run = True
    while run:
        event_list = pygame.event.get()
        for event in event_list:
            if event.type == pygame.QUIT:
                run = False

        SCREEN.fill((0, 0, 0))
        home(event_list)
        pygame.display.update()

    pygame.quit()
    sys.exit()

main()