<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/css" href="http://wiki2.linuxformat.ru/skins/common/feed.css?97"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
	<channel>
		<title>LXF112:Игры - История изменений</title>
		<link>http://wiki2.linuxformat.ru/index.php?title=LXF112:%D0%98%D0%B3%D1%80%D1%8B&amp;action=history</link>
		<description>История изменений этой страницы в вики</description>
		<language>ru</language>
		<generator>MediaWiki 1.11.1</generator>
		<lastBuildDate>Wed, 13 May 2026 21:02:58 GMT</lastBuildDate>
		<item>
			<title>2sash-kan: /* Новые возможности */</title>
			<link>http://wiki2.linuxformat.ru/index.php?title=LXF112:%D0%98%D0%B3%D1%80%D1%8B&amp;diff=9866&amp;oldid=prev</link>
			<description>&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Новые возможности&lt;/span&gt;&lt;/p&gt;

			&lt;table style=&quot;background-color: white; color:black;&quot;&gt;
			&lt;col class='diff-marker' /&gt;
			&lt;col class='diff-content' /&gt;
			&lt;col class='diff-marker' /&gt;
			&lt;col class='diff-content' /&gt;
			&lt;tr&gt;
				&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;← Предыдущая&lt;/td&gt;
				&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;Версия 14:17, 14 марта 2010&lt;/td&gt;
			&lt;/tr&gt;
		&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 325:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 325:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;например, слишком много автомобилей и нет пути для проезда.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;например, слишком много автомобилей и нет пути для проезда.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;-&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Обсудим, что у вас получилось, на сайте http://&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;www&lt;/del&gt;.&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;linuxforum.ru&lt;/del&gt;!&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Обсудим, что у вас получилось, на сайте http://&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;unixforum&lt;/ins&gt;.&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;org &lt;/ins&gt;!&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</description>
			<pubDate>Sun, 14 Mar 2010 14:17:10 GMT</pubDate>			<dc:creator>2sash-kan</dc:creator>			<comments>http://wiki2.linuxformat.ru/index.php/%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5:LXF112:%D0%98%D0%B3%D1%80%D1%8B</comments>		</item>
		<item>
			<title>Crazy Rebel в 12:58, 14 января 2010</title>
			<link>http://wiki2.linuxformat.ru/index.php?title=LXF112:%D0%98%D0%B3%D1%80%D1%8B&amp;diff=9482&amp;oldid=prev</link>
			<description>&lt;p&gt;&lt;/p&gt;

			&lt;table style=&quot;background-color: white; color:black;&quot;&gt;
			&lt;col class='diff-marker' /&gt;
			&lt;col class='diff-content' /&gt;
			&lt;col class='diff-marker' /&gt;
			&lt;col class='diff-content' /&gt;
			&lt;tr&gt;
				&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;← Предыдущая&lt;/td&gt;
				&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;Версия 12:58, 14 января 2010&lt;/td&gt;
			&lt;/tr&gt;
		&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 1:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 1:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;: '''Программирование''' Пишем игру «ралли» и изучаем ''PyGame'' [[Категория:Учебники]]&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;: '''Программирование''' Пишем игру «ралли» и изучаем ''PyGame'' [[Категория:Учебники]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;{{Цикл/Python}}&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;==Кодируем: Напишем ралли==&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;==Кодируем: Напишем ралли==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</description>
			<pubDate>Thu, 14 Jan 2010 12:58:04 GMT</pubDate>			<dc:creator>Crazy Rebel</dc:creator>			<comments>http://wiki2.linuxformat.ru/index.php/%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5:LXF112:%D0%98%D0%B3%D1%80%D1%8B</comments>		</item>
		<item>
			<title>Crazy Rebel: викификация, оформление, иллюстрация</title>
			<link>http://wiki2.linuxformat.ru/index.php?title=LXF112:%D0%98%D0%B3%D1%80%D1%8B&amp;diff=8876&amp;oldid=prev</link>
			<description>&lt;p&gt;викификация, оформление, иллюстрация&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая статья&lt;/b&gt;&lt;/p&gt;&lt;div&gt;: '''Программирование''' Пишем игру «ралли» и изучаем ''PyGame'' [[Категория:Учебники]]&lt;br /&gt;
&lt;br /&gt;
==Кодируем: Напишем ралли==&lt;br /&gt;
&lt;br /&gt;
Два месяца назад мы выступили с учебником по программированию, создав клон ''Space Invaders'' под названием ''PyInvaders''.&lt;br /&gt;
Реакция оказалась фантастической: из сообщений на форумах и полученных электронных писем мы поняли, что вам понравилось&lt;br /&gt;
изучать новые технологии и улучшать код. Огромное спасибо! В этом&lt;br /&gt;
месяце мы запускаем новую серию из двух статей, продолжающую&lt;br /&gt;
тему программирования игр, и первая из них – ралли.&lt;br /&gt;
&lt;br /&gt;
Как и раньше, использовать будем ''PyGame'' – сочетание легко читаемого языка ''Python'' и мультимедиа-библиотек ''SDL''. Синтаксис ''Python'' очень прост для понимания: он не обременен фигурными скобками&lt;br /&gt;
и прочей неразберихой, обычной для других языков программирования. А значит, это идеальный вариант для новичков: наши статьи не&lt;br /&gt;
учат программировать с нуля, но тем, кто уже что-то пробовал, будет&lt;br /&gt;
нетрудно им следовать.&lt;br /&gt;
&lt;br /&gt;
Если вы сроду не видали ни строчки кода на Python, возьмите '''LXF110''', там есть небольшой [[LXF110:Phyton|ликбез]]. В этом месяце мы расширим свои знания ''PyGame'' в трех основных областях:&lt;br /&gt;
* '''Обработка мыши''' Если в PyInvaders использовалась только клавиатура, то здесь мы узнаем, как отслеживать положение курсора мыши для управления игроком.&lt;br /&gt;
* '''Воспроизведение музыки и звуков''' Что за игра без бодрящих мелодий и четких звуковых эффектов? Полная серость, вот что. ''PyGame'' трудоустроит ваши колонки.&lt;br /&gt;
* '''Использование текста и шрифтов''' В ''PyInvaders'' мы использовали только спрайты, но в играх обычно показывается количество очков. К счастью, в ''PyGame'' есть несколько прекрасных подпрограмм для создания и управления текстом всего в несколько строк кода.&lt;br /&gt;
&lt;br /&gt;
===Часть 1 Обзаводимся нужными файлами===&lt;br /&gt;
&lt;br /&gt;
Для нашего ралли ''Pyracer'' понадобятся несколько звуковых файлов&lt;br /&gt;
и пара картинок. Если вы в творческом расположении духа (весьма&lt;br /&gt;
вероятно, коли вы прочли главную статью номера!), можете создать&lt;br /&gt;
их сами по приведенным ниже инструкциям. Если нет, возьмите их из&lt;br /&gt;
архива в разделе '''Журнал/PyRacer''' нашего DVD.&lt;br /&gt;
&lt;br /&gt;
Исходный код ''Pyracer'' будет сохранен в файле '''pyracer.py''', рядом с которым мы расположим каталог '''data'''. В него следует поместить:&lt;br /&gt;
* '''car_player.png''' Изображение автомобиля игрока размером 40х100 пикселей (вид сверху, автомобиль движется в окне снизу вверх). Для отрезания пикселей, не относящихся к автомобилю, используется прозрачность '''PNG'''. Поэтому это не сплошной прямоугольник, и за ним будет видна дорога.&lt;br /&gt;
* '''car_enemy.png''' Автомобиль врага: предыдущее изображение, отраженное зеркально по вертикали.&lt;br /&gt;
* '''whiteline.png''' Полоска размером 20 на 80 пикселей. Белая или с текстурой, если вам хочется чего-нибудь посимпатичнее. Как можно догадаться, она нужна для линии разметки дороги.&lt;br /&gt;
* '''tree.png''' Изображение размером 65 на 110 пикселей. Да, это дерево! Мы размножим его и будем перемещать вниз, чтобы создать ощущение скорости. Как и в случае с картинкой автомобиля, прозрачность позволит увидеть фон около ствола.&lt;br /&gt;
* '''background.mod''' Фоновая музыка в формате ''MOD'', созданная, например, программой ''SoundTracker'' (см. раздел '''Звук на DVD'''). Можно легко создать собственный мотивчик или найти что-нибудь в Интернете (но помните об авторских правах!).&lt;br /&gt;
* '''crash.wav''' Прекрасный звук удара, который будет воспроизводиться, когда автомобиль игрока врезается в другой автомобиль.&lt;br /&gt;
&lt;br /&gt;
Как уже упоминалось, если вы не расположены к рисованию, то все это можно найти на DVD. Да и почему бы не запрячь кого-нибудь&lt;br /&gt;
в подготовку мультимедиа, пока вы занимаетесь программированием? Если дети заскучали, дайте им копию ''GIMP'' и скажите, что к утру на столе должны быть хорошие спрайты, не то вы смените пароли, когда они опять пойдут гулять.&lt;br /&gt;
&lt;br /&gt;
===Часть 2 Запускаем двигатель===&lt;br /&gt;
&lt;br /&gt;
Посмотрим на программу. Вы увидите, что код в архиве на нашем DVD&lt;br /&gt;
разделен на части, которые мы и будем разъяснять. Обратите внимание, что код на языке ''Python'' имеет отступы, выполняемые при помощи клавиши табуляции – в журнале они сделаны чуть поменьше, чтобы&lt;br /&gt;
строки кода не заламывались. Также помните, что в код можно добавлять комментарии (с помощью символа '''#'''). Это удобно в тех случаях, когда нужно оставить напоминание или что-то пояснить.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
 from pygame import *&lt;br /&gt;
 import random&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Первые две строки устанавливают окружение ''Python'' и говорят, что&lt;br /&gt;
мы хотим использовать все функции библиотеки ''PyGame'' (поэтому&lt;br /&gt;
используется символ «звездочка»), а также функции работы со случайными числами. Если не указать эти строки, нам будут доступны лишь базовые функции ''Python'', поэтому импортировать дополнительные&lt;br /&gt;
модули необходимо.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
 class Sprite:&lt;br /&gt;
 def __init__(self, xpos, ypos, filename):&lt;br /&gt;
   self.x = xpos&lt;br /&gt;
   self.y = ypos&lt;br /&gt;
   self.bitmap = image.load(filename)&lt;br /&gt;
 def render(self):&lt;br /&gt;
   screen.blit(self.bitmap, (self.x, self.y))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Может, вы помните код в учебнике по ''PyInvaders'', похожий на этот.&lt;br /&gt;
Класс, в терминах объектно-ориентированного программирования, это&lt;br /&gt;
определение набора данных и связанных с ними методов. Представьте&lt;br /&gt;
себе это как чертеж коробки, объясняющий, что в ней содержится и как&lt;br /&gt;
это использовать. Определение класса '''class Sprite''' здесь только описывает класс, а делать ничего не делает; потом мы создадим настоящие коробки (экземпляры класса).&lt;br /&gt;
&lt;br /&gt;
====Тренируйте координацию====&lt;br /&gt;
&lt;br /&gt;
{{Врезка|Содержание=[[Изображение:LXF112_59_1.jpg|300px]]Левый верхний угол нашего спрайта дерева находится в точке 0,0, а правый&lt;br /&gt;
нижний – в точке 64,109 (отсчет ведется от нуля).|Ширина=300px}}&lt;br /&gt;
&lt;br /&gt;
Работа с экраном и спрайтами может озадачить новичков, потому что требует особого образа&lt;br /&gt;
мышления при обращении к конкретным точкам экрана. Например, мы привыкли, что на&lt;br /&gt;
графиках координаты отсчитываются от левого нижнего угла и увеличиваются слева направо и&lt;br /&gt;
вверх по обеим осям.&lt;br /&gt;
&lt;br /&gt;
В компьютерной графике (по большей части!) отсчет ведется с левого верхнего угла вниз и вправо. Так если размер окна установлен&lt;br /&gt;
в 640 на 480 пикселей, то точка с координатами 0,0 находится в левом верхнем углу (смещение – ноль пикселей вправо и ноль пикселей&lt;br /&gt;
вниз). Точка 0,240 – это ноль пикселей вправо и 240 вниз, т.е. середина экрана по вертикали.  Точка 320,240 – это центр экрана, а 639,479 – правая нижняя точка.&lt;br /&gt;
&lt;br /&gt;
Минуточку… а почему 639, а не 640? Ну, обычно отсчет ведется с 0, поэтому 639 – то&lt;br /&gt;
же самое, что 640, если считать с единицы. Подобные штучки всегда держат хакеров начеку!&lt;br /&gt;
&lt;br /&gt;
====Начнем, innit?====&lt;br /&gt;
&lt;br /&gt;
{{Врезка|Заголовок=Скорая помощь|Содержание=Запускать программы на ''Python'' можно не только командой ''python program.py''. Для&lt;br /&gt;
этого нужно сделать файл исполняемым (например, командой ''chmod +x program.py'') и добавить в начало файла строку: '''#!/usr/bin/env python'''. Теперь можно просто запустить ''./program.py'' или дважды кликнуть мышью на файле в файловом менеджере.|Ширина=200px}}&lt;br /&gt;
&lt;br /&gt;
При создании нового экземпляра класса Sprite вызывается метод&lt;br /&gt;
'''__init__''', и, как вы видите, он принимает четыре параметра. О '''self''' можно забыть – это внутренняя переменная класса, поэтому при создании объекта класса '''Sprite''' мы передаем ему начальные координаты '''X''' и '''Y''' и&lt;br /&gt;
имя файла, из которого нужно загрузить картинку спрайта. Этот класс также содержит метод отрисовки, отображающий спрайт на экране.&lt;br /&gt;
Позже мы посмотрим, как он используется.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
 def Intersect(s1_x, s1_y, s2_x, s2_y):&lt;br /&gt;
   if (s1_x &amp;gt; s2_x - 40) and (s1_x &amp;lt; s2_x + 40) and (s1_y &amp;gt; s2_y -&lt;br /&gt;
 40) and (s1_y &amp;lt; s2_y + 40):&lt;br /&gt;
     return 1&lt;br /&gt;
   else:&lt;br /&gt;
     return 0&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Возможно, вы помните этот код в ''PyInvaders''. Это метод определения столкновения, и выглядит он непознаваемым, хотя на деле не так уж сложен. Он принимает четыре параметра: координаты '''X''' и '''Y''' от двух спрайтов. Потом он определяет, перекрывают ли спрайты друг друга, и возвращает '''1''', если да, и '''0''' если нет. В коде часто встречается число&lt;br /&gt;
40 – это ширина спрайтов автомобилей. (Да, признаю: числа лучше&lt;br /&gt;
жестко не кодировать; в игре побольше размер спрайта описывался бы переменной, ради гибкости. Однако здесь у нас во главе угла&lt;br /&gt;
простота.)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
  init()&lt;br /&gt;
  screen = display.set_mode((640,480))&lt;br /&gt;
  display.set_caption(‘PyRacer’)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Далее мы велим ''PyGame'' слезть со стула и поработать с методом&lt;br /&gt;
'''init()''', а потом устанавливаем видеорежим и заголовок окна нашей&lt;br /&gt;
игры.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
  mixer.music.load(‘data/background.mod’)&lt;br /&gt;
  mixer.music.play(-1)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вот наша первая вылазка в мир звука. В ''PyGame'' есть модуль '''mixer''',&lt;br /&gt;
поддерживающий музыку и звуковые эффекты, и в первой строке кода&lt;br /&gt;
выше мы загружаем мелодию в формате '''MOD''' – она будет проигрываться в фоне. Вторая строка запускает воспроизведение музыки, и ей можно передать параметр, указывающий, сколько раз воспроизводить&lt;br /&gt;
фрагмент. Если установить его равным '''-1''', как мы и сделали, то музыка&lt;br /&gt;
будет играть бесконечно (ну, пока мы не закроем игру).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
  playercar = Sprite(20, 400, ‘data/car_player.png’)&lt;br /&gt;
  enemycar = Sprite(random.randrange(100, 500), 0, ‘data/car_&lt;br /&gt;
  enemy.png’)&lt;br /&gt;
  tree1 = Sprite(10, 0, ‘data/tree.png’)&lt;br /&gt;
  tree2 = Sprite(550, 240, ‘data/tree.png’)&lt;br /&gt;
  whiteline1 = Sprite(315, 0, ‘data/whiteline.png’)&lt;br /&gt;
  whiteline2 = Sprite(315, 240, ‘data/whiteline.png’)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Теперь применим определенный нами класс '''Sprite'''. В строке 1 мы говорим, что хотим создать новый объект '''Sprite''' с именем '''playercar''' и начальными координатами '''X=20''' (т.е. 20 пикселей вправо от левого верхнего угла окна) и '''Y=400''', а для изображения спрайта возьмем '''car_player.png''' в каталоге с данными.&lt;br /&gt;
&lt;br /&gt;
Сделаем то же самое для автомобиля-соперника, движущегося навстречу. Достаточно создать только один автомобиль, потому что&lt;br /&gt;
когда он доберется до низа и выйдет за пределы экрана, можно выкатить его вверху в другом месте. Потом создадим два спрайта дерева, по одному с каждой стороны окна, и два спрайта белой полосы: эти&lt;br /&gt;
будут прокручиваться вниз в середине окна, чтобы усилить ощущение&lt;br /&gt;
движения.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
 scorefont = font.Font(None, 60)&lt;br /&gt;
 crasheffect = mixer.Sound(‘data/crash.wav’)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Осталось только задать шрифт для показа количества очков и звуковой эффект для столкновения. Для первого вызовем подпрограммы ‘'''font'''’ библиотеки ''PyGame''; чтобы создать новый объект шрифта – укажем параметр ‘'''None'''’, это означает выбор некого доступного шрифта (можно указать и конкретный шрифт, но тогда игру будет сложнее переносить на другие платформы). Число 60 определяет размер шрифта. Для второго создадим новый объект звука '''crasheffect''',&lt;br /&gt;
используя файл '''data/crash.wav'''.&lt;br /&gt;
&lt;br /&gt;
 score = 0&lt;br /&gt;
 maxscore = 0&lt;br /&gt;
 quit = 0&lt;br /&gt;
&lt;br /&gt;
Прежде чем запустить основной цикл программы, установим несколько переменных. Учтите, что в ''Python'' инициализировать их не&lt;br /&gt;
обязательно, и часто можно просто с ходу использовать их там, где понадобится, но явное их объявление делает код гораздо проще для&lt;br /&gt;
понимания – по крайней мере, ясно, что происходит. '''Score''' – текущее&lt;br /&gt;
количество очков, '''maxscore''' содержит максимальное количество очков,&lt;br /&gt;
набранное по ходу игры (оно не сбрасывается, когда автомобили сталкиваются), а '''quit''' изменяется на 1, когда окно игры получает событие закрытия (например, пользователь нажимает на кнопку закрытия в заголовке).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
 while quit == 0:&lt;br /&gt;
   screen.fill((0,200,0))&lt;br /&gt;
   screen.fill((200,200,200), ((100, 0), (440, 480)))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ну вот, начинается основной цикл. Пока '''quit''' равен нулю, выполняется код с отступом. В начале каждого цикла мы рисуем фон, сперва заполняя весь экран зеленым цветом. 0,200,0 – это тройка RGB&lt;br /&gt;
(красный, зеленый, синий), в ней красная составляющая равна нулю,&lt;br /&gt;
довольно сильная зеленая составляющая (200) и нулевая синяя составляющая. (Максимальное значение каждой из них – 255.)&lt;br /&gt;
&lt;br /&gt;
====Зеленая, зеленая трава====&lt;br /&gt;
&lt;br /&gt;
Вторая строка '''screen.fill''' рисует серую дорогу на зеленом фоне. Так&lt;br /&gt;
как дорога не заполняет весь экран, мы передаем два дополнительных&lt;br /&gt;
параметра – начальную точку (100 пикселей вправо и 0 пикселей вниз)&lt;br /&gt;
и конечную точку (440 пикселей вправо и нижняя граница окна).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
 tree1.render()&lt;br /&gt;
 tree1.y += 10&lt;br /&gt;
 if (tree1.y &amp;gt; 480):&lt;br /&gt;
   tree1.y = -110&lt;br /&gt;
 tree2.render()&lt;br /&gt;
 tree2.y += 10&lt;br /&gt;
 if (tree2.y &amp;gt; 480):&lt;br /&gt;
   tree2.y = -110&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Теперь рисуем деревья: одно с левой стороны дороги и одно с правой. Инициализируя эти переменные раньше, мы приравняли вертикальную координату tree1 нулю, а tree2 – 240. Таким образом, одно&lt;br /&gt;
появляется в верхней части экрана, а второе – в середине. Это немного&lt;br /&gt;
разнообразит пейзаж.&lt;br /&gt;
&lt;br /&gt;
В каждом цикле мы вызываем метод '''render()''' для объектов деревьев и увеличиваем их вертикальные координаты на 10 пикселей.&lt;br /&gt;
Когда деревья опускаются за пределы экрана, мы восстанавливаем их&lt;br /&gt;
начальные координаты – вместо нуля используем -110. Если бы мы&lt;br /&gt;
использовали 0, деревья волшебным образом появились бы в верхней&lt;br /&gt;
части окна целиком, а не постепенно.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
 whiteline1.render()&lt;br /&gt;
 whiteline1.y += 10&lt;br /&gt;
 if (whiteline1.y &amp;gt; 480):&lt;br /&gt;
   whiteline1.y = -80&lt;br /&gt;
 whiteline2.render()&lt;br /&gt;
 whiteline2.y += 10&lt;br /&gt;
 if (whiteline2.y &amp;gt; 480):&lt;br /&gt;
   whiteline2.y = -80&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Этот код очень похож на тот, что обрабатывает деревья, но только&lt;br /&gt;
он обрабатывает белые полоски. Мы сбрасываем координаты в -80,&lt;br /&gt;
когда они уходят за пределы экрана, так как это высота изображения&lt;br /&gt;
в пикселях.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
 enemycar.render()&lt;br /&gt;
 enemycar.y += 15&lt;br /&gt;
 if (enemycar.y &amp;gt; 480):&lt;br /&gt;
   enemycar.y = -100&lt;br /&gt;
   enemycar.x = random.randrange(100, 500)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вот фрагмент кода, который отвечает за встречные автомобили.&lt;br /&gt;
Сначала мы рисуем автомобиль в его текущей позиции, затем увеличиваем ее вертикальную координату на 15 пикселей (то есть он перемещается быстрее, чем деревья и белые полоски). Когда автомобиль&lt;br /&gt;
соперника уходит за пределы экрана, мы помещаем его наверх, так что&lt;br /&gt;
он снова элегантно появляется на экране, и устанавливаем его горизонтальную координату ('''X''') в случайное значение между 100 и 500.&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
 x, y = mouse.get_pos()&lt;br /&gt;
 if (x &amp;lt; 100):&lt;br /&gt;
   x = 100&lt;br /&gt;
 if (x &amp;gt; 500):&lt;br /&gt;
   x = 500&lt;br /&gt;
 playercar.x = x&lt;br /&gt;
 playercar.render()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пора поработать с мышью. Чтобы определить координаты ее курсора в ''PyGame'', просто вызовите метод '''mouse.getpos()''', возвращающий два значения – горизонтальную и вертикальную координаты. В нашем&lt;br /&gt;
случае автомобиль игрока остается в нижней части экрана, поэтому&lt;br /&gt;
нам интересна только координата '''X''' (горизонтальная).&lt;br /&gt;
&lt;br /&gt;
И мы также хотим, чтобы автомобиль оставался на дороге, когда&lt;br /&gt;
игрок перемещает мышь (если только вы не собрались добавить пару&lt;br /&gt;
методов для обработки столкновения с деревом!). Итак, мы ограничиваем координату '''X''' значениями в 100 пикселей от левой границы окна и в 140 от правой. Помните, что ширина спрайта автомобиля – 40 пикселей: это означает, что правая сторона автомобиля может быть в точке с координатой '''X=540'''.&lt;br /&gt;
&lt;br /&gt;
====Слова, слова====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
 scoretext = scorefont.render(‘Score: ‘ + str(score), True,&lt;br /&gt;
 (255,255,255), (0,0,0))&lt;br /&gt;
 screen.blit(scoretext, (5,5))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вывести текст на экран в ''PyGame'' очень легко. В первой строке мы&lt;br /&gt;
создаем новый битовый образ картинки '''scoretext'''. Методу '''scorefont.render()''' передаются четыре параметра: текст, который мы хотим вывести, нужно ли его сглаживать, цвет текста и цвет фона. Обратите внимание, что мы добавляем слово ‘Score:’ к действительному значению переменной, конвертируя последнее в строку с помощью функции '''str(score)'''.&lt;br /&gt;
&lt;br /&gt;
Во второй строке мы просто выводим объект '''scoretext''' в заданную&lt;br /&gt;
позицию на экране. Мы сделали отступы в 5 пикселов по горизонтали&lt;br /&gt;
и вертикали, потому что так аккуратнее.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
 if (Intersect(playercar.x, playercar.y, enemycar.x, enemycar.y)):&lt;br /&gt;
    mixer.Sound.play(crasheffect)&lt;br /&gt;
    if (score &amp;gt; maxscore):&lt;br /&gt;
       maxscore = score&lt;br /&gt;
    score = 0&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь в дело вступает метод '''Intersect''', который мы написали раньше. Он проверяет, не перекрываются ли автомобиль игрока и встречный автомобиль; если да, то воспроизводит звук столкновения, проверяет, является ли текущее количество очков максимальным, и если да, обновляет '''maxscore'''. Затем он сбрасывает текущее количество очков и&lt;br /&gt;
продолжает цикл игры.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
 for ourevent in event.get():&lt;br /&gt;
    if ourevent.type == QUIT:&lt;br /&gt;
       quit = 1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Врезка|Содержание=[[Изображение:LXF112_61_1.jpg|300px]]Полюбуйтесь снимком очередной игры ''Gran Turismo''! И нечего смеяться, графика не так важна, когда вы пишете код – улучшить ее можно и потом.|Ширина=300px}}&lt;br /&gt;
