Библиотека pygame / часть 3. больше о спрайтах

Основные модули пакета Pygame

Модуль Назначение
pygame.cdrom Доступ к CD-приводам и управление ими
pygame.cursors Загружает изображения курсора
pygame.display Доступ к дисплею
pygame.draw Рисует фигуры, линии и точки
pygame.event Управление внешними событиями
pygame.font Использует системные шрифты
pygame.image Загружает и сохраняет изображение
pygame.joystick Использует джойстики и аналогичные устройства
pygame.key Считывает нажатия клавиш с клавиатуры
pygame.mixer Загружает и воспроизводит мелодии
pygame.mouse Управляет мышью
pygame.movie Воспроизведение видеофайлов
pygame.music Работает с музыкой и потоковым аудио
pygame.overlay Доступ к расширенным видеоизображениям
pygame Содержит функции Pygame высокого уровня
pygame.rect Управляет прямоугольными областями
pygame.sndarray Манипулирует звуковыми данными
pygame.sprite Управление движущимися изображениями
pygame.surface Управляет изображениями и экраном
pygame.surfarray Манипулирует данными пикселей изображения
pygame.time модуль pygame для управления временем и частотой кадров
pygame.transform Изменение размера и перемещение изображений

Окно PyGame

Подключение библиотеки PyGame

import pygame

Инициализация PyGame

pygame.init()

Окно игры: размер, позиция

gameScreen = pygame.display.set_mode((400, 300))

модуль os — позиция окна

import os

x = 100

y = 100

os.environ = «%d,%d» % (x,y)

параметры окна

size =

screen = pygame.display.set_mode(size)

pygame.display.set_caption(«Test drawings»)

gameScreen.fill((0,0,255))

pygame.display.flip()

Цикл игры, выход из игры

Цикл игры

runGame = True # флаг выходв из цикла игры

while runGame:

Отслеживание события: «закрыть окно»

for event in pygame.event.get():

if event.type == pygame.QUIT: runGame = False

Выход из игры: pygame.quit()

Recent Releases

16 Nov, 2020

Text Editing Input IME example — 0.0.1

15 Nov, 2020

Sprinting Shark — Remastered — 1.0.0.0

14 Nov, 2020

Historical Battle Simulator — 0.5.3.7

14 Nov, 2020

Dodge — 1

13 Nov, 2020

Midi musical intrument controllers and synthesizers with python and pygame — 0.0.1

12 Nov, 2020

Wuxia World — Beta 1.3

11 Nov, 2020

Finger painting with multi-touch in pygame 2 — 0.0.1

6 Nov, 2020

Snake PNG — 1.0.0

4 Nov, 2020

Tic Tac toe Project Game Multiplayer — Tic Tac Toe 1.0

31 Oct, 2020

Pygame Physics and Delta Time — 1.0

pygame 818
2d 748
arcade 733
game 390
python 336
puzzle 333
shooter 261
strategy 251
action 211
other 151
libraries 150
space 150
simple 141
platformer 125
multiplayer 124
rpg 114
applications 92
retro 88
gpl 82
3d 78
pyopengl 73
snake 71
pyweek 71
geometrian 68
library 64
gui 61
engine 58
physics 57
simulation 52
adventure 46
ALL the tags!

Groups

Another super useful object that PyGame provides are Sprite . They are exactly what they sound like – Groups of Sprites. So why do we use Sprite Groups instead of a list? Well, sprite groups have several methods built into them that will help us later with collisions and updating. Let’s make a Group right now that will hold all the Sprites in our game. After we create it, we will add the Player to the Group since that’s our only Sprite so far. We can create another group for enemies as well. When we call a Sprite’s method, the sprite will be removed from all groups that it is a part of.

1
2
3

Now that we have this group, let’s change how we are rendering our objects so that we render all objects in this group.

1
2

Now anything we put into will be rendered.

Recent Releases

16 Nov, 2020

Text Editing Input IME example — 0.0.1

15 Nov, 2020

Sprinting Shark — Remastered — 1.0.0.0

14 Nov, 2020

Historical Battle Simulator — 0.5.3.7

14 Nov, 2020

Dodge — 1

13 Nov, 2020

Midi musical intrument controllers and synthesizers with python and pygame — 0.0.1

12 Nov, 2020

Wuxia World — Beta 1.3

11 Nov, 2020

Finger painting with multi-touch in pygame 2 — 0.0.1

6 Nov, 2020

