Views
3 years ago

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

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

++++ >> coding ++++ ++++

++++ >> coding ++++ ++++ ++++ ++++ ++++ ++++ ++++ ++++ ++++ ++++ ++++ ++++ ++++ ИСТОРИЯ PYGAME. РАССКАЗ СОЗДАТЕЛЯ Èäåÿ ïðîåêòà PyGame ðîäèëàñü ëåòîì 2000 ãîäà. Áóäó÷è Ñ-ïðîãðàììèñòîì ñ áîëüøèì ñòàæåì, ÿ ïî÷òè îäíîâðåìåííî îáíàðóæèë äëÿ ñåáÿ Python è SDL. Áèáëèîòåêà SDL (Simple Directmedia Library) áûëà ñîçäàíà Sam Lantinga êàê êðîñïëàòôîðìåííàÿ Ñ-áèáëèîòåêà äëÿ êîíòðîëÿ ìóëüòèìåäèà. Îíà èñïîëüçîâàëàñü â ñîòíÿõ êîììåð÷åñêèõ è áåñïëàòíûõ èãð. ß áûë ïîä âïå÷àòëåíèåì îò íåå è ïîíÿë, ÷òî, åñëè ñîâìåñòèòü Python è SDL, ïîëó÷èòñÿ î÷åíü èíòåðåñíàÿ âåùü. Ðàáîòó íàä PyGame ÿ íà÷àë â îêòÿáðå 2000 ãîäà, è ÷åðåç 6 ìåñÿöåâ áûëà âûïóùåíà âåðñèÿ 1.0. ции: start_location — показывает юзеру приглашение начать игру, game_location — непосредственно игра, exit_location — показывает набранный уровень. Дальше в переменную general.location сохраняется стартовая локация, то есть она как бы становится активной. Затем в бесконечном цикле мы получаем список событий и передаем их как текущей локации, так и на глобальную обработку. Затем вызывается метод draw активной локации и прорисовывает экран. Удачно выбранная архитектура дает возможность разделить код, относящий к разным локациям. Но я пропустил объяснение строчки clock.tick(30). Это очень важная часть, которая не дает 4-ядерному CoreDuo проиграть игру еще до того, как пользователь что-то успеет увидеть :). Строчка делает FPS статическим и равным 30. Иначе говоря, она оценивает разницу между последними вызовами и следит, чтобы эта разница была равна 1/30 секунды. Конечно, современные игры обычно имеют динамический FPS, но это несколько сложнее в реализации, да и в аркадах бессмысленно. Посмотрим, как реализована первая локация: class Start_location(Location): def __init__(self): Location.__init__(self) self.background = pygame.image.load('f.png') def draw(self): self.window.blit(self.background, (0, 0)) def event(self,event): if event.type == KEYDOWN: if event.key == 13: general.location = game_location В конструкторе вызывается функция pygame.image.load('f. png'), которая считывает рисунок, переданный в параметре, и возвращает поверхность с ним. Реализация функции draw также состоит из одной функции главной поверхности. Функция blit копирует на свою поверхность (передана в первом параметре), начиная с позиции, которая передается во втором параметре. Обработка событий реагирует лишь на нажатия , после чего выставит локацию игры как текущую. Выбранная архитектура позволяет достаточно просто разбрасывать код в отдельные обособленные объекты. Локация Exit_location сделана аналогично этой, и мы не будем ее рассматривать (изучай код на диске). Но переходить к Game_location нам рановато. Мы еще ничего не знаем о спрайтах. СПРАЙТЫ Спрайт — графический объект в игре, который может перемещаться по игровому пространству. Это важнейшая деталь в 2D-играх, хотя замечу, что и в 3D они также используются, например, при рисовании далеких объектов (при приближении они рисуются полигонами) и в процессе создания некоторых спецэффектов. То есть, спрайт — это объект, который содержит картинку или серию картинок (для анимации спрайта), координаты его нахождения и другие свойства, а также — логику движения спрайта и пр. В PyGame спрайты нужно наследовать от pygame.sprite.Sprite. Рассмотрим спрайт Камень: class Kamen(pygame.sprite.Sprite): speed = 1 status = 0 # 0-down,1-left,2-right def __init__(self): pygame.sprite.Sprite.__init__(self) image = pygame.image.load('kamen.png').convert() image.set_colorkey(image.get_at((0,0)), RLEACCEL) self.image = image self.rect = image.get_rect() def update(self,args): #òóò ëîãèêà äâèæåíèÿ êàìíÿ, åå ñìîòðè â èñõîäíèêå íà äèñêå self.rect.x = newX self.rect.y = newY Итак, объект содержит в себе некоторые переменные, необходимые нам для логики — а именно, скорость и направление движения. Также здесь есть конструктор, подгружающий изображения. На процесс загрузки изображения придется обратить пристальное внимание — сначала мы загружаем картинку, а потом в ней, с помощью функции set_colorkey, заменяем все пиксели, одинаковые по цвету с пикселем из левого верхнего угла на прозрачный. Конечно, это выглядит несколько дико. На практике я советую использовать встроенную в png прозрачность, изменив convert() на convert_alpha(). Дело в том, что во время написания проги у меня не было денег на покупку лицензионного фотошопа :), поэтому картинки я рисовал в Paint, а там прозрачности я не обнаружил. Красота спрайтов особенно проявляется при их количестве. Для их удобного объединения существует класс pygame.sprite.Group. Создадим три камня: ++ ++ ++++ ВСПОМИНАНИЯ АЛЕКСАНДРА ЛОЗОВСКОГО (ИЗ СТАТЬИ «ШАГ В ПРОШЛОЕ», http://www.xakep.ru/magazine/xs/064) ++++ ++++  äàëåêîì 1989 ãîäó ÿ âïåðâûå óâèäåë êîìïüþòåð. Ìíå êóïèëè «Ìèêðîøó» — ñóïåðñîâåòñêóþ ÝÂÌ, êîòîðàÿ íå ìîæåò ñóùåñòâîâàòü áåç òåëåâèçîðà è ìàãíèòîëû. Íà ìíîãîêðàòíî çàæåâàííîé è ðàçãëàæåííîé ïëåíêå êàññåòû ÌÊ60, ïîìèìî êó÷è ïîëåçíûõ ïðîãðàìì, áûëè è èãðû, à ñðåäè íèõ — òà ñàìàÿ «Ëåñòíèöà». Èäåÿ åå ïðîñòà: ÷åëîâå÷åê èäåò ñíèçó ââåðõ ïî ëàáèðèíòó (òî÷íåå, äàæå íå ïî ëàáèðèíòó, à ïðîñòî ïî óðîâíÿì, ñîåäèíåííûì ëåñòíèöàìè, ïðè÷åì èãðîâîå ïîëå îòêðûâàåòñÿ âçîðó ïîëíîñòüþ). Íàâåðõó æå èãðîâîãî ïîëÿ íàõîäèòñÿ îäèí (íåñêîëüêî) èñòî÷íèêîâ, èç êîòîðûõ âûâàëèâàþòñÿ ñêà÷óùèå êàìíè. Êàìíè (â âèäå ñèìâîëà «0») êàòÿòñÿ âíèç ïî óðîâíÿì è ëåñòíèöàì, ïîäïðûãèâàþò è íîðîâÿò ðàçäàâèòü èãðîêà. Öåëü — äîëåçòü äî âåðõà. Óðîâíåé, ïðè÷åì ñàìîãî ðàçíîãî äèçàéíà, áûëî êó÷à. ß, ê ïðèìåðó, äîøåë äî 14-ãî è íèñêîëüêî íå ðàñòåðÿë èãðîâîé èíòåðåñ :). 092 ++++ XÀÊÅÐ 07 /127/ 09