&lt;br /&gt;
В процессе выполнения программы ''PyGame'' могут получать события от оконного менеджера и клавиатуры. Здесь мы проверяем, есть ли&lt;br /&gt;
события, ожидающие обработки, и если да,то проверяем, есть ли среди&lt;br /&gt;
них событие '''QUIT''' (игрок попытался закрыть окно). Если есть, мы устанавливаем переменную '''quit''' в 1, что завершает основной цикл.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
 display.update()&lt;br /&gt;
 time.delay(5)&lt;br /&gt;
 score += 1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''display.update()''' – важная функция ''PyGame'': она отображает на экране все фоновые действия и действия со спрайтами, и без нее мы бы ничего не увидели. Затем мы добавляем задержку, чтобы игра не работала слишком быстро на мощных компьютерах, и увеличиваем счетчик очков. Вы заметите, что здесь в коде заканчиваются отступы, и мы возвращаемся в начало цикла ('''while''').&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
 print ‘Your maximum score was:’, maxscore&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
А последняя строка просто выводит максимальное количество очков в окно терминала.&lt;br /&gt;
&lt;br /&gt;
Чтобы использовать код с нашего DVD, скопируйте архив '''pyracer.tar.gz''' из раздела '''Журнал/Pyracer''' в свой домашний каталог, откройте окно терминала и введите команды:&lt;br /&gt;
&lt;br /&gt;
  tar xfvz pyracer.tar.gz&lt;br /&gt;
  cd pyracer&lt;br /&gt;
  python pyracer.py&lt;br /&gt;
&lt;br /&gt;
Они распакуют содержимое архива '''.tar.gz''', переключается в созданный каталог и запускает игру. Теперь можно отредактировать '''pyracer.py''', чтобы добавить туда новые возможности, описанные во врезке, или приукрасить спрайты в каталоге данных – удачи вам! '''LXF'''&lt;br /&gt;
&lt;br /&gt;
====Новые возможности====&lt;br /&gt;
&lt;br /&gt;
Разобрались с кодом? Прекрасно – пора кое-&lt;br /&gt;
что добавить! Попробуйте-ка дополнительные&lt;br /&gt;
возможности …&lt;br /&gt;
&lt;br /&gt;
* '''Легко''' Случайные скорости. Сейчас встречные автомобили всегда движутся с одинаковой скоростью (15 пикселей на цикл). Перед основным циклом можно объявить еще одну переменную, а затем в цикле каждый раз записывать в нее случайное значение и учитывать его при сдвиге машины противника. Когда автомобиль соперника исчезает с экрана, вы устанавливаете новое случайное значение скорости для следующего.&lt;br /&gt;
* '''Средний уровень''' Индикатор повреждений. Не слишком ли жестоко сбрасывать счетчик очков при столкновении? Может, позволить автомобилю несколько столкновений, прежде чем счетчик обнулится? Это не так сложно, но сделать это можно разными способами. Попробуйте добавить индикатор столкновений в правый верхний угол экрана, который будет увеличиваться от 0% до 100%, на основе методов работы с текстом.&lt;br /&gt;
* '''Трудно''' Больше машин. Несколько автомобилей на экране могут реально обогатить игру, но здесь нужно быть осторожным. Нельзя&lt;br /&gt;
позволять автомобилям перекрывать друг друга (это было бы очень странно), и следует избегать ситуаций, заводящих игру в тупик:&lt;br /&gt;
например, слишком много автомобилей и нет пути для проезда.&lt;br /&gt;
&lt;br /&gt;
Обсудим, что у вас получилось, на сайте http://www.linuxforum.ru!&lt;/div&gt;</description>
			<pubDate>Thu, 08 Oct 2009 04:43:05 GMT</pubDate>			<dc:creator>Crazy Rebel</dc:creator>			<comments>http://wiki2.linuxformat.ru/index.php/%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5:LXF112:%D0%98%D0%B3%D1%80%D1%8B</comments>		</item>
	</channel>
</rss>