<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>xione</title>
	<atom:link href="http://www.xione.ru/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://www.xione.ru</link>
	<description></description>
	<lastBuildDate>Thu, 26 Nov 2009 14:18:47 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Урок 10. Работа с поверхностными объектами (часть 2)</title>
		<link>http://www.xione.ru/?p=318</link>
		<comments>http://www.xione.ru/?p=318#comments</comments>
		<pubDate>Thu, 26 Nov 2009 14:16:31 +0000</pubDate>
		<dc:creator>xione</dc:creator>
				<category><![CDATA[изучение pygame]]></category>

		<guid isPermaLink="false">http://www.xione.ru/?p=318</guid>
		<description><![CDATA[В предыдущем уроке мы познакомились с созданием поверхности, объектами на поверхности, их редактированием и конвертированием. Настало время узнать о подповерностях (подслой), его заполнение, настройки пикселей на поверхности и их получение, копирование информации изображения с поверхности на поверхность.
Подслой
Подслой это поверхность внутри другой поверхности. Когда вы рисуете на подслое, вы также рисуете на родительской поверхности. Один из [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">В предыдущем уроке мы познакомились с созданием поверхности, объектами на поверхности, их редактированием и конвертированием. Настало время узнать о подповерностях (подслой), его заполнение, настройки пикселей на поверхности и их получение, копирование информации изображения с поверхности на поверхность.<span id="more-318"></span><strong></strong></p>
<p style="text-align: justify;"><strong>Подслой</strong></p>
<p style="text-align: justify;">Подслой это поверхность внутри другой поверхности. Когда вы рисуете на подслое, вы также рисуете на родительской поверхности. Один из способ использования подслоев, это рисование шрифтов. Модуль pygame.font воспроизводит шрифт одного цвета, но некоторые игры требует более сложного отображения шрифта. Как вариант, можно сохранить каждую букву в формате изображения, но будет проще создать одно изображение со всеми буквами текста и затем создать 26 подслоев при загрузки изображения в код.</p>
<p style="text-align: justify;">Чтобы создать подслой, нужно вызвать функцию subsurface объекта Surface, которая вызывет прямоугольную область, определяющую часть экрана которую необходимо заполнить. В результате будет возвращен новый объект Surface имеющий тот же цветовой формат что и родительская поверхность. Например, мы можем загрузить изображение с шрифтами и разделить в соответствие с размерами:</p>
<p style="text-align: justify;">my_font_image = pygame.load(&#8221;font.png&#8221;)</p>
<p>letters = []</p>
<p>letters["a"] = my_font_image.subsurface ((0, 0), (80, 80))</p>
<p style="text-align: justify;">letters["b"] = my_font_image.subsurface ((80, 0), (80, 80))</p>
<p style="text-align: justify;">Код создаст два подслоя из my_font_image и сохранит их в словарь, чтобы мы могли с легкостью посмотреть подслои с соответствующими буквами. Безусловно, нам потребуется намного больше букв нежели &#8220;а&#8221; и &#8220;b&#8221;, поэтому вполне вероятно, что подслой будет закольцован на повторение 26 раз.</p>
<p style="text-align: justify;">Когда вы работаете с подслоями важно помнить, что они имеют свою координатную систему. Другими словами, (0, 0) на подслое всегда является верхним левым углом вне зависимости от расположения его родительской поверхности.</p>
<p><strong>Заполнение поверхности</strong></p>
<p style="text-align: justify;">Когда вы создаете изображение на экране, вы должны заполнить весь экран, иначе останутся видны части предыдущего экрана. Если вы не отрисовываете каждый пиксель, вы получите неприятный эффект стробирования при попытки анимировать что-либо. Самый простой способ избежать этого &#8211; очистить экран вызвав функцию fill. Выглядит это следующим образом:</p>
<p>screen.fill ((0, 0))</p>
<p style="text-align: justify;">Функция fill также может быть использована для заполнения определенной части поверхностного объекта.</p>
<p><strong>Установка пикселей на поверхности</strong></p>
<p style="text-align: justify;">Одна из базовых вещей которую мы можем выполнять, это заполнить экран маленькими разноцветными точками. Для этого мы будем использовать функцию set_at, которая берет координаты пикселей и цвет пикселей. Чтобы понять как это работает, напишем скрипт, который автоматически хаотично рисует пиксели:</p>
<p>import pygame<br />
from pygame.locals import*<br />
from sys import exit<br />
from random import randint</p>
<p>pygame.init ()<br />
screen = pygame.display.set_mode ((640, 480), 0, 32)</p>
<p>while True:<br />
for event in pygame.event.get():<br />
if event.type == QUIT:<br />
exit ()</p>
<p>rand_col = (randint (0, 255), randint (0, 255), randint (0, 255))<br />
for _ in xrange (100):<br />
rand_pos = (randint (0, 639), randint (0, 479))<br />
screen.set_at (rand_pos, rand_col)</p>
<p>pygame.display.update ()</p>
<p>В результате:</p>
<p><img class="alignleft size-full wp-image-320" title="py0022" src="http://www.xione.ru/wp-content/uploads/2009/10/py0022.png" alt="py0022" width="652" height="511" /></p>
<p><strong>Получение пикселей на поверхности</strong></p>
<p style="text-align: justify;">Дополнением set_at является get_at, который возвращает цвет пикселя на заданной координате. Получение пикселей необходимо для определения столкновений, то есть чтобы программа могла определить, что игровой персонаж располагается в точности в нужном месте. Если все платформы и другие объекты определенного цвета, то такой вариант будет работать на ура. set_at берет один параметр, который должен быть кортежом координат необходимого пикселя. В следующем примере, мы получаем пиксель с координатами (100, 100) на поверхности под названием screen:</p>
<p>my_color = screen.get_at ((100, 100))</p>
<p style="text-align: justify;"><span style="text-decoration: underline;">Внимание!</span> Функция get_at может работать медленно при чтение с &#8220;аппаратной&#8221; поверхности. Экран может быть аппаратной поверхностью, особенно если приложение запущено на весь экран &#8211; поэтому, по возможности вы должны избегать получение пикселей на экране.</p>
<p><strong>Фиксация поверхности</strong></p>
<p style="text-align: justify;">Всякий раз когда Pygame отрисовывает объекты на поверхности, в первую очередь они должны быть заблокированы. Когда поверхность заблокирована, Pygame получает полный контроль над поверхностью и никакой другой процесс не может использовать поверхность, пока она заблокирована. Блокировка и разблокировка происходит автоматически когда вы отрисовываете что-либо на поверхности, но она может стать неэффективной при многократном блокирование и разблокирование. В следующем примере написан цикл который вызывает set_at 100 раз, заставляя Pygame блокировать и разблокировать поверхность screen 100 раз. Мы можем снизить количество блокировок и разблокировок и увеличить скорость цикла с помощью ручного блокирования.  Следующий пример идентичен предыдущему, но выполняется быстрее благодаря вызову lock перед отрисовкой и вызову unlock после отрисовки всех пикселей:</p>
<p>import pygame<br />
from pygame.locals import*<br />
from sys import exit<br />
from random import randint</p>
<p>pygame.init()<br />
screen = pygame.display.set_mode ((640, 480), 0, 32)</p>
<p>while True:<br />
for event in pygame.event.get():<br />
if event.type == QUIT:<br />
exit()</p>
<p>rand_col = (randint (0, 255), randint (0, 255), randint (0, 255))<br />
screen.lock ()<br />
for _ in xrange (100):<br />
rand_pos = (randint (0, 639), randint (0, 479))<br />
screen.set_at (rand_pos, rand_col)<br />
screen.unlock()<br />
pygame.display.update()</p>
<p style="text-align: justify;"><span style="text-decoration: underline;">Внимание!</span> Количественное значение блокировок должно соответствовать количественному значению разблокировок. Если вы забудете разблокировать поверхность, Pygame перестанет отвечать на вызовы, то есть просто напросто повиснет.</p>
<p style="text-align: justify;">Не все поверхности нуждаются в блокировке. Аппаратная поверхность нуждается (экран обычно является аппаратной поверхностью), но для простых программных средств это не нужно. Pygame предоставляет функцию mustlock для поверхностных объектов, которые в ходе цикла возвращают логическое значение True если поверхность нуждается в блокировке. Мы можем проверить возвращаемое значение mustlock перед блокировкой или разблокировкой. Если вы заблокируете поверхность которая не нуждается в этом, ничего страшного.</p>
<p><strong>Блиттер (Blitting)</strong></p>
<p style="text-align: justify;">Название происходит от акронима BLIT (Block Image Transfer). Основное применение блиттер находит в работе с 2D-графикой и связанных с нею преобразованиях. Блиттер копирует параметры изображения с одной поверхности на другую. Вы будете использовать блиттер для отрисовки фона, шрифтов, персонажей и т.д.</p>
<p style="text-align: justify;">Чтобы скопировать поверхность нужно вызвать blit из конечного поверхностного объекта (часто это дисплей) и указать исходную поверхность (спрайт, фон и т.д.) следом за координатами куда мы хотим скопировать. Также мы можем копировать только часть поверхности. Есть два способа использовать функцию blit:</p>
<p style="text-align: justify;">screen.blit (background, (0, 0)) &#8211; данный способ копирует поверхность, которая называется background в левый верхний угол экрана. Если background и screen имеют одинаковые размеры, то нам не требует заполнять экран с помощью функции fill. Второй способ:</p>
<p>screen.blit (ogre, (300, 200), (100*frame_no, 0, 100, 100))</p>
<p style="text-align: justify;">Если у нас есть изображение содержащее несколько фреймов идущего великана-людоеда (ogre), то мы можем использовать вышеприведенный код, для того чтобы скопировать его на экран. Изменяя значение frame_no, мы можем копировать другой участок из исходной поверхности.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.xione.ru/?feed=rss2&amp;p=318</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Урок 10. Работа с поверхностными объектами (часть 1)</title>
		<link>http://www.xione.ru/?p=310</link>
		<comments>http://www.xione.ru/?p=310#comments</comments>
		<pubDate>Sun, 25 Oct 2009 00:03:03 +0000</pubDate>
		<dc:creator>xione</dc:creator>
				<category><![CDATA[изучение pygame]]></category>

		<guid isPermaLink="false">http://www.xione.ru/?p=310</guid>
		<description><![CDATA[Мы уже загружали изображения с помощью pygame.image.load. Например, Урок 4. Создаем Hello, World! в графике.Pygame.image.load определяет название загружаемого изображения и возвращает поверхностный объект (Surface object). Как только поверхностный объект оказалcя загруженным в буфер экрана можно рисовать на нем, трансформировать его и т.д.
Создание поверхности
Один из вариантов создания поверхности &#8211; вызов pygame.image.load. Pygame.image.load создает поверхность, которая соответствует [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Мы уже загружали изображения с помощью <em>pygame.image.load</em>. Например, <a href="http://www.xione.ru/?p=180" target="_blank">Урок 4. Создаем Hello, World! в графике.</a><em>Pygame.image.load</em> определяет название загружаемого изображения и возвращает поверхностный объект (Surface object). Как только поверхностный объект оказалcя загруженным в буфер экрана можно рисовать на нем, трансформировать его и т.д.<span id="more-310"></span></p>
<p><strong>Создание поверхности</strong></p>
<p style="text-align: justify;">Один из вариантов создания поверхности &#8211; вызов <em>pygame.image.load</em>. <em>Pygame.image.load</em> создает поверхность, которая соответствует цветам и размерам файла, также можно создать пустую поверхность любого размера. Для создания пустой поверхности необходимо вызвать конструктор <em>pygame.Surface</em>, который содержит требуемые размеры. Например, <em>blank_surface = pygame.Surface ((256, 256))</em> создает поверхность с размером 256х256 пикселей. Если мы не определим никаких других параметров, то получим поверхность с тем количеством цветов что и наш дисплей.</p>
<p style="text-align: justify;">Рассмотрим два дополнительных параметра, которые влияют на создаваемое изображение. Мы можем установить флаги следующих параметров:</p>
<p style="text-align: justify;">HWSURFACE &#8211; создает &#8220;аппаратную&#8221; поверхность, которая может работать производительнее. Желательно активировать флаг HWSURFACE и предоставить Pygame самому решать, когда его использовать.</p>
<p style="text-align: justify;">SRCALPHA &#8211; создает поверхность с информацией об альфа-канале. Активировать флаг стоит в случае использования прозрачной поверхности, спрайтов и шрифтов. Флаг также требует установить параметр depth в значение 32.</p>
<p style="text-align: justify;">Следующая строка кода создает поверхность с информацией об альфа-канале: <em>blank_alpha_surface = pygame.Surface ((256, 256), flags=SRCALPHA, depth=32)</em></p>
<p><strong>Конвертирование поверхности</strong></p>
<p style="text-align: justify;">Когда вы работаете с поверхностными объектами, вам не нужно волноваться об информации изображения, хранящегося в памяти, так как Pygame берет эту проблему на себя. Но не стоит злоупотреблять автоматическим конвертированием, например, при работе с изображениями разных форматов. В противном случае отрисовка игровых объектов будет ухудшена. Выход заключается в конвертации всех изображений в единый формат. Объект <em>Surface </em>для этих целей использует функцию <em>convert</em>.</p>
<p style="text-align: justify;">Если вызвать <em>convert </em>без указания параметров, то поверхность преобразуется в формат поверхности дисплея. Это полезно в случаях быстрого копирования поверхностей, когда исходные данные совпадают по формату с конечными. Лучше всего присоединить <em>.convert()</em> в конец <em>pygame.image.load</em>, чтобы быть уверенным, что изображения быстрее преобразуются в формат дисплея. Пример, background <span style="color: #800080;">=</span> pygame<span style="color: #800080;">.</span>image<span style="color: #800080;">.</span>load <span style="color: #800080;">(</span>background_image_filename<span style="color: #800080;">).</span>convert<span style="color: #800080;">()</span>. Исключение составляют изображения с альфа-каналами, в этом случае <em>convert</em> отбросит альфа-канал. К счастью в Pygame существует функция <em>convert_alpha</em>, конвертирующая поверхность с сохранением альфа-канала. Пример, mouse_cursor <span style="color: #800080;">=</span> pygame<span style="color: #800080;">.</span>image<span style="color: #800080;">.</span>load <span style="color: #800080;">(</span>mouse_image_filename<span style="color: #800080;">).</span>convert_alpha<span style="color: #800080;">()</span>.</p>
<p style="text-align: justify;"><strong>Прямоугольные объекты</strong></p>
<p style="text-align: justify;">Часто возникают случаи, когда Pygame запрашивает определенную область, чтобы понять на какую часть экрана будет действовать функция. Например, можно ограничить отрисовку части экрана при помощи закрепления области (об этом мы поговорим ниже). Вы можете определить область используя кортеж, который содержит четыре значения: значения координат <em>х</em> и <em>у</em> левого верхнего угла за которыми следуют значения ширины и длины прямоугольника. Например, my_rect1 <span style="color: #800080;">= (100, 100, 200, 150)</span>. Как вариант, вы можете указать значения координат <em>х</em> и <em>у</em> как один кортеж за которым следует другой кортеж, содержащий значения ширины и длины прямоугольника. Например, my_rect2 <span style="color: #800080;">= ((100, 100), (200, 150))</span>. Какой из методов вы будете использовать, решать вам. Лучше смотреть всегда по коду.</p>
<p style="text-align: justify;">В Pygame присутствует класс <em>Rect</em>, который хранит туже информацию, что и кортеж области, но отличается удобными способами работы. <em>Rect</em> используется настолько часто, что он был включен в <em>pygame.locals</em>.</p>
<p style="text-align: justify;">Чтобы построить <em>Rect</em> объект, мы используем те же самые параметры, что и в кортеже области. Выше были приведены примеры (my_rect1 <span style="color: #800080;">= (100, 100, 200, 150)</span> и my_rect2 = <span style="color: #800080;">((100, 100), (200, 150))</span>), которые в случае использования <em>Rect</em> выглядят следующим образом:</p>
<p style="text-align: justify;">my_rect3 <span style="color: #800080;">=</span> Rect<span style="color: #800080;">(100, 100, 200, 150)</span></p>
<p style="text-align: justify;">my_rect4 <span style="color: #800080;">=</span> Rect<span style="color: #800080;">((100, 100), (200, 150))</span></p>
<p><strong>Закрепление</strong></p>
<p style="text-align: justify;">Часто при создании экрана для игры, нужно отрисовать только часть дисплея. Например, в стратегиях а-ля Command&amp;Conquer верхняя часть экрана используется в качестве прокручивающийся карты, а нижняя часть представляет собой панель, которая отображает информацию об отрядах. Реализовывается это с помощью функции <em>set_clip</em>, которая устанавливает закрепленный участок на поверхности. Если потребуется отыскать текущий закрепленный участок, используется <em>get_clip</em>.</p>
<p style="text-align: justify;">Данное короткое пояснение показывает, каким образом реализовывается закрепление для создания экранов в играх жанра стратегия. Во-первых ,мы закрепляем участок и вызываем <em>draw_map</em> (отрисовывает только верхнюю часть экрана). Во-вторых, вызываем <em>set_clip </em>(закрепляет остальную часть экрана):</p>
<p style="text-align: justify;">screen<span style="color: #800080;">.</span>set_clip <span style="color: #800080;">(0, 0, 640, 300)</span></p>
<p style="text-align: justify;">draw_map <span style="color: #800080;">()</span></p>
<p style="text-align: justify;">screen<span style="color: #800080;">.</span>set_clip <span style="color: #800080;">(0, 300, 640, 180)</span></p>
<p style="text-align: justify;">draw_panel <span style="color: #800080;">()</span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.xione.ru/?feed=rss2&amp;p=310</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Урок 9. Использование изображений</title>
		<link>http://www.xione.ru/?p=306</link>
		<comments>http://www.xione.ru/?p=306#comments</comments>
		<pubDate>Sat, 24 Oct 2009 12:35:27 +0000</pubDate>
		<dc:creator>xione</dc:creator>
				<category><![CDATA[изучение pygame]]></category>

		<guid isPermaLink="false">http://www.xione.ru/?p=306</guid>
		<description><![CDATA[Изображения являются составляющей частью любой игры. В 2D играх изображения могут представлять собой фоновое изображение, текст, главных героев игры или их противников. В 3D играх изображения обычно используются в качестве текстур для создания 3D сцен.
Pygame поддерживает следующие форматы: JPEG, PNG, GIF (без анимации), BMP, PCX, TGA (не сжатый), TIF, LBM (и PBM), PBM (и PGM, [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Изображения являются составляющей частью любой игры. В 2D играх изображения могут представлять собой фоновое изображение, текст, главных героев игры или их противников. В 3D играх изображения обычно используются в качестве текстур для создания 3D сцен.</p>
<p style="text-align: justify;"><span id="more-306"></span>Pygame поддерживает следующие форматы: JPEG, PNG, GIF (без анимации), BMP, PCX, TGA (не сжатый), TIF, LBM (и PBM), PBM (и PGM, PPM),XPM. В основном мы будем работать с форматами JPEG и PNG.</p>
<p style="text-align: justify;"><strong>Формат JPEG</strong></p>
<p style="text-align: justify;">Один из самых распространенных форматов. В случае программирования игр этот формат лучше использовать при работе с большими изображениями, содержащими в себе большое количество цветовых вариаций. К сожалению JPEG не поддерживает прозрачность, поэтому для работы с прозрачностью будем использовать PNG.</p>
<p style="text-align: justify;"><strong>Формат PNG</strong></p>
<p style="text-align: justify;">Плюсы формата PNG:</p>
<ul style="text-align: justify;">
<li>в отличие от формата JPEG, позволяет сжимать изображение без потерь качества;</li>
<li>поддерживает неограниченное количество цветов;</li>
<li>полноценно поддерживает альфа-канал (прозрачности и полупрозрачности);</li>
<li>имеет возможность гамма-коррекции;</li>
<li>обеспечивает чересстрочную развертку.</li>
</ul>
<p style="text-align: justify;">Преимущественно мы будем использовать данный формат в программировании игр.</p>
<p style="text-align: justify;"><strong>Что такое альфа-канал?</strong></p>
<p style="text-align: justify;">Альфа-канал &#8211; это дополнительнй канал, который может быть добавлен в рисунок. Он содержит информацию о прозрачности рисунка и в зависимости от типа альфа, может содержать различные уровни прозрачности.</p>
<p style="text-align: justify;"><strong>Для чего можно применить альфа-канал?</strong></p>
<p style="text-align: justify;">Например у нас есть отсканированное изображение. Нужно поменять полностью цвет фона. Загвоздка заключается в смене цвета фона самого лица и волос. На помощь к нам приходит альфа-канал. Я воспользовался редактором GIMP.</p>
<p><img class="size-full wp-image-307 alignleft" title="py0021" src="http://www.xione.ru/wp-content/uploads/2009/10/py0021.png" alt="py0021" width="640" height="2000" /></p>
<p>В следующих уроках я расскажу о работе с поверхностными объектами.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.xione.ru/?feed=rss2&amp;p=306</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Урок 8. Бленд-эффект</title>
		<link>http://www.xione.ru/?p=292</link>
		<comments>http://www.xione.ru/?p=292#comments</comments>
		<pubDate>Fri, 23 Oct 2009 22:20:07 +0000</pubDate>
		<dc:creator>xione</dc:creator>
				<category><![CDATA[изучение pygame]]></category>

		<guid isPermaLink="false">http://www.xione.ru/?p=292</guid>
		<description><![CDATA[Бленд-эффект &#8211; плавный переход из одного оттенка в другой. Для чего мы можем применять бленд-эффект? Предлагаю немного пофантазировать. Представим нашего персонажа героем шутера, в котором он, храбрый защитник человечества, кромсает направо и налево кровожадных зомби. Зомби изначально у нас зеленого цвета. В один момент, наш герой поджигает зомби. Стоп! Зомби загорелся, следовательно он должен менять [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;"><em>Бленд-эффект</em> &#8211; плавный переход из одного оттенка в другой. Для чего мы можем применять бленд-эффект? Предлагаю немного пофантазировать. Представим нашего персонажа героем шутера, в котором он, храбрый защитник человечества, кромсает направо и налево кровожадных зомби. Зомби изначально у нас зеленого цвета. В один момент, наш герой поджигает зомби. Стоп! Зомби загорелся, следовательно он должен менять цвет с зеленого на разные оттенки красного и оранжевого. Как создать плавный переход из одного цвета в другой, из одного оттенка в другой?</p>
<p style="text-align: justify;"><span id="more-292"></span><em>Линейная интерполяция (lerp)</em>. Вы столкнетесь с данным определением в дальнейшем изучении библиотеки pygame. Lerp передвигает значения чисел от одного к другому. Работает lerp следующим образом. Мы находим разницу между вторым и первым значением, умножаем на <em>фактор (factor)</em> между 0 и 1, и в конце складываем с первым значением. Рассмотрим на примере нашу теорию. Нижеприведенная функция принимает два значения, фактор и возвращает значение бленд-эффекта:</p>
<p><span style="color: #800080;">def</span> <span style="color: #0000ff;">lerp</span><span style="color: #800080;">(</span>value1<span style="color: #800080;">,</span> value2<span style="color: #800080;">,</span> factor<span style="color: #800080;">):</span></p>
<p><span style="color: #800080;"> return</span> value1<span style="color: #800080;">+(</span>value2<span style="color: #800080;">-</span>value1<span style="color: #800080;">)*</span>factor</p>
<p><span style="color: #800080;">print</span> lerp <span style="color: #800080;">(100, 200, 0.)</span></p>
<p><span style="color: #800080;">print</span> lerp <span style="color: #800080;">(100, 200, 1.)</span></p>
<p><span style="color: #800080;">print</span> lerp <span style="color: #800080;">(100, 200, .5)</span></p>
<p><span style="color: #800080;">print</span> lerp <span style="color: #800080;">(100, 200, .25)</span></p>
<p>Результат выполнения функции:</p>
<p>100.0</p>
<p>200.0</p>
<p>150.0</p>
<p>125.0</p>
<p style="text-align: justify;">Следующий пример содержит функцию <em>blend_color</em>, которая позволяет, используя перетаскивание ползунка, плавно переходить из одного оттенка цвета в другой.</p>
<p><span style="color: #800080;">import</span> pygame<br />
<span style="color: #800080;">from</span> pygame<span style="color: #800080;">.</span>locals <span style="color: #800080;">import*</span><br />
<span style="color: #800080;">from</span> sys <span style="color: #800080;">import</span> exit</p>
<p>pygame<span style="color: #800080;">.</span>init<span style="color: #800080;">()</span><br />
screen <span style="color: #800080;">=</span> pygame<span style="color: #800080;">.</span>display<span style="color: #800080;">.</span>set_mode<span style="color: #800080;">((640, 480), 0, 32)</span></p>
<p>color1 <span style="color: #800080;">= (221, 99, 20)</span><br />
color2 <span style="color: #800080;">= (96, 130, 51)</span><br />
factor <span style="color: #800080;">= 0.</span></p>
<p><span style="color: #800080;">def</span> <span style="color: #000080;">blend_color</span><span style="color: #800080;">(</span>color1<span style="color: #800080;">,</span> color2<span style="color: #800080;">,</span> blend_factor<span style="color: #800080;">):</span><br />
red1<span style="color: #800080;">,</span> green1<span style="color: #800080;">,</span> blue1 <span style="color: #800080;">=</span> color1<br />
red2<span style="color: #800080;">,</span> green2<span style="color: #800080;">,</span> blue2 <span style="color: #800080;">=</span> color2<br />
red <span style="color: #800080;">=</span> red1<span style="color: #800080;">+(</span>red2<span style="color: #800080;">-</span>red1<span style="color: #800080;">)*</span>blend_factor<br />
green<span style="color: #800080;"> =</span> green1<span style="color: #800080;">+(</span>green2<span style="color: #800080;">-</span>green1<span style="color: #800080;">)*</span>blend_factor<br />
blue <span style="color: #800080;">=</span> blue1<span style="color: #800080;">+(</span>blue2<span style="color: #800080;">-</span>blue1<span style="color: #800080;">)*</span>blend_factor<br />
<span style="color: #800080;">return</span> int<span style="color: #800080;">(</span>red<span style="color: #800080;">),</span> int<span style="color: #800080;">(</span>green<span style="color: #800080;">),</span> int<span style="color: #800080;">(</span>blue<span style="color: #800080;">)</span></p>
<p><span style="color: #800080;">while </span><span style="color: #800080;">True:</span><br />
<span style="color: #800080;">for </span>event <span style="color: #800080;">in</span> pygame<span style="color: #800080;">.</span>event<span style="color: #800080;">.</span>get<span style="color: #800080;">():</span><br />
<span style="color: #800080;">if </span>event<span style="color: #800080;">.</span>type <span style="color: #800080;">==</span> QUIT<span style="color: #800080;">:</span><br />
exit<span style="color: #800080;">()</span></p>
<p>screen<span style="color: #800080;">.</span>fill<span style="color: #800080;">((255, 255, 255))</span></p>
<p>tri <span style="color: #800080;">= [ (0, 120), (639, 100), (639, 140) ]</span><br />
pygame<span style="color: #800080;">.</span>draw<span style="color: #800080;">.</span>polygon<span style="color: #800080;">(</span>screen<span style="color: #800080;">, </span><span style="color: #800080;">(</span>0<span style="color: #800080;">,</span> 255<span style="color: #800080;">,</span> 0<span style="color: #800080;">),</span> tri<span style="color: #800080;">)</span><br />
pygame<span style="color: #800080;">.</span>draw<span style="color: #800080;">.</span>circle<span style="color: #800080;">(</span>screen<span style="color: #800080;">, (</span>0<span style="color: #800080;">,</span> 0<span style="color: #800080;">,</span> 0<span style="color: #800080;">),</span> <span style="color: #800080;">(</span>int<span style="color: #800080;">(</span>factor<span style="color: #800080;">*639.), 120), 10)</span></p>
<p>x<span style="color: #800080;">,</span> y <span style="color: #800080;">=</span> pygame<span style="color: #800080;">.</span>mouse<span style="color: #800080;">.</span>get_pos<span style="color: #800080;">()</span><br />
<span style="color: #800080;">if </span>pygame<span style="color: #800080;">.</span>mouse<span style="color: #800080;">.</span>get_pressed<span style="color: #800080;">()[0]:</span><br />
factor <span style="color: #800080;">=</span> x <span style="color: #800080;">/ 639.</span><br />
pygame<span style="color: #800080;">.</span>display<span style="color: #800080;">.</span>set_caption<span style="color: #800080;">(</span><span style="color: #008000;">&#8220;PyGame Color Blend Test &#8211; %.3f&#8221;</span><span style="color: #800080;">%</span>factor<span style="color: #800080;">)</span></p>
<p>color <span style="color: #800080;">=</span> blend_color<span style="color: #800080;">(</span>color1<span style="color: #800080;">,</span> color2<span style="color: #800080;">,</span> factor<span style="color: #800080;">)</span><br />
pygame<span style="color: #800080;">.</span>draw<span style="color: #800080;">.</span>rect<span style="color: #800080;">(</span>screen<span style="color: #800080;">,</span> color<span style="color: #800080;">, (0, 240, 640, 240))</span></p>
<p>pygame<span style="color: #800080;">.</span>display<span style="color: #800080;">.</span>update<span style="color: #800080;">()</span></p>
<p><span style="color: #800080;"><span style="color: #000000;">Результат выполнения нашей программы следующий:</span></span><em> </em></p>
<p><span style="color: #800080;"><span style="color: #000000;"><img class="size-full wp-image-295 alignleft" title="py0020" src="http://www.xione.ru/wp-content/uploads/2009/10/py0020.png" alt="py0020" width="496" height="392" /></span></span></p>
<p style="text-align: justify;"><span style="color: #800080;"><span style="color: #000000;">Так как код был написан, а не вставлен скриншотами, просьба внимательно следить за табуляцией в коде.<br />
</span></span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.xione.ru/?feed=rss2&amp;p=292</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Обои Runtu Office Pro для рабочего стола</title>
		<link>http://www.xione.ru/?p=285</link>
		<comments>http://www.xione.ru/?p=285#comments</comments>
		<pubDate>Mon, 05 Oct 2009 15:22:54 +0000</pubDate>
		<dc:creator>xione</dc:creator>
				<category><![CDATA[новости]]></category>
		<category><![CDATA[статьи по ОС Runtu]]></category>

		<guid isPermaLink="false">http://www.xione.ru/?p=285</guid>
		<description><![CDATA[
Представляю небольшой архив обоев для рабочего стола в стиле операционной системы Runtu Office Pro.
 
Скачать архив обоев
]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;"><img class="size-full wp-image-288 alignleft" title="rop03" src="http://www.xione.ru/wp-content/uploads/2009/10/rop03.png" alt="rop03" width="288" height="230" /></p>
<p style="text-align: justify;">Представляю небольшой архив обоев для рабочего стола в стиле операционной системы Runtu Office Pro.<span id="more-285"></span></p>
<p><img class="size-full wp-image-286 alignleft" title="rop05" src="http://www.xione.ru/wp-content/uploads/2009/10/rop05.png" alt="rop05" width="288" height="230" /> <img class="size-full wp-image-287 alignnone" title="rop08" src="http://www.xione.ru/wp-content/uploads/2009/10/rop08.png" alt="rop08" width="275" height="219" /></p>
<p><a href="http://narod.ru/disk/13842976000/RuntuOfficePro_wallpapers.zip.html" target="_blank"><strong>Скачать архив обоев</strong></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.xione.ru/?feed=rss2&amp;p=285</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
