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, в качестве которых может быть положительное или отрицательное целое число.
Практика.
Взяв на вооружение вышесказанное, получаем:
- # -*- coding: cp1251 -*-
- # Пример реализации движения при помощи pygame.
- from pygame import *
- import sys
- # Инициализируем загруженную библиотеку.
- init()
- # Создаем окно разрешением 640х480
- screen = display.set_mode((640, 480))
- # Устанавливаем название окна
- display.set_caption('example')
- # Загружаем фоновый рисунок, в формате:
- # jpg, png, gif(без анимации), bmp, pcx, tga(без сжатия), tif.
- background = image.load('background.bmp')
- # Отрисовываем рисунок в нашем окне
- screen.blit(background, (0, 0))
- # Создаем игровой объект
- class GameObj:
- def __init__(self, img, x, y, step):
- self.img = img # Картинка объекта
- self.x = x # x, y - коодинаты начального положения
- self.y = y
- self.step = step # Шаг, на который будет смещаться объкт
- self.pos = img.get_rect().move(x, y)
- def _move(self, event):
- if event.key == K_UP: #273 код клавиши вверх
- self.pos = self.pos.move(0, -self.step)
- if event.key == K_DOWN:
- self.pos = self.pos.move(0, self.step)
- if event.key == 276:
- self.pos = self.pos.move(-self.step, 0)
- if event.key == 275:
- self.pos = self.pos.move(self.step, 0)
- avatar = image.load('player.bmp')
- # Инициируем игровой объект
- x = GameObj(avatar, 320, 220, 10)
- # Рисуем картинку объекта, в его координатах
- screen.blit(x.img, x.pos)
- # Запускаем бесконечный цикл, чтобы окно не схлопнулось после появления :)
- while 1:
- for i in event.get(): # Перебор в списке событий
- if i.type == QUIT: # Обрабатываем событие шечка по крестику закрытия окна
- sys.exit()
- if i.type == KEYDOWN:
- screen.blit(background, x.pos, x.pos)
- x._move(i)
- screen.blit(x.img, x.pos)
- # Обновляем изображение в окне, чтобы изменения в нем стали видны
- display.flip()
Послесловие.
Собственно вот и все, коротко и сердито:) Полистав огромное колл-во игр, выложенных на оф. сайте, и обнаружив там настоящие 3д поделки — удивился и возрадовался одновременно)) Хоть я и не собираюсь покорять игродельческие вершины, но приятно, что любимый язык настолько многомерен. Если кому-то будет интересна эта тема, и у меня не пропадет желание записывать — то непременно будет продолжение).