Pull to refresh

PyGame. Введение

Reading time4 min
Views14K

PyGame. Введение.


Довелось мне как-то пообщаться с этой библиотекой, чем и хотелось бы поделиться с вами, и себе зарубочку оставить, дабы не забывать:) В этом небольшом, надеюсь, посте, я на наглядном примере, опуская некоторые самые-самые теоретические основы (которые изложены в документации), покажу базовые принципы работы с библиотекой.



Задача.

Создать «игровое» пространство, в котором, при помощи клавиш-стрелок, можно будет перемещать объект.

Теория.

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

Модуль image
1. pygame.image.load (filename): return Surface
Как можно догадаться, функция загружает некоторое изображение, и возвращеает в виде поверхности, типа, с которым при помощи функций pygame уже можно выполнять какие-либо операции (трансформировать, перемащать, удалять и пр.)

Модуль Surface
2. Surface.blit (source, dest, area=None, special_flags = 0)
Отрисовывает заданную поверхность (source) поверх базовой (Surface), где dest — кортеж (x, y), кординат отрисвоки, area — (width, height) — размеры source поверхности. На счет флагов, если честно пока не разбирался))
3. Surface.get_rect ()
Возвращет кортеж вида (x, y, width, height), где x, y — кординаты левого верхнего угла поверхности (Surface), width, height — соответственно ее размеры.

Модуль event
Он позволяет взаимодействовать с событиями и запросами. Иными словами, любое событие в pygame, нажатие клавиши например, помещается в список, состоящий из Event objects. Все эти «событийные объекты» имеют тип, получить доступ к которому можно путем Event.type.
4. pygame.event.get ()
Метод get () позволяет получить список событий.

Модуль Rect
Модуль для работы с кортежами типа rect.
5. Rect.move (X, Y)
Возвращает новый rect, в котором координаты смещены, относительно исходных, на заданные X, Y, в качестве которых может быть положительное или отрицательное целое число.

Практика.

Взяв на вооружение вышесказанное, получаем:
  1. # -*- coding: cp1251 -*-
  2. # Пример реализации движения при помощи pygame.

  3. from pygame import *
  4. import sys
  5. # Инициализируем загруженную библиотеку.
  6. init()

  7. # Создаем окно разрешением 640х480
  8. screen = display.set_mode((640, 480))

  9. # Устанавливаем название окна
  10. display.set_caption('example')

  11. # Загружаем фоновый рисунок, в формате:
  12. # jpg, png, gif(без анимации), bmp, pcx, tga(без сжатия), tif.
  13. background = image.load('background.bmp')

  14. # Отрисовываем рисунок в нашем окне
  15. screen.blit(background, (0, 0))

  16. # Создаем игровой объект
  17. class GameObj:
  18.     def __init__(self, img, x, y, step):
  19.         self.img = img # Картинка объекта
  20.         self.x = x # x, y - коодинаты начального положения
  21.         self.y = y
  22.         self.step = step # Шаг, на который будет смещаться объкт
  23.         self.pos = img.get_rect().move(x, y)
  24.     def _move(self, event):
  25.         if event.key == K_UP: #273 код клавиши вверх
  26.             self.pos = self.pos.move(0, -self.step)
  27.         if event.key == K_DOWN:
  28.             self.pos = self.pos.move(0, self.step)
  29.         if event.key == 276:
  30.             self.pos = self.pos.move(-self.step, 0)
  31.         if event.key == 275:
  32.             self.pos = self.pos.move(self.step, 0)
  33.        
  34. avatar = image.load('player.bmp')

  35. # Инициируем игровой объект
  36. x = GameObj(avatar, 320, 220, 10)

  37. # Рисуем картинку объекта, в его координатах
  38. screen.blit(x.img, x.pos)

  39. # Запускаем бесконечный цикл, чтобы окно не схлопнулось после появления :)
  40. while 1:
  41.     for i in event.get(): # Перебор в списке событий
  42.         if i.type == QUIT: # Обрабатываем событие шечка по крестику закрытия окна
  43.             sys.exit()
  44.         if i.type == KEYDOWN:
  45.             screen.blit(background, x.pos, x.pos)
  46.             x._move(i)
  47.             screen.blit(x.img, x.pos)
  48.     # Обновляем изображение в окне, чтобы изменения в нем стали видны
  49.     display.flip()


Послесловие.


Собственно вот и все, коротко и сердито:) Полистав огромное колл-во игр, выложенных на оф. сайте, и обнаружив там настоящие 3д поделки — удивился и возрадовался одновременно)) Хоть я и не собираюсь покорять игродельческие вершины, но приятно, что любимый язык настолько многомерен. Если кому-то будет интересна эта тема, и у меня не пропадет желание записывать — то непременно будет продолжение).
Tags:
Hubs:
Total votes 16: ↑16 and ↓0+16
Comments12

Articles