coding СКРИН ПЕРВОЙ ЛОКА- ЦИИ «ЛЕСТНИЦЫ» КНИГА О PYGAME kamens = pygame.sprite.Group() for i in xrange(0,3): kamens.add( Kamen() ) Если нам нужно, чтобы камни немного продвинулись, вызовем kamens.update(args), и эта функция вызовет функцию update для каждого спрайта из группы. Для прорисовки всех спрайтов существует функция draw, — она принимает параметр «поверхность», на которой нужно прорисовать спрайты: kamens.draw(window) Теперь мы готовы посмотреть на главную локацию — Game_location, а точнее — на функцию draw: def draw(self): self.window.blit(self.background, (0, 0)) self.kolobok.draw(self.window) self.kamens.update() self.kamens.draw(self.window) for kamen in pygame.sprite. \ spritecollide(self.kolobok,self.kamens,0): general.location = exit_location В начале этой функции на главную поверхность отображается фоновое изображение, затем — рисуется спрайт колобка. Далее, в группе спрайтов «Камни», появляются движения, которые рисуются на экране. Наконец, последние две строчки наиболее интересны, ведь с помощью одной простой функции pygame.sprite.spritecollide() мы проверяем, пересекся ли колобок с каким-то камнем. Эта функция возвращает булевый список, и если произошло столкновение, то мы изменяем локацию на exit_location. ОБРАБОТКА КЛАВИШ Сначала рассмотрим, как двигается колобок, ведь он не принимает входящих событий о нажатии клавиш! Объект колобка использует функцию pygame.key.get_pressed(), которая возвращает булевый список с состоянием нажатия каждой клавиши. Мы потом можем его проверить, используя константы. «Движущий» кусок кода колобка выглядит так: keys = pygame.key.get_pressed() if keys[K_LEFT]: self.left() if keys[K_RIGHT]: self.right() if keys[K_UP]: self.up() if keys[K_DOWN]: self.down() МУЗЫКА Игра без музыки — это не игра. К тому же, «поставить XÀÊÅÐ 07 /127/ 09 ЛУЧШАЯ КНИГА О ГЕЙМ-КОДИНГЕ ОТ АНДРЕ ЛАМОТА! пластиночку» можно очень просто: pygame.mixer.music.load('s.mp3') pygame.mixer.music.play() Эти функции загружают mp3-файл и начинают его проигрывание. Далее мы можем управлять процессом проигрывания. Например, пауза и снятие с паузы будут выглядеть так: if event.type == KEYUP: if event.key == K_m: if self.music: pygame.mixer.music.pause() self.music = 0 else: pygame.mixer.music.unpause() self.music = 1 Кстати, музыка не будет играть, если в mp3-шном файле есть теги второй версии. И это баг, а не фича. GAME OVER На этом ознакомление с PyGame можно считать завершенным. Осталось лишь зайти на диск, найти там игру и поиграть в нее. Удачи тебе в создании собственных миров! z HTTP://WWW links • www.pygame.org — сайт PyGame. • www.penzilla.net/ tutorials/python/pygame — несколько интересных туториалов по PyGame. • www.python.org — сайт Python’а. DVD dvd На диске смотри игруху со всеми исходниками. 093

ИюНь - Xakep Online
Май - Xakep Online
Скачать - Xakep Online
УЧИМ КАКОценить сбалансированность системы ... - Xakep Online
Январь - Xakep Online
ЛЕГКИЙ ХАК - Xakep Online
7 ЧУДЕС KDE - Xakep Online
Офисное западло - Xakep Online
JIT SPRAY АНАЛИЗ TDSS - Xakep Online
Скачать - Xakep Online
ЛУЧШИХ ВИРУСОВ - Xakep Online
Ноябрь - Xakep Online
WebMoney - Xakep Online
Untitled - Xakep Online
КОНКУРС - Xakep Online
Скачать - Xakep Online
Много новогодних конкурсов Много новогодних ... - Xakep Online
Взлом GSM - Xakep Online
2009 - Xakep Online
ВЗЛОМ ИНТЕРНЕТ-МАГАЗИНА: - Xakep Online
с татьи - Xakep Online
c-лето ;) - Xakep Online
содержание 10 (59) - Xakep Online
Ноябрь - Xakep Online
ЗАКАДРИ КАРДИНГ НАШИ ИДУТ! - Xakep Online
шпион внутри - Xakep Online
тест - Xakep Online