Урок 8. Бленд-эффект
Бленд-эффект – плавный переход из одного оттенка в другой. Для чего мы можем применять бленд-эффект? Предлагаю немного пофантазировать. Представим нашего персонажа героем шутера, в котором он, храбрый защитник человечества, кромсает направо и налево кровожадных зомби. Зомби изначально у нас зеленого цвета. В один момент, наш герой поджигает зомби. Стоп! Зомби загорелся, следовательно он должен менять цвет с зеленого на разные оттенки красного и оранжевого. Как создать плавный переход из одного цвета в другой, из одного оттенка в другой?
Линейная интерполяция (lerp). Вы столкнетесь с данным определением в дальнейшем изучении библиотеки pygame. Lerp передвигает значения чисел от одного к другому. Работает lerp следующим образом. Мы находим разницу между вторым и первым значением, умножаем на фактор (factor) между 0 и 1, и в конце складываем с первым значением. Рассмотрим на примере нашу теорию. Нижеприведенная функция принимает два значения, фактор и возвращает значение бленд-эффекта:
def lerp(value1, value2, factor):
return value1+(value2-value1)*factor
print lerp (100, 200, 0.)
print lerp (100, 200, 1.)
print lerp (100, 200, .5)
print lerp (100, 200, .25)
Результат выполнения функции:
100.0
200.0
150.0
125.0
Следующий пример содержит функцию blend_color, которая позволяет, используя перетаскивание ползунка, плавно переходить из одного оттенка цвета в другой.
import pygame
from pygame.locals import*
from sys import exit
pygame.init()
screen = pygame.display.set_mode((640, 480), 0, 32)
color1 = (221, 99, 20)
color2 = (96, 130, 51)
factor = 0.
def blend_color(color1, color2, blend_factor):
red1, green1, blue1 = color1
red2, green2, blue2 = color2
red = red1+(red2-red1)*blend_factor
green = green1+(green2-green1)*blend_factor
blue = blue1+(blue2-blue1)*blend_factor
return int(red), int(green), int(blue)
while True:
for event in pygame.event.get():
if event.type == QUIT:
exit()
screen.fill((255, 255, 255))
tri = [ (0, 120), (639, 100), (639, 140) ]
pygame.draw.polygon(screen, (0, 255, 0), tri)
pygame.draw.circle(screen, (0, 0, 0), (int(factor*639.), 120), 10)
x, y = pygame.mouse.get_pos()
if pygame.mouse.get_pressed()[0]:
factor = x / 639.
pygame.display.set_caption(“PyGame Color Blend Test – %.3f”%factor)
color = blend_color(color1, color2, factor)
pygame.draw.rect(screen, color, (0, 240, 640, 240))
pygame.display.update()
Результат выполнения нашей программы следующий:

Так как код был написан, а не вставлен скриншотами, просьба внимательно следить за табуляцией в коде.
xione от октября 24 2009 в изучение pygame
2 комментария по теме “Урок 8. Бленд-эффект”
Трэкбек URI | RSS комментариев
helios ответил 09 Дек 2009 at 14:08 #
чтобы текст верстался “как есть” заключите его в тег <pre></pre>. Тогда пробельные символы не будут съедаться.
Кстати, по-умолчанию pre преобразует ваш текст в Mono (все символы имеют одинаковую ширину), что отлично подходит для вёрстки кода…
xioneg ответил 11 Дек 2009 at 0:29 #
Спасибо)