Pygame绘制历史矩形时颜色不匹配问题求助
问题
使用Pygame 2.5与Python 3.11.4,能够绘制带有历史位置的后续矩形,但无法为后续矩形匹配对应历史颜色。bodycolor列表存储了所有历史颜色元组,数据如下:
[] [(32, 0, 0)] [(64, 0, 0), (32, 0, 0)] [(96, 0, 0), (64, 0, 0), (32, 0, 0)] [(128, 0, 0), (96, 0, 0), (64, 0, 0), (32, 0, 0)] [(160, 0, 0), (128, 0, 0), (96, 0, 0), (64, 0, 0), (32, 0, 0)]
body列表存储着类似的历史位置数据,按预期每个历史矩形应对应不同的红色值,但实际输出不符合预期,相关代码如下:
import pygame pygame.init() size = (512,512) clock = pygame.time.Clock() screen = pygame.display.set_mode(size) sx,sy = size cursor = (-64,0, 32,32) dx = 0 dy = 0 body = [] color = (0,0,0) bodycolor = [] run = True while run: for e in pygame.event.get(): if e.type == pygame.QUIT: run = False bodycolor.insert(0, color) bodycolor.pop() body.insert(0, cursor) body.pop() ##print(bodycolor) dy += 32 cursor = (dx, dy, 32,32) color = (dy%255,dx%255,0) screen.fill('black') cursorr = pygame.draw.rect(screen, 'white', cursor, 1) for c in bodycolor: for b in body: pygame.draw.rect(screen, c, b) if cursorr.bottom >= sy: dy = -32 dx += 32 bodycolor.append(color) body.append(cursor) pygame.display.update() clock.tick(32) pygame.quit()
原因与修复
问题根源
- 双重循环导致颜色覆盖:你用嵌套循环遍历
bodycolor和body,这会让每个颜色都绘制所有历史位置的矩形,后面的颜色会覆盖前面的,最终所有历史矩形都显示最后一个颜色。 - 无效的列表操作:代码开头的
insert(0, ...)和pop()完全多余——初始列表为空时pop()会报错,后续列表有元素时,这两步是先插入再删除,等于没有任何实际作用。
修复方案
- 删除无意义的
bodycolor.insert(0, color)、bodycolor.pop()、body.insert(0, cursor)、body.pop()四行代码。 - 用
zip()函数并行遍历bodycolor和body,让颜色与位置一一对应绘制。
修复后的完整代码
import pygame pygame.init() size = (512,512) clock = pygame.time.Clock() screen = pygame.display.set_mode(size) sx,sy = size cursor = (-64,0, 32,32) dx = 0 dy = 0 body = [] color = (0,0,0) bodycolor = [] run = True while run: for e in pygame.event.get(): if e.type == pygame.QUIT: run = False dy += 32 cursor = (dx, dy, 32,32) color = (dy%255,dx%255,0) screen.fill('black') cursorr = pygame.draw.rect(screen, 'white', cursor, 1) # 并行遍历颜色与位置,一一对应绘制 for c, b in zip(bodycolor, body): pygame.draw.rect(screen, c, b) if cursorr.bottom >= sy: dy = -32 dx += 32 bodycolor.append(color) body.append(cursor) pygame.display.update() clock.tick(32) pygame.quit()
修改后,每个历史位置的矩形都会匹配对应的历史颜色,符合预期效果。
内容的提问来源于stack exchange,提问作者sbwtr
相关产品推荐
相关产品推荐