Snake PNG — 1.0.0

4 Nov, 2020

Tic Tac toe Project Game Multiplayer — Tic Tac Toe 1.0

31 Oct, 2020

Pygame Physics and Delta Time — 1.0

pygame 818
2d 748
arcade 733
game 390
python 336
puzzle 333
shooter 261
strategy 251
action 211
other 151
libraries 150
space 150
simple 141
platformer 125
multiplayer 124
rpg 114
applications 92
retro 88
gpl 82
3d 78
pyopengl 73
snake 71
pyweek 71
geometrian 68
library 64
gui 61
engine 58
physics 57
simulation 52
adventure 46
ALL the tags!

Known issues

We have an up to date list of issues marked with the Compatibility Python 2 label. These are compatibility issues where something worked in pygame 1, but doesn’t work in pygame 2.

At the time of writing this included:

  • the pygame.cdrom package not being there (mainly because it isn’t in SDL2 anymore).
  • pygame.scrap is only working with text, not images (needs some porting and testing done).
  • pygame.event.post is having issues with some event types.
  • pygame.display.set_palette is not implemented (not in SDL2).
  • display.set_mode() ignores depth value. It just returns one it thinks is appropriate.

We’ve already investigated many of these issues, and even have some work in progress on some of them. If you’re particularly interested in one of them please let us know. Also if you have any issues with your existing apps, we are very interested in finding out.

python3 -m pip install pygame==2.0.0

Happy pygame 20th birthday all!

Объект Surface

pygame.Surface

объект pygame для представления изображений

Surface((width, height), flags=0, depth=0, masks=None) -> Surface

Surface((width, height), flags=0, Surface) -> Surface

Наложение поверхностей, прозрачность.

#-*-coding: utf-8-*-
import pygame
pygame.init()

# Create base surface
screen = pygame.display.set_mode((500,500))

# Create new surface
surface1 = pygame.Surface((150,150))
surface1.fill((255,0,0))
surface1.set_alpha(150)
#
surface2 = pygame.Surface((100,100))
surface2.fill((255,255,0))
surface2.set_alpha(100)

