如何在Pygame中删除已绘制对象?使用remove()、delete()报错如何解决?
Pygame 删除绘制对象解决方案
核心原因
pygame.Rect类本身不提供delete()、remove()方法,直接调用会触发属性错误- Pygame 采用逐帧重绘的渲染逻辑:
pygame.draw生成的内容仅作用于当前帧画布,没有可主动删除的独立绘制对象实例,只要不在对应帧渲染对应元素即可实现“删除”效果。
修复代码
你可以通过新增标志位控制元素是否渲染,修改后的可运行代码如下:
import pygame pygame.init() VEL = 5 SCREEN = pygame.display.set_mode((800,600)) pygame.display.set_caption("The test") Clock = pygame.time.Clock() Rect = pygame.Rect(500,300,30,30) Rect1= pygame.Rect(300,300,30,30) Run = True # 控制绿色矩形是否显示的标志位 show_green_rect = True def Collide() : global show_green_rect if Rect1.colliderect(Rect): show_green_rect = False while Run : Clock.tick(60) for event in pygame.event.get(): if event.type == pygame.QUIT: Run = False SCREEN.fill((83,83,83)) # 仅标志位为真时绘制绿色矩形 if show_green_rect: pygame.draw.rect(SCREEN,(0,255,0),Rect) pygame.draw.rect(SCREEN,(255,0,0),Rect1) KEY_PRESSED = pygame.key.get_pressed() # 仅矩形显示时响应移动操作,不需要可删除该判断 if show_green_rect: if KEY_PRESSED[pygame.K_RIGHT] and Rect.x+VEL+ Rect.height<800: Rect.x +=VEL if KEY_PRESSED[pygame.K_LEFT] and Rect.x-VEL>0: Rect.x -=VEL if KEY_PRESSED[pygame.K_UP] and Rect.y-VEL>0: Rect.y -=VEL if KEY_PRESSED[pygame.K_DOWN] and Rect.y+VEL+ Rect.height<600: Rect.y +=VEL Collide() pygame.display.flip() pygame.quit()
多元素场景优化
如果需要管理大量可删除的绘制对象,可以将所有对象存入列表,碰撞时直接从列表移除对应元素,每帧遍历列表绘制即可,无需单独维护多个标志位。
内容的提问来源于stack exchange,提问作者Pujan_OP
相关产品推荐
相关产品推荐

