如何在代码为 运行 时 Pygame 处理后删除一个 rect 对象?

How to I delete a rect object after Pygame processes it while the code is running?

我正在为 Pygame 中的一个角色制作动画,目前发生的情况是动画图像彼此重叠,底部的图像仍然可见(它们略微未对齐)。

这不是 sprite sheet,我知道它很受欢迎,所以我在网上收到的指导对我不起作用。每张图片都相互独立。

当我按下键时,图像确实在动画之后消失了;我只是想让 Pygame 按顺序删除图像,而不是在处理完所有图像后立即删除所有图像。

如有任何建议,我们将不胜感激!

注意:我尝试遍历一个列表,其中 j1-j8 变量是图片列表,并且 Pygame 正在快速移动以使移动成为察觉到,否则它似乎根本不起作用。

#####示例#######

    if event.type == pygame.KEYDOWN:
        if event.key == pygame.K_b:
           
          
            SCREEN.blit(j1, (char_x, char_y))
            time.sleep(.1)
            pygame.display.update()
            SCREEN.blit(j2, (char_x, char_y))
            time.sleep(.1)
            pygame.display.update()
            SCREEN.blit(j7, (char_x, char_y))
            time.sleep(.1)
            pygame.display.update()
            SCREEN.blit(j8, (char_x, char_y))
            time.sleep(.1)
            pygame.display.update()

典型的 pygame 主应用程序如下所示:

处理事件 → 更新游戏状态 → 绘制背景 → 绘制精灵 → 更新显示

通过重绘背景,您可以清除以前的图像,使动画更清晰。

如果您处理事件的时间过长,您的 window 经理会认为您的应用程序已崩溃。这就是不鼓励调用 time.sleep() 的原因。

如果您的 sprite 是动画的,那么您会希望它在满足其动画条件时在一组图像中循环。

这是一个示例脚本,其中包含一个每两秒更改一次图像的精灵。

import itertools
import random
import time
import pygame

# initialise screen
pygame.init()
screen = pygame.display.set_mode((320, 240))
pygame.display.set_caption("Animation Demo")
# load / create initial images
color = pygame.Color("blueviolet")
background = pygame.Color("white")
image_size = (50, 50)
square_img = pygame.Surface(image_size)
square_img.fill(color)
circle_img = pygame.Surface(image_size)
circle_img.fill(background)
pygame.draw.circle(circle_img, color, circle_img.get_rect().center, image_size[0] // 2)
triangle_img = pygame.Surface(image_size)
triangle_img.fill(background)
points = (0, image_size[0]), image_size, (image_size[1], 0)
pygame.draw.polygon(triangle_img, color, points)

images = itertools.cycle((square_img, circle_img, triangle_img))

class Shifter(pygame.sprite.Sprite):
    def __init__(self, pos):
        pygame.sprite.Sprite.__init__(self)
        self.pos = pos
        # select the initial image
        self.update_image()

    def update(self):
        """Cycle image if enough time has passed"""
        if time.time() - self.updated > 2:
            self.update_image()

    def update_image(self):
        """Change image and recenter"""
        self.image = next(images)
        self.rect = self.image.get_rect()
        self.rect.center = self.pos
        self.updated = time.time()

    def draw(self, screen):
        # Add this draw function so we can draw individual sprites
        screen.blit(self.image, self.rect)


# create a shape sprite in the center of the screen
shape = Shifter(screen.get_rect().center)
clock = pygame.time.Clock()

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

    # clear the screen
    screen.fill(background)
    # update sprites
    shape.update()
    # draw sprites
    shape.draw(screen)
    # refresh display
    pygame.display.update()
    clock.tick(60)  # limit to 60 FPS

pygame.quit()