Pull to refresh

Doodle Jump на pygame

Reading time 2 min
Views 27K
Добрый…
Хочу рассказать и показать вам свой опыт знакомства с библиотекой pygame — предположительно отличной библиотекой для реализации графичиских приложений (в большей степени игр-аркад) на языке python. Для примера была реализована (частично) игра Doodle Jump.

Дисклеймер


  • Да, я использовал чужие картинки — мне стыдно и я скоро это исправлю.
  • Персонаж сейчас может только прыгать, но я планирую дописать игру до конца.
  • Да, идея не нова, но прикольно ведь получилось.
  • Да, скорее всего бред — использовать интерпретируемый язык для написания игр.
  • Я не профессиональный программист и это моя не основная деятельность.


Вместо введения


Python. Python великолепен в плане документации. Она есть, она понятна, она не лишена отличных примеров. Pygame — не исключение, поэтому предлагаю пока не останавливаться на подробностях реализации этой библиотеки, но необходимо заметить, что ее средства позволяют подгрузить изображение, и просто перемещать его по x и y. Ничего лишнего.

Архитектура


Постараемся разработатать архитектуру приложения в лучших традициях ООП. Имеем следующую диаграмму классов:

Сторонники MVC модели уже плачут, т.к. и логика и представление засунуты в тело класса.
Имеем 3 локации:
  • StartLocation — здесь крутится меню и приглашение к игре.
  • GameLocation — собственно сабж.
  • ExitLocation — выход, результаты, фанфары-овации.

Базовый объект Sprite, от которого наследуются все игровые объекты — платформы, кнопки, главный герой и т.д. По схеме все ясно.

Ключевые моменты


Events

    def event(self, event):
        if event.type == QUIT:
            sys.exit()
        elif event.type == KEYUP:
            if event.key == K_ESCAPE:
                # do something

if event.type == MOUSEMOTION:
            for btn in self.buttons:
                if btn.rect.collidepoint(pygame.mouse.get_pos()):
                #pass
                    btn.changeState(1)

С помощью механизма эвентов прозрачно перехватываются нажатия клавиш и манипуляции с мышью.

Изображения


        self.img_l = pygame.image.load('img/doodle_l.png').convert()
        self.image = self.img_l
        self.image.set_colorkey(self.image.get_at((0,0)), RLEACCEL)
        self.rect = self.image.get_rect()
        self.rect.center = (self.x,self.y)

Подгружаем картинки для спрайтов.

Столкновения

self.doodle.getLegsRect().colliderect(spr.getSurfaceRect())

Метода coliderect возвращает true, если прямоугольники, ограничивающие спрайты пересекаются.

Пара скриншотов





ToDo


  • Проработать гемплей
  • Нарисовать новые спрайты
  • Добавить звуки
  • Добавить статистику
  • Поправить алгоритмы расположения платформ
  • Добавить управление стрелками
  • Что еще?


Вместо послесловия


Знакомство с pygame можно считать законченым, дудлер прыгает и радуется жизни, но нагрузка процессора при этом стремится к 50-70%, что не есть гуд. Что это, говнокод плохая архитектура приложения или особенности языка — решать вам. Спасибо за внимание.
Исходники на github.
Tags:
Hubs:
+34
Comments 15
Comments Comments 15

Articles