Pygame Sprite元素未更新 单元格颜色交换动画静态失效
Pygame随机交换单元格颜色动画静态无效果修复
问题现象
运行代码后仅能渲染初始状态的10*10彩色单元格网格,预设的每帧随机交换两个单元格颜色的逻辑无视觉反馈,界面全程保持静态。
根因分析
代码存在3个核心逻辑错误:
- Sprite更新方法不匹配:
pygame.sprite.Group.update()默认只会调用组内所有Sprite对象的无参update()方法,但颜色重绘逻辑写在自定义的update_rect()方法中,颜色交换后Sprite的表面图像从未被更新 - 主循环缺失重绘步骤:仅在进入主循环前执行了一次
sprites_group.draw(window),主循环内即使Sprite数据更新,也没有重新把最新内容绘制到窗口上,显示的始终是第一帧内容 - 单元格坐标赋值错位:生成单元格对象时错误将行号
i作为x坐标、列号j作为y坐标,会导致单元格id和实际位置不匹配
修复方案
- 为
sprite_CELL类添加标准update()方法,内部调用已有的update_rect()逻辑,让组更新操作可以触发颜色重绘 - 在主循环每次完成Sprite更新后,重新执行Sprite组绘制操作,把最新帧渲染到窗口
- 修正单元格初始化时的x/y参数映射,列号对应x轴、行号对应y轴
修正后可运行代码
import random import pygame import sys colors = [(77,2,6),(180,5,180),(140,180,11)] class CELL () : def __init__ (self,x,y,ide): self.color = random.choice(colors) self.ide = ide self.x = x self.y = y n, m = 10, 10 block_width, block_height = 50, 50 win_width, win_height = block_width*m, block_height*n cells = {} for i in range(n): for j in range(m): # 修复坐标映射错误:j为列对应x,i为行对应y cells[i*m+j] = CELL(j,i,i*m+j) class sprite_CELL (pygame.sprite.Sprite): def __init__ (self,cell_obj): pygame.sprite.Sprite.__init__(self) self.cell = cell_obj self.image = pygame.Surface([block_width,block_height]) self.update_rect() # 新增标准update方法,供Group.update()调用 def update(self): self.update_rect() def update_rect (self): self.image.fill(self.cell.color) self.rect = self.image.get_rect() self.rect.topleft = [self.cell.x*block_width, self.cell.y*block_height] sprites_group = pygame.sprite.Group() for cell in cells.values(): sprites_group.add(sprite_CELL(cell)) pygame.init() clock = pygame.time.Clock() window = pygame.display.set_mode((win_width, win_height)) while True: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() sys.exit() rand_cell_a = random.choice(list(cells.values())) rand_cell_b = random.choice(list(cells.values())) color_a = rand_cell_a.color color_b = rand_cell_b.color rand_cell_a.color = color_b rand_cell_b.color = color_a sprites_group.update() # 主循环内新增重绘步骤 window.fill((0,0,0)) sprites_group.draw(window) pygame.display.flip() clock.tick(60)
运行后即可看到单元格颜色持续随机交换的动态效果,可通过调整
clock.tick()的参数修改动画速度。
内容的提问来源于stack exchange,提问作者Yago Mj
相关产品推荐
相关产品推荐

