Pygame实现DVD弹跳Logo时修改图片颜色失效如何解决?
问题原因
- 操作对象不匹配:你在对图片做缩放处理之前,就为加载得到的原始图片创建了PixelArray对象
var。pygame.transform.scale会生成全新的Surface对象赋值给dvdLogo变量,你后续修改var实际改动的是已经不再使用的原始图片,真正用来渲染的缩放后图片没有受到任何影响,颜色修改自然不会生效。 - Surface被锁定:PixelArray对象会锁定关联的Surface,修改完成后需要手动删除PixelArray对象解除锁定,否则后续无法对Surface执行渲染、变换等操作。
- 无效代码:
dvdlogoRect = dvdLogoRect.move_ip(200,6)属于错误写法,move_ip是原地修改Rect的方法,返回值为None,同时你写错了变量名大小写,这行代码没有实际作用。
修正后的参考代码
import pygame import time import random pygame.init() width, height = 400, 400 dvdLogoSpeed = [2, 1] backgroundColor = (255, 0, 0) screen = pygame.display.set_mode((width, height)) # 先加载、缩放图片,得到实际渲染用的Surface dvdLogo = pygame.image.load("dvdimage.png").convert_alpha() dvdLogo = pygame.transform.scale(dvdLogo, (50, 50)) dvdLogoRect = dvdLogo.get_rect() dvdLogoRect.move_ip(200, 6) # 准备换色用的颜色列表 color_list = [(0,0,255), (0,255,0), (255,255,0), (255,0,255), (0,255,255)] current_color_idx = 0 old_color = (0,0,0) # 你要替换的原始Logo底色 while True: # 处理退出事件,避免程序卡死无法关闭 for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() exit() screen.fill(backgroundColor) screen.blit(dvdLogo, dvdLogoRect) dvdLogoRect = dvdLogoRect.move(dvdLogoSpeed) touch_boundary = False if dvdLogoRect.left < 0 or dvdLogoRect.right > width: dvdLogoSpeed[0] = -dvdLogoSpeed[0] print("left or right") touch_boundary = True if dvdLogoRect.top < 0 or dvdLogoRect.bottom > height: dvdLogoSpeed[1] = -dvdLogoSpeed[1] print("top or bottom") touch_boundary = True # 碰到边界时更换Logo颜色 if touch_boundary: # 为当前正在使用的dvdLogo创建PixelArray var = pygame.PixelArray(dvdLogo) new_color = color_list[current_color_idx % len(color_list)] var.replace(old_color, new_color) # 删除PixelArray解除Surface锁定 del var old_color = new_color current_color_idx += 1 pygame.display.flip() time.sleep(10 / 1000)
内容的提问来源于stack exchange,提问作者ImBadAtMath
相关产品推荐
相关产品推荐

