如何在代码为 运行 时 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()
我正在为 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()