Урок 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()

Результат выполнения нашей программы следующий:

py0020

Так как код был написан, а не вставлен скриншотами, просьба внимательно следить за табуляцией в коде.

2 комментария

xione от октября 24 2009 в изучение pygame

2 комментария по теме “Урок 8. Бленд-эффект”

  1. helios ответил 09 Дек 2009 at 14:08 #

    чтобы текст верстался “как есть” заключите его в тег <pre></pre>. Тогда пробельные символы не будут съедаться.
    Кстати, по-умолчанию pre преобразует ваш текст в Mono (все символы имеют одинаковую ширину), что отлично подходит для вёрстки кода…

  2. xioneg ответил 11 Дек 2009 at 0:29 #

    Спасибо)

Трэкбек URI | RSS комментариев

Оставить комментарий