27.11.2014 Views

НЕСЛУЧАЙНО CUDA ИДЕМ? phpMyAdmin - Xakep Online

НЕСЛУЧАЙНО CUDA ИДЕМ? phpMyAdmin - Xakep Online

НЕСЛУЧАЙНО CUDA ИДЕМ? phpMyAdmin - Xakep Online

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

++++<br />

>> coding<br />

++++<br />

++++<br />

++++<br />

++++<br />

++++<br />

++++<br />

++++<br />

++++<br />

++++<br />

++++<br />

++++<br />

++++<br />

++++<br />

ИСТОРИЯ PYGAME.<br />

РАССКАЗ СОЗДАТЕЛЯ<br />

Èäåÿ ïðîåêòà PyGame ðîäèëàñü ëåòîì 2000 ãîäà. Áóäó÷è<br />

Ñ-ïðîãðàììèñòîì ñ áîëüøèì ñòàæåì, ÿ ïî÷òè îäíîâðåìåííî îáíàðóæèë<br />

äëÿ ñåáÿ Python è SDL. Áèáëèîòåêà SDL (Simple Directmedia<br />

Library) áûëà ñîçäàíà Sam Lantinga êàê êðîñïëàòôîðìåííàÿ<br />

Ñ-áèáëèîòåêà äëÿ êîíòðîëÿ ìóëüòèìåäèà. Îíà èñïîëüçîâàëàñü â<br />

ñîòíÿõ êîììåð÷åñêèõ è áåñïëàòíûõ èãð. ß áûë ïîä âïå÷àòëåíèåì<br />

îò íåå è ïîíÿë, ÷òî, åñëè ñîâìåñòèòü Python è SDL, ïîëó÷èòñÿ<br />

î÷åíü èíòåðåñíàÿ âåùü. Ðàáîòó íàä PyGame ÿ íà÷àë â îêòÿáðå 2000<br />

ãîäà, è ÷åðåç 6 ìåñÿöåâ áûëà âûïóùåíà âåðñèÿ 1.0.<br />

ции: start_location — показывает юзеру приглашение начать игру,<br />

game_location — непосредственно игра, exit_location — показывает<br />

набранный уровень. Дальше в переменную general.location сохраняется<br />

стартовая локация, то есть она как бы становится активной. Затем<br />

в бесконечном цикле мы получаем список событий и передаем их как<br />

текущей локации, так и на глобальную обработку. Затем вызывается<br />

метод draw активной локации и прорисовывает экран. Удачно выбранная<br />

архитектура дает возможность разделить код, относящий к разным<br />

локациям. Но я пропустил объяснение строчки clock.tick(30). Это очень<br />

важная часть, которая не дает 4-ядерному CoreDuo проиграть игру<br />

еще до того, как пользователь что-то успеет увидеть :). Строчка делает<br />

FPS статическим и равным 30. Иначе говоря, она оценивает разницу<br />

между последними вызовами и следит, чтобы эта разница была равна<br />

1/30 секунды. Конечно, современные игры обычно имеют динамический<br />

FPS, но это несколько сложнее в реализации, да и в аркадах<br />

бессмысленно. Посмотрим, как реализована первая локация:<br />

class Start_location(Location):<br />

def __init__(self):<br />

Location.__init__(self)<br />

self.background = pygame.image.load('f.png')<br />

def draw(self):<br />

self.window.blit(self.background, (0, 0))<br />

def event(self,event):<br />

if event.type == KEYDOWN:<br />

if event.key == 13:<br />

general.location = game_location<br />

