ÃÂÕáÛãçÃÂÙÃÂÞ CUDA ØÔÕÃÂœ? phpMyAdmin - Xakep Online
ÃÂÕáÛãçÃÂÙÃÂÞ CUDA ØÔÕÃÂœ? phpMyAdmin - Xakep Online
ÃÂÕáÛãçÃÂÙÃÂÞ CUDA ØÔÕÃÂœ? phpMyAdmin - Xakep Online
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