# Create image
bgImg = pygame.image.load(«images//bg3.jpg»)
bgImg = pygame.transform.scale(bgImg,(500,500))
#
pict1 = pygame.image.load(«images//pict1.jpg»)
pict1 = pygame.transform.scale(pict1,(130,130))
pict1.set_alpha(100)
#
pict2 = pygame.image.load(«images//pict2.gif»)
pict2 = pygame.transform.scale(pict2,(50,50))

clock = pygame.time.Clock()
running = 1
dX = dY = 1
x = y = 0

while running:
clock.tick(50)
event = pygame.event.poll()
if event.type == pygame.QUIT: running = 0
x += 8 * dX
y += 6 * dY
if (y<0 or y>= (screen.get_height() — pict2.get_height())) :
dY *= -1
if (x<0 or x>= (screen.get_width() — pict2.get_width())) :
dX *= -1

screen.blit(bgImg,(0,0))
surface1.blit(pict1,(0,0))
screen.blit(surface1,(20,50))
screen.blit(surface2,(150,150))
screen.blit(pict2,(x,y))

pygame.display.flip()

pygame.quit()

Цвет¶

Цвета в библиотеке pygame представлены в соответствии с моделью RGB:
https://ru.wikipedia.org/wiki/RGB

Значение для цвета можно задать тройкой чисел, каждое из которых лежит
в диапазоне от 0 до 255. Первое значение в последовательности определяет,
какое количество красного содержится в данном оттенке, второе — зеленого,
третье — голубого. Чем меньше значение числа, тем темнее будет оттенок.
Например, красный цвет можно представить как (255, 0, 0), белый как (255, 255, 255),
а черный как (0, 0, 0).

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

from pygame.color import THECOLORS

Закрасим основной экран c помощью метода :

Thanks

A very special thanks to the people who have volunteered commits to pygame since the last release. In alphabetical order…

(@alphaCTzo7G) | Amos Bastian (@amosbastian) | Andrey Lopukhov (@andreyx86) | Augusto Noronha (@augusto2112) | Bernardo Sulzbach (@bernardosulzbach) | (@Bottersnike) | Cai Q.T. (@CAIQT) | (@Cerealdragon) | Charles (@charlesej) | (@ChrisWeissNike) | (@cmtrapp02) | Daniel Molina (@daniel-molina) | David Caughell (@DavidCaughell) | David Lönnhager (@dlon) | (@dr0id) | burmer (@dtschirmer) | (@e1000) | xFly_Dragon (@husano896) | (@IchMageBaume) | René Dudfield (@illume) | (@LambdaGoblin) | Lenard Lindstrom (@llindstrom) | François Magimel (@Linkid) | (@LiquidFenrir) | Mark Hurley (@markph0204) | Marius Gedminas (@mgedmin) | (@metulburr) | Michael Farrell (@micolous) | Dominik George (@Natureshadow) | Nik (@nikolas) | Nunu-Willump (@Nunu-Willump) | (@pleboulanger) | Rebecca Chen (@rchen152) | (@robertpfeiffer) | Sett (@sw00) |

Quite a few new people have helped out with this release

An equally special thanks to everyone else who has contributed in
other ways. Thanks to claudeb, imallet, and deshipu for moderating the
discord chat to keep it friendly. Thanks to the twitter folk, and the
stackoverflow Q&A people. Thanks to everyone who puts their game up
on the pygame website for others to look at. Thanks to people making
tutorials and sharing articles & books they’ve written. Thanks to
the r/pygame mods and community. Thanks to pyladies groups for running
fun sessions, and for making things better. Thanks to the teachers
providing feedback, and for doing something fun with their students.
Thanks to Debian, Raspberrypi, Arch, Fedora, and all the other community groups.

Текст и шрифты¶

При работе с текстом мы будем использовать шрифты — группы символов объединенных
по стилистическому или иному признаку. Шрифты в библиотеке pygame представлены типом

Чтобы создать объект на основе имеющегося в системе шрифта вызовем следующую функцию:

SysFont(name, size, bold=False, italic=False)

С помощью параметра передаем в функцию имя шрифта, параметр
— размер шрифта в пунктах. Параметры и отвечают за начертание шрифта.

Список имеющихся в системе шрифтов можно получить с помощью функции :

pygame.font.get_fonts() -> list of strings

Далее, с помощью метода нашего объекта типа получаем изображение
с текстом, которое передаем на вход методу для отрисовке на нашем основном экране:

screen = pygame.display.set_mode(size)
screen.fill(THECOLORS'white'])
font = pygame.font.SysFont('couriernew', 40)
text = font.render(str('HELLO'), True, THECOLORS'green'])
screen.blit(text, (50, 50))

PyOpenGL / related

Generally PyOpenGL games will also make use of PyGame.

http://pyopengl.sourceforge.net/

PyOpenGL includes support for OpenGL v1.1, GLU, GLUT v3.7, GLE 3, WGL 4, and Togl (Tk OpenGL widget) 1.6. It also includes support for dozens of extensions (where supported in the underlying implementation). OpenGL is an environment for developing high-performance 2D and 3D applications.

http://glewpy.sourceforge.net/

GLEWpy aims to bring advanced OpenGL extensions to Python. This will allow the Python OpenGL developer to use features such as fragment and vertex shaders and image processing on the GPU. It serves as a compliment to PyOpenGL and toolkits such as GLUT and SDL (pygame).

http://slut.sourceforge.net/

Slut is a programming framework for generative, synthetic, interactive, network-enabled graphics. It is a layer above PyGame, PyOpenGL and Twisted.

http://www.ixi-software.net/content/body_software_mirra.html

Mirra is a 2D openGL python framework.

http://pypi.python.org/pypi/QGL

QGL is an intentionaly minimal scenegraph for rendering textured quads and text strings to an OpenGL display. It requires pygame, and is designed for building 2D games with hardware accelerated effects. It includes a pure Python and a Pyrex Renderer.

http://rene.f0o.com/rdpyg/

A collection of code for games using python. Mostly code for use with games made with pygame, and/or pyopengl. Although some of it can be used outside.

http://pduel.sourceforge.net/spyre/

SPyRE is a lightweight OpenGL graphics engine, written entirely in Python. It includes a variety of cameras, several interfaces for user interaction, lighting controls and fog.

http://opioid-interactive.com/~shang/projects/pygext/

Pygame Extended (or pygext) contains additions to pygame.draw (e.g. rectangles with round corners), an opengl accelerated 2D vector graphics library and a full blown, event-based sprite/scene engine.

http://arcticpaint.com/projects/rabbyt/

Rabbyt is a fast 2d sprite library for Python. Commonly used in combination with OpenGL context of the pyglet framework listed above.

Как установить Pygame

Pygame не входит в стандартную библиотеку Python, то есть не поставляется с установочным пакетом, а требует отдельной установки. В Ubuntu и родственных дистрибутивах его можно установить с помощью pip:

python3 -m pip install -U pygame --user

Если pip не установлен, предварительно выполняем команду:

sudo apt install python3-pip

Для Windows:

py -m pip install -U pygame --user

Дополнительную информацию по установке смотрите здесь: https://www.pygame.org/wiki/GettingStarted

Проверить, что все установилось нормально, можно так:

python3 -m pygame.examples.aliens

Для Windows вместо ‘python3’ надо писать ‘py’. Произойдет запуск игры aliens, включенной в модуль examples (примеры) библиотеки pygame.

More details.

Vector: Explain slices and swizzling Update surface documentation Make mask offset boundary checking consistent Update midi documentation Fix drawing 1 pixel wide off-surface ellipses Use SDL_RWops instead of pg_FopenUTF8. Fix LayeredDirty’s inconsistent use of its source rect Workaround for locale errors with PyPy Update dependencies for manylinux builds. Upload .whl binaries to a github draft release when creating tag. Update scrap documentation Fix zero-sized mask segfaults Fix the SystemError when no type specific clipboard content exists. Update scrap tests Update freetype tests Improved mask tests Add sprite tests bugfix for dirty sprite when using a source rect Add missing Vector2.magnitude() Fix mask index out of bounds segmentation fault Mask constructor ‘fill’ argument Use version directives consistently in documentation and update style Event functions: pump parameter and keyword arguments Add customized repr()/str() output for Mask objects Fix aaline()/aalines() not drawing on a surface’s border Keep surface alpha value for copied surfaces with SRCALPHA flag Load images on multiple threads properly Fix overlap_mask() making incorrect mask Added get_init() to all modules with an init() function Allow camera module to be used on Windows API version macros Use pre styles in docs Converting between ANSI notes and MIDI notes or frequencies Compile for PyPy 3 and PyPy fixes Chimp tutorial: reindent and clean some code Chimp tutorial: fix reST syntax Handle Unicode objects and paths properly Fix failing tests test_aapolygon and test_pie Fix freetype rotation rendering aaline cleanup draw.aaline: blend correctly Fixed FreeType memory leaks Fix surface.blits() bugs

Организация игровых ассетов

В первую очередь нужна папка для хранения ассетов. В играх так называют, например, арты или звук. Назовем папку “img” и перенесем туда изображение игрока.

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

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

Если используется Windows, тогда он будет выглядеть приблизительно вот так:

Разные операционные системы по-разному подходят к поиску местоположения файлов. С помощью команды можно позволить ПК самостоятельно определять правильный путь (вне зависимости от того, используется “/” или “”).

Теперь можно точно указать местоположение папки “img”:

Изображение загружается с помощью , а ускорит прорисовку в Pygame, конвертируя изображение в тот формат, который будет быстрее появляться на экране. Теперь можно заменить зеленый квадрат на изображение персонажа:

Обратите внимание, что команды больше нет, потому что заливка одним цветом больше не нужна. работает так же — теперь она будет окружать прямоугольником любое изображение

Если сейчас запустить программу, вы увидите маленького инопланетянина, который двигается по экрану. Но осталась одна проблема, которой не видно из-за черного фона. С помощью команды нужно поменять цвет фона, например, на синий. Теперь понятно, в чем проблема.

Файл изображения на компьютере — это всегда сетка пикселей. Вне зависимости от нарисованной формы, имеются дополнительные пиксели, заполняющие «фон». Нужно сообщить Pygame, чтобы она игнорировала пиксели, которые не нужны. В случае этого изображения речь идет о черном цвете, поэтому в код необходимо добавить следующее:

говорит Pygame игнорировать любые пиксели конкретного цвета. Так выглядит намного лучше:

Обработка нажатий клавиш клавиатуры

Создадим базовый шаблон для нашей игры (запомните его наизусть)

import pygame
from sys import exit

pygame.init()

WHITE = (255, 255, 255)

BLACK = (, , )

PURPLE = (156, 39, 176)

INDIGO = (63, 81, 181)

BLUE = (33, 150, 243)

GREEN = (76, 175, 80)

YELLOW = (255, 235, 59)

ORANGE = (255, 152, )

GREY = (158, 158, 158)

display = pygame.display.set_mode( (800, 600) )

FPS = 60

clock = pygame.time.Clock()
while True:

    for event in pygame.event.get():

        if event.type == pygame.QUIT:

            pygame.quit()

            exit()

    pygame.display.update()

    clock.tick(FPS)

pygame отслеживает все происходящие в игре события и позволяет нам их обрабатывать. При возникновении события создается экземпляр класса Event. Каждый экземпляр этого класса имеет определенный список свойств. Одно из этих свойств — это свойство type. Именно оно позволяет нам понять, какое событие произошло.

События клавиатуры имеют тип KEYDOWN.

Еще одно важное свойство — это свойство key. Для нас оно представляет интерес, когда мы обнаружили событие с типом KEYDOWN

С помощью свойства key мы можем узнать, какая клавиша была нажата.

import pygame
from sys import exit

pygame.init()

WHITE = (255, 255, 255)

BLACK = (, , )

PURPLE = (156, 39, 176)

INDIGO = (63, 81, 181)

BLUE = (33, 150, 243)

GREEN = (76, 175, 80)

YELLOW = (255, 235, 59)

ORANGE = (255, 152, )

GREY = (158, 158, 158)

display = pygame.display.set_mode( (800, 600) )

FPS = 60

clock = pygame.time.Clock()
while True:

    for event in pygame.event.get():

        if event.type == pygame.QUIT:

            pygame.quit()

            exit()
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                print(‘Левая стрелка’)
            elif event.key == pygame.K_RIGHT:
                print(‘Правая стрелка’)
            elif event.key ==pygame.K_UP:
                print(‘Стрелка вверх’)
            elif event.key ==pygame.K_DOWN:
                print(‘Стрелка вниз’)

    pygame.display.update()

    clock.tick(FPS)

После запуска скрипта при нажатии стрелок на клавиатуре в стандартный вывод будут выводится строки с информацией о нажатой клавише.

Напишем код, который будет рисовать кружок

pygame.draw.circle(display, BLUE, (400, 300), 5)
# Добавьте этот скрипт после цикла while

Заставим кружок двигаться. Нужно объявить две переменные — x и y. Эти переменные будут координатами нашего кружка. При нажатии клавиши мы будем изменять эти переменные. Если нажата стрелка вправо, увеличим переменную x на 10. Если — стрелка влево, уменьшим переменную x на 10. Проделаем то же самое с переменной y.

import pygame
from sys import exit

pygame.init()

WHITE = (255, 255, 255)

BLACK = (, , )

PURPLE = (156, 39, 176)

INDIGO = (63, 81, 181)

BLUE = (33, 150, 243)

GREEN = (76, 175, 80)

YELLOW = (255, 235, 59)

ORANGE = (255, 152, )

GREY = (158, 158, 158)

display = pygame.display.set_mode( (800, 600) )

FPS = 60

clock = pygame.time.Clock()
x = 400 # начальная координата по оси X
y = 300 # начальная координата по оси Y
while True:

    # Рисуем кружок в точке с координатами x,y
    pygame.draw.circle(display, BLUE, (x, y), 5)

    for event in pygame.event.get():

        if event.type == pygame.QUIT:

            pygame.quit()

            exit()

        elif event.type == pygame.KEYDOWN:

            if event.key == pygame.K_LEFT:

                print(‘Левая стрелка’)
                x -= 10

            elif event.key == pygame.K_RIGHT:

                print(‘Правая стрелка’)
                x += 10

            elif event.key == pygame.K_UP:

                print(‘Стрелка вверх’)
                y -= 10

            elif event.key == pygame.K_DOWN:

                print(‘Стрелка вниз’)
                y += 10

    pygame.display.update()

    clock.tick(FPS)

Есть один нюанс. Шарик перемещается только один раз при зажатии одной из клавиш. Немного изменим наш код для того, чтобы он обратывал зажатые клавиш.

# … Код выше без изменений
while True:

    pygame.draw.circle(display, BLUE, (x, y), 5)

    for event in pygame.event.get():

        if event.type == pygame.QUIT:

            pygame.quit()

            exit()

    # Найдите 10 отличий

    # Удаляем elif с KEYDOWN
    keys = pygame.key.get_pressed() # Словарь всех нажатых клавиш

    # Обрабатываем каждую клавишу по отдельности
    if keys:
        x -= 10
    if keys:
        x += 10
    if keys:
        y -= 10
    if keys:
        y += 10

    pygame.display.update()

    clock.tick(FPS)

Игры сверху вниз

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

Player_sprite получает вектор движения с двумя атрибутами: change_x и change_y. Простым примером этого может быть перемещение игрока с помощью клавиатуры. Например, это может быть в настраиваемом дочернем элементе класса Window:

Хотя этот код устанавливает скорость игрока, он не перемещает игрока. В методе обновления класса Window при вызове Physics_engine.update () игрок будет перемещаться, но не через стены.

Полный пример см. В разделе sprite_move_walls.py.

Где искать арт

Когда вам нужен арт для игры, у вас есть 3 варианта:

  1. Нарисовать его самостоятельно
  2. Найти художника
  3. Использовать готовые арты из интернета

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

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

Особенность арта Kenney (помимо отличного качества) — он выпускает контент в коллекциях. Это значит, что разработчик получает различные изображения, выполненные в едином стиле, и нет необходимости брать картинки в разных источниках.

В этом уроке будет использоваться набор Platformer Art Complete Pack от Kenney, в котором полно графики для создания игры в жанре платформера. Нужно всего лишь скачать его и распаковать. Начнем с изображения p1_jump.png.

Или же можете просто скачать картинку отсюда.

Место Pygame среди инструментов разработки игр

Популярна ли библиотека pygame, пишут ли на ней сложные игры? Хотя на Pygame есть востребованные игры, в подавляющем случае – нет. Для программирования под андроид и десктоп существуют более функциональные игровые движки.

Для создания двумерных браузерных игр инди-разработчики (от слова independent – независимый, здесь понимается как «одиночка», «не работающий в команде или на фирму») часто используют JavaScript и его игровые библиотеки, так как JS родной для веба язык. Хотя существуют проекты перевода с Python на JavaScript (https://github.com/jggatc/pyjsdl).

Для запуска python-приложений на Android см. https://github.com/kivy/python-for-android и https://github.com/duducosmos/pgs4a.

В чем тогда преимущество Pygame? Оно в легком вхождении в отрасль и прототипировании. Pygame – небольшая библиотека. Сам Python позволяет писать короткий и ясный код. Так что это хорошее начало, чтобы познакомиться с особенностями разработки игр. Более опытными программистами Pygame может использоваться для быстрого создания прототипа игры, чтобы посмотреть, как все будет работать. После этого программа переписывается на другом языке. Другими словами, преимущество Pygame в легком обучении и быстрой разработке.

После Pygame жизнь разработчика игр на Питоне не заканчивается. Следует посмотреть в сторону Kivy (https://kivy.org). Это уже полноценный фреймворк, позволяющий писать на Python не только игровые приложения. В большей степени ориентирован для разработки под мобильные платформы.

Credits

Thanks to everyone who has helped contribute to this library.
Special thanks are also in order.

  • Marcus Von Appen: many changes, and fixes, 1.7.1+ freebsd maintainer
  • Lenard Lindstrom: the 1.8+ windows maintainer, many changes, and fixes
  • Brian Fisher for svn auto builder, bug tracker and many contributions
  • Rene Dudfield: many changes, and fixes, 1.7+ release manager/maintainer
  • Phil Hassey for his work on the pygame.org website
  • DR0ID for his work on the sprite module
  • Richard Goedeken for his smoothscale function
  • Ulf Ekström for his pixel perfect collision detection code
  • Pete Shinners: original author
  • David Clark for filling the right-hand-man position
  • Ed Boraas and Francis Irving: Debian packages
  • Maxim Sobolev: FreeBSD packaging
  • Bob Ippolito: MacOS and OS X porting (much work!)
  • Jan Ekhol, Ray Kelm, and Peter Nicolai: putting up with early design ideas
  • Nat Pryce for starting our unit tests
  • Dan Richter for documentation work
  • TheCorruptor for his incredible logos and graphics
  • Nicholas Dudfield: many test improvements
  • Alex Folkner for pygame-ctypes

Thanks to those sending in patches and fixes: Niki Spahiev, Gordon
Tyler, Nathaniel Pryce, Dave Wallace, John Popplewell, Michael Urman,
Andrew Straw, Michael Hudson, Ole Martin Bjoerndalen, Herve Cauwelier,
James Mazer, Lalo Martins, Timothy Stranex, Chad Lester, Matthias
Spiller, Bo Jangeborg, Dmitry Borisov, Campbell Barton, Diego Essaya,
Eyal Lotem, Regis Desgroppes, Emmanuel Hainry, Randy Kaelber
Matthew L Daniel, Nirav Patel, Forrest Voight, Charlie Nolan,
Frankie Robertson, John Krukoff, Lorenz Quack, Nick Irvine,
Michael George, Saul Spatz, Thomas Ibbotson, Tom Rothamel, Evan Kroske,
Cambell Barton.

And our bug hunters above and beyond: Angus, Guillaume Proux, Frank
Raiser, Austin Henry, Kaweh Kazemi, Arturo Aldama, Mike Mulcheck,
Michael Benfield, David Lau

There’s many more folks out there who’ve submitted helpful ideas, kept
this project going, and basically made our life easier. Thanks!

Many thank you’s for people making documentation comments, and adding to the
pygame.org wiki.

Also many thanks for people creating games and putting them on the
pygame.org website for others to learn from and enjoy.

Lots of thanks to James Paige for hosting the pygame bugzilla.

Also a big thanks to Roger Dingledine and the crew at SEUL.ORG for our
excellent hosting.

События мыши

В pygame обрабатываются три типа событий мыши: нажатие кнопки (значение свойства type события соответствует MOUSEBUTTONDOWN), отпускание кнопки (MOUSEBUTTONUP), перемещение мыши (MOUSEMOTION). Какая именно кнопка была нажата, записывается в другое свойство события — button. Для левой кнопки это число 1, для средней — 2, для правой — 3, для прокручивания вперед — 4, для прокручивания назад — 5.

Другим атрибутом мышиных типов событий является свойство pos, в которое записываются координаты нажатия (кортеж из двух чисел).

При нажатии левой кнопки мыши будем рисовать оранжевый кружок

# Код выше без изменений…
while True:

    display.fill(BLACK)

    pygame.draw.circle(display, BLUE, (x, y), 5)

    for event in pygame.event.get():

        if event.type == pygame.QUIT:

            pygame.quit()

            exit()
         elif event.type == pygame.MOUSEBUTTONDOWN:
            if event.button == 1:
                pygame.draw.circle(display, ORANGE, (event.pos[], event.pos), 30)

    keys = pygame.key.get_pressed()

    if keys:

        print(‘Левая стрелка’)

        x -= 10

    if keys:

        print(‘Правая стрелка’)

        x += 10

    if keys:

        print(‘Стрелка вверх’)

        y -= 10

    if keys:

        print(‘Стрелка вниз’)

        y += 10

    pygame.display.update()

    clock.tick(FPS)

Добавим появление белых кружков по нажатию правой кнопки мыши.

# Код выше без изменений…
while True:

    display.fill(BLACK)

    pygame.draw.circle(display, BLUE, (x, y), 5)

    for event in pygame.event.get():

        if event.type == pygame.QUIT:

            pygame.quit()

            exit()

         elif event.type == pygame.MOUSEBUTTONDOWN:

            if event.button == 1:

                pygame.draw.circle(display, ORANGE, (event.pos[], event.pos), 30)
            elif event.button == 3:
                pygame.draw.circle(display, WHITE, (event.pos[], event.pos), 30)

    keys = pygame.key.get_pressed()

    if keys:

        print(‘Левая стрелка’)

        x -= 10

    if keys:

        print(‘Правая стрелка’)

        x += 10

    if keys:

        print(‘Стрелка вверх’)

        y -= 10

    if keys:

        print(‘Стрелка вниз’)

        y += 10

    pygame.display.update()

    clock.tick(FPS)

Добавим очищение поверхности при скролле колесика мыши

# Код выше без изменений…
while True:

    display.fill(BLACK)

    pygame.draw.circle(display, BLUE, (x, y), 5)

    for event in pygame.event.get():

        if event.type == pygame.QUIT:

            pygame.quit()

            exit()

         elif event.type == pygame.MOUSEBUTTONDOWN:

            if event.button == 1:

                pygame.draw.circle(display, ORANGE, (event.pos[], event.pos), 30)

            elif event.button == 3:

                pygame.draw.circle(display, WHITE, (event.pos[], event.pos), 30)
            elif event.button == 5:
                display.fill(BLACK)

    keys = pygame.key.get_pressed()

    if keys:

        print(‘Левая стрелка’)

        x -= 10

    if keys:

        print(‘Правая стрелка’)

        x += 10

    if keys:

        print(‘Стрелка вверх’)

        y -= 10

    if keys:

        print(‘Стрелка вниз’)

        y += 10

    pygame.display.update()

    clock.tick(FPS)

Thanks

A very special thanks to the people who have volunteered commits to pygame since the last release. In alphabetical order…

(@alphaCTzo7G) | Amos Bastian (@amosbastian) | Andrey Lopukhov (@andreyx86) | Augusto Noronha (@augusto2112) | Bernardo Sulzbach (@bernardosulzbach) | (@Bottersnike) | Cai Q.T. (@CAIQT) | (@Cerealdragon) | Charles (@charlesej) | (@ChrisWeissNike) | (@cmtrapp02) | Daniel Molina (@daniel-molina) | David Caughell (@DavidCaughell) | David Lönnhager (@dlon) | (@dr0id) | burmer (@dtschirmer) | (@e1000) | xFly_Dragon (@husano896) | (@IchMageBaume) | René Dudfield (@illume) | (@LambdaGoblin) | Lenard Lindstrom (@llindstrom) | François Magimel (@Linkid) | (@LiquidFenrir) | Mark Hurley (@markph0204) | Marius Gedminas (@mgedmin) | (@metulburr) | Michael Farrell (@micolous) | Dominik George (@Natureshadow) | Nik (@nikolas) | Nunu-Willump (@Nunu-Willump) | (@pleboulanger) | Rebecca Chen (@rchen152) | (@robertpfeiffer) | Sett (@sw00) |

Quite a few new people have helped out with this release

An equally special thanks to everyone else who has contributed in
other ways. Thanks to claudeb, imallet, and deshipu for moderating the
discord chat to keep it friendly. Thanks to the twitter folk, and the
stackoverflow Q&A people. Thanks to everyone who puts their game up
on the pygame website for others to look at. Thanks to people making
tutorials and sharing articles & books they’ve written. Thanks to
the r/pygame mods and community. Thanks to pyladies groups for running
fun sessions, and for making things better. Thanks to the teachers
providing feedback, and for doing something fun with their students.
Thanks to Debian, Raspberrypi, Arch, Fedora, and all the other community groups.

User Input

Here’s where the fun starts! Let’s make our player controllable. We discussed earlier that the keydown event pulls the latest event off the top of the event stack. Well, Pygame has another event method called . The method returns a dictionary with all the keydown events in the queue. We will put this in our main loop so we get the keys at every frame.

Now we’ll write a method that will take that dictionary and define the behavior of the sprite based off the keys that are pressed. Here’s what it might look like:

1
2
3
4
5
6
7
8
9

, , , and correspond to the arrow keys on the keyboard. So we check that key, and if it’s set to , then we move our in the relevant direction. Rects have two built-in methods for moving; here we use “” – – because we want to move the existing Rect without making a copy.

Add the above method to our class and put the call in the main loop. Our code should now look like this:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45

Now you should be able to move your rectangle around the screen with the arrow keys. You may notice though that you can move off the screen, which is something we probably don’t want. So let’s add a bit of logic to the update method that tests if the rectangle’s coordinates have moved beyond our 800 by 600 boundary; and if so, move it back to the edge:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

Here instead of using a method, we just alter the corresponding coordinates for top, bottom, left, or right.

Now let’s add some enemies!

First let’s create a new sprite class called ‘Enemy’. We will follow the same formula we used for the player class:

1
2
3
4
5
6
7
8
9
10
11
12

There are a couple differences here that we should talk about. First off, when we call on our surface, we are setting the center property x coordinate to 820, and our y coordinate to a random number generated by .

Random is a python library that we will import at the beginning of our file in the complete code (). Why the random number? Simple: We want our incoming enemies to start past the right side of the screen (820), at a random place (0-600). We also use to set a speed property for the enemies. This way we will have some enemies that are fast and some that are slow.

Our method for the enemies takes no arguments (we don’t care about input for enemies) and simply moves the enemy toward the left side of the screen at a rate of speed. And the last statement in the update method tests to see if the enemy has gone past the left side of the screen with the right side of its rectangle (so that they don’t just disappear as soon as they touch the side of the screen). When they pass the side of the screen we call Sprites’ built-in method to delete them from their sprite group thereby preventing them from being rendered. Kill does not release the memory taken by the enemy and relies on you no longer having a reference to it so the Python garbage collector will take care of it.

Оцените статью
Рейтинг автора
5
Материал подготовил
Андрей Измаилов
Наш эксперт
Написано статей
116
Добавить комментарий