我犹豫是否要发表答案,因为我的答案几乎与Sloth的相同,但我只想提一下线性插值(简称lerp
,在OpenGL/GLSL中也称为mix
)。它通常用于混合两种颜色,但不幸的是pygame的Color
类没有lerp方法,所以您必须定义自己的lerp
函数并使用列表推导来插值RGBA值。
这是从维基百科移植到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)]
E.g.:
>>> [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
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)
screen.fill(color)
pg.display.flip()
clock.tick(60)