我犹豫是否发布答案,因为我想出了与 Sloth 的答案几乎相同的答案,但我只想提一下 linear interpolation(简称 lerp,在 OpenGL/GLSL 中也称为 mix)。它通常用于混合两种颜色,但不幸的是 pygame 的 Color 类没有 lerp 方法,因此您必须定义自己的 lerp 函数并使用列表推导来插入 RGBA 值。
这是从 Wikipedia 移植到 Python 的 lerp 函数(t 是权重,必须介于 0 和 1 之间):
def lerp(v0, v1, t):
return (1 - t) * v0 + t * v1
现在您可以通过列表理解来处理两种颜色的 RGBA 值。
color = [lerp(v0, v1, t) for v0, v1 in zip(color1, color2)]
例如:
>>> [lerp(v0, v1, .5) for v0, v1 in zip((0, 0, 0), (255, 255, 255))]
[127.5, 127.5, 127.5]
>>> [lerp(v0, v1, .25) for v0, v1 in zip((0, 0, 0), (255, 255, 255))]
[63.75, 63.75, 63.75]
如果你不需要 alpha 通道,你也可以使用 pygame 的 Vector3 类,它有一个 lerp 方法用于你的颜色,那么你只需要写:color = color1.lerp(color2, t)。
import itertools
import pygame as pg
from pygame.math import Vector3
pg.init()
screen = pg.display.set_mode((640, 480))
clock = pg.time.Clock()
color_cycle = itertools.cycle([
Vector3(255, 0, 0),
Vector3(0, 255, 0),
Vector3(255, 255, 0),
Vector3(0, 0, 255),
])
color1 = next(color_cycle)
color2 = next(color_cycle)
color = color1
start_time = pg.time.get_ticks()
time_interval = 2000 # milliseconds
t = 0
done = False
while not done:
for event in pg.event.get():
if event.type == pg.QUIT:
done = True
now = pg.time.get_ticks()
t = (now - start_time) / time_interval
if t > 1:
t = 0
start_time = now
color1, color2 = color2, next(color_cycle)
color = color1.lerp(color2, t) # Lerp the two colors.
screen.fill(color)
pg.display.flip()
clock.tick(60)