В конструкторе вызывается функция pygame.image.load('f.<br />

png'), которая считывает рисунок, переданный в параметре, и возвращает<br />

поверхность с ним. Реализация функции draw также состоит<br />

из одной функции главной поверхности. Функция blit копирует на<br />

свою поверхность (передана в первом параметре), начиная с позиции,<br />

которая передается во втором параметре. Обработка событий<br />

реагирует лишь на нажатия , после чего выставит локацию<br />

игры как текущую. Выбранная архитектура позволяет достаточно<br />

просто разбрасывать код в отдельные обособленные объекты.<br />

Локация Exit_location сделана аналогично этой, и мы не будем ее<br />

рассматривать (изучай код на диске). Но переходить к Game_location<br />

нам рановато. Мы еще ничего не знаем о спрайтах.<br />

СПРАЙТЫ<br />

Спрайт — графический объект в игре, который может перемещаться<br />

по игровому пространству. Это важнейшая деталь в 2D-играх, хотя<br />

замечу, что и в 3D они также используются, например, при рисовании<br />

далеких объектов (при приближении они рисуются полигонами)<br />

и в процессе создания некоторых спецэффектов. То есть, спрайт<br />

— это объект, который содержит картинку или серию картинок (для<br />

анимации спрайта), координаты его нахождения и другие свойства,<br />

а также — логику движения спрайта и пр. В PyGame спрайты нужно<br />

наследовать от pygame.sprite.Sprite. Рассмотрим спрайт Камень:<br />

class Kamen(pygame.sprite.Sprite): speed = 1<br />

status = 0 # 0-down,1-left,2-right<br />

def __init__(self):<br />

pygame.sprite.Sprite.__init__(self)<br />

image = pygame.image.load('kamen.png').convert()<br />

image.set_colorkey(image.get_at((0,0)), RLEACCEL)<br />

self.image = image<br />

self.rect = image.get_rect()<br />

def update(self,args):<br />

#òóò ëîãèêà äâèæåíèÿ êàìíÿ, åå ñìîòðè â èñõîäíèêå íà äèñêå<br />

self.rect.x = newX<br />

self.rect.y = newY<br />

Итак, объект содержит в себе некоторые переменные, необходимые<br />

нам для логики — а именно, скорость и направление движения.<br />

Также здесь есть конструктор, подгружающий изображения.<br />

На процесс загрузки изображения придется обратить пристальное<br />

внимание — сначала мы загружаем картинку, а потом в ней, с<br />

помощью функции set_colorkey, заменяем все пиксели, одинаковые<br />

по цвету с пикселем из левого верхнего угла на прозрачный.<br />

Конечно, это выглядит несколько дико. На практике я советую использовать<br />

встроенную в png прозрачность, изменив convert() на<br />

convert_alpha(). Дело в том, что во время написания проги у меня<br />

не было денег на покупку лицензионного фотошопа :), поэтому<br />

картинки я рисовал в Paint, а там прозрачности я не обнаружил.<br />

Красота спрайтов особенно проявляется при их количестве. Для<br />

их удобного объединения существует класс pygame.sprite.Group.<br />

Создадим три камня:<br />

++ ++<br />

++++<br />

ВСПОМИНАНИЯ АЛЕКСАНДРА ЛОЗОВСКОГО<br />

(ИЗ СТАТЬИ «ШАГ В ПРОШЛОЕ»,<br />

http://www.xakep.ru/magazine/xs/064)<br />

++++<br />

++++<br />

 äàëåêîì 1989 ãîäó ÿ âïåðâûå óâèäåë êîìïüþòåð. Ìíå êóïèëè<br />

«Ìèêðîøó» — ñóïåðñîâåòñêóþ ÝÂÌ, êîòîðàÿ íå ìîæåò ñóùåñòâîâàòü<br />

áåç òåëåâèçîðà è ìàãíèòîëû. Íà ìíîãîêðàòíî çàæåâàííîé<br />

è ðàçãëàæåííîé ïëåíêå êàññåòû ÌÊ60, ïîìèìî êó÷è ïîëåçíûõ<br />

ïðîãðàìì, áûëè è èãðû, à ñðåäè íèõ — òà ñàìàÿ «Ëåñòíèöà». Èäåÿ<br />

åå ïðîñòà: ÷åëîâå÷åê èäåò ñíèçó ââåðõ ïî ëàáèðèíòó (òî÷íåå, äàæå<br />

íå ïî ëàáèðèíòó, à ïðîñòî ïî óðîâíÿì, ñîåäèíåííûì ëåñòíèöàìè,<br />

ïðè÷åì èãðîâîå ïîëå îòêðûâàåòñÿ âçîðó ïîëíîñòüþ). Íàâåðõó æå<br />

èãðîâîãî ïîëÿ íàõîäèòñÿ îäèí (íåñêîëüêî) èñòî÷íèêîâ, èç êîòîðûõ<br />

âûâàëèâàþòñÿ ñêà÷óùèå êàìíè. Êàìíè (â âèäå ñèìâîëà «0»)<br />

êàòÿòñÿ âíèç ïî óðîâíÿì è ëåñòíèöàì, ïîäïðûãèâàþò è íîðîâÿò<br />

ðàçäàâèòü èãðîêà. Öåëü — äîëåçòü äî âåðõà. Óðîâíåé, ïðè÷åì<br />

ñàìîãî ðàçíîãî äèçàéíà, áûëî êó÷à. ß, ê ïðèìåðó, äîøåë äî 14-ãî è<br />

íèñêîëüêî íå ðàñòåðÿë èãðîâîé èíòåðåñ :).<br />

092<br />

++++ XÀÊÅÐ 07 /127/ 09

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!