Поиск…


замечания

Pygame - это оболочка Python для SDL - кросс-платформенная библиотека C для управления мультимедиа - написанная Питом Шиннером. Это означает, что с помощью pygame вы можете записывать видеоигры или другие мультимедийные приложения на Python, которые будут работать без изменений на любых поддерживаемых платформах SDL (Windows, Unix, Mac, beOS и других).


В этом разделе представлен обзор того, что такое pygame, и почему разработчик может захотеть его использовать.

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

Версии

| Версия | ==============> Дата выпуска |
| Pygame 1.9.0 | ========> | 1 августа 2009 |
| Pygame 1.8.1 | ========> | 30 июля 2008 |
| Pygame 1.8.0 | ========> | 29 марта 2008 |
| Pygame 1.7.1 | ========> | 16 августа 2005 |
| Pygame 1.6.2 | ========> | - |
| Pygame 1.6 | =========> | 23 октября 2003 |
| Pygame 1.5 | =========> 30 мая 2002 |
| Pygame 1.4 | =========> | 30 января 2002 |
| Pygame 1.3 | =========> | 19 декабря 2001 |
| Pygame 1.2 | =========> | 4 сентября 2001 |
| Pygame 1.1 | =========> | 23 июня 2001 |
| Pygame 1.0 | =========> | 5 апреля 2001 |
| Pygame 0.9 | =========> | 13 февраля 2001 |
| Pygame 0.5 | =========> | 6 января 14, 2001 |
| Pygame 0.4 | =========> | 14 декабря 2000 |
| Pygame 0.3 | =========> | 20 ноября 2000 |
| Pygame 0.2 | =========> 3 ноября 2000 |
| Pygame 0.1 | =========> | 28 октября 2000 |

Простая «игра»


Импорт и инициализация

Каждый модуль должен быть импортирован, а pygame не является исключением. Хотя нам нужно вызвать функцию pygame.init() чтобы все импортированные модули в pygame были правильно инициализированы. Если мы забудем это, некоторые модули не сработают. Функция также возвращает кортеж всех успешных и неудачных инициализаций (это не приведет к возникновению ошибки, если модуль не может инициализировать).

import pygame
successes, failures = pygame.init()
print("{0} successes and {1} failures".format(successes, failures))

Создание предметов первой необходимости

Нам также нужно создать дисплей. Pygame уже создал (скрытый) дисплей, поэтому все, что нам нужно сделать, это установить режим отображения (в этом примере мы только установили разрешение). Также рекомендуется создавать часы, чтобы убедиться, что наша программа обновляется с фиксированной скоростью (в противном случае она будет работать с разной скоростью в зависимости от скорости работы компьютера).

screen = pygame.display.set_mode((720, 480))  # Notice the tuple! It's not 2 arguments.
clock = pygame.time.Clock()
FPS = 60  # This variable will define how many frames we update per second.

Для более удобного чтения в нашем коде мы создадим две цветовые константы, которые представляют собой набор красного, зеленого и синего (RGB). Значения от 0 (без света) до 255 (полный свет).

BLACK = (0, 0, 0)
WHITE = (255, 255, 255)

В pygame мы обычно используем Surface для представления внешнего вида объекта и Rect (прямоугольник) для представления положения объекта. A Поверхность похожа на чистый лист бумаги, который содержит цвета или изображения. Если вы создаете класс, вы должны называть атрибуты image и rect, так как многие функции будут искать и использовать эти атрибуты. Такие классы выиграют, pygame.sprite.Sprite класс pygame.sprite.Sprite по причинам, которые вы можете прочитать здесь .

rect = pygame.Rect((0, 0), (32, 32))  # First tuple is position, second is size.
image = pygame.Surface((32, 32))  # The tuple represent size.
image.fill(WHITE)  # We fill our surface with a nice white color (by default black).

Игровой цикл

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

Сначала мы убедимся, что наш цикл выполняется при заданном FPS . Мы определили FPS и создали наши часы в начале программы. Следующий код гарантирует, что наша программа будет спать достаточно времени, чтобы наш цикл повторял количество, которое мы определили для нашего FPS . В этом примере 60 раз в секунду.

clock.tick(FPS)

Затем мы будем обрабатывать события. Событие - это, в основном, действие пользователя, например, перемещение мыши или нажатие клавиши. Pygame зарегистрирует все эти события в очереди, которую мы получаем, вызывая pygame.event.get() . Мы можем перебрать это и проверить, есть ли какое-то событие, с которым мы хотели бы справиться. События имеют атрибут типа, который мы можем проверить против констант в модуле pygame, чтобы определить, какой тип события он имеет.

for event in pygame.event.get():
    if event.type == pygame.QUIT:  # The user pressed the close button in the top corner of the window.
        quit()
        # Close the program. Other methods like 'raise SystemExit' or 'sys.exit()'.
        # Calling 'pygame.quit()' won't close the program! It will just uninitialize the modules.

Мы также можем проверить if event.type == pygame.KEYDOWN чтобы увидеть, if event.type == pygame.KEYDOWN ли пользователь клавишу вниз. В этом случае событие имеет ключ атрибута, который мы можем проверить, чтобы увидеть, какой ключ он представляет.

for event in pygame.event.get():
    if event.type == pygame.QUIT:
        quit()
    elif event.type == pygame.KEYDOWN:
        if event.key == pygame.K_w:
            rect.move_ip(0, -2)  # Changes the rect's position.
        elif event.key == pygame.K_s:
            rect.move_ip(0, 2)
        elif event.key == pygame.K_a:
            rect.move_ip(-2, 0)
        elif event.key == pygame.K_d:
            rect.move_ip(2, 0)

Теперь нам нужно отобразить наш образ. Сначала мы можем очистить экран от предыдущего рендеринга. Мы делаем это, заполняя весь экран черным (удалите код, чтобы узнать, почему мы хотим его очистить). Затем нам нужно разжечь наш образ на экране. Blitting по существу означает копирование изображения на другую поверхность (в нашем случае на экран). Наконец, мы переворачиваем или обновляем экран.

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

screen.fill(BLACK)
screen.blit(image, rect)
pygame.display.update()  # Or 'pygame.display.flip()'.

Теперь у нас есть базовая игра! Довольно скучно, да, но основные вещи есть! Объединив это с вашим текущим знанием Python, вы сможете создать что-то потрясающее.


Полный код

import pygame
successes, failures = pygame.init()
print("{0} successes and {1} failures".format(successes, failures))


screen = pygame.display.set_mode((720, 480))
clock = pygame.time.Clock()
FPS = 60  # Frames per second.

BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
# RED = (255, 0, 0), GREEN = (0, 255, 0), BLUE = (0, 0, 255).

rect = pygame.Rect((0, 0), (32, 32))
image = pygame.Surface((32, 32))
image .fill(WHITE)  

while True:
    clock.tick(FPS)

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            quit()
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_w:
                rect.move_ip(0, -2)
            elif event.key == pygame.K_s:
                rect.move_ip(0, 2)
            elif event.key == pygame.K_a:
                rect.move_ip(-2, 0)
            elif event.key == pygame.K_d:
                rect.move_ip(2, 0)

    screen.fill(BLACK)
    screen.blit(image, rect)
    pygame.display.update()  # Or pygame.display.flip()

Немного улучшенная игровая механика

Обратите внимание, что программа проверяет, когда мы нажимаем клавишу, а не когда удерживаем клавишу нажатой. Чтобы исправить это, мы могли бы ввести переменную скорости . Мы можем создать класс игрока, чтобы он был более организованным. Чтобы избежать зависания кадра (если мы изменим FPS на 30, объекты будут двигаться на половину скорости), мы вводим зависящее от времени движение, передавая время между тиками на наши подвижные объекты.

import pygame

successes, failures = pygame.init()
print("Initializing pygame: {0} successes and {1} failures.".format(successes, failures))

screen = pygame.display.set_mode((720, 480))
clock = pygame.time.Clock()
FPS = 60

BLACK = (0, 0, 0)
WHITE = (255, 255, 255)


class Player(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image = pygame.Surface((32, 32))
        self.image.fill(WHITE)
        self.rect = self.image.get_rect()  # Get rect of some size as 'image'.
        self.velocity = [0, 0]

    def update(self):
        self.rect.move_ip(*self.velocity)


player = Player()
running = True
while running:
    dt = clock.tick(FPS) / 1000  # Returns milliseconds between each call to 'tick'. The convert time to seconds.
    screen.fill(BLACK)  # Fill the screen with background color.

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_w:
                player.velocity[1] = -200 * dt  # 200 pixels per second
            elif event.key == pygame.K_s:
                player.velocity[1] = 200 * dt
            elif event.key == pygame.K_a:
                player.velocity[0] = -200 * dt
            elif event.key == pygame.K_d:
                player.velocity[0] = 200 * dt
        elif event.type == pygame.KEYUP:
            if event.key == pygame.K_w or event.key == pygame.K_s:
                player.velocity[1] = 0
            elif event.key == pygame.K_a or event.key == pygame.K_d:
                player.velocity[0] = 0

    player.update()

    screen.blit(player.image, player.rect)
    pygame.display.update()  # Or pygame.display.flip()

print("Exited the game loop. Game will quit...")
quit()  # Not actually necessary since the script will exit anyway.

Есть еще много вещей, которые следует улучшить об этом коде. Я бы рекомендовал вам прочитать учебник pygame и этот доклад Ричарда Джонса для более глубокого изучения.

Установка pygame

На окнах

  1. Перейдите на страницу http://www.lfd.uci.edu/~gohlke/pythonlibs/#pygame - неофициальный сайт, содержащий двоичные файлы с открытым исходным кодом python для официального дистрибутива CPython от Christoph Gohlke .

  2. Загрузите соответствующий файл pygame .whl соответствии с установленной версией python. (Файл называется чем-то вроде pygame - <pygame version> - <python version> - win32.whl )

  3. Бежать

     pip install your-pygame-package.whl
    

    внутри вашего терминала, bash или consol.
    Примечание: если pip не найден в PATH попробуйте запустить python -m pip install your-pygame-package.whl

  4. Проверьте, можно ли импортировать pygame в качестве модуля python

    import pygame
    

    Если вы не получили сообщение об ошибке, вы правильно установили pygame на свой компьютер :)

В Linux

  1. Откройте терминал и запустите

    sudo apt-get install python-pygame
    

    Примечание. Это установит pygame для python2

  2. Попробуйте импортировать pygame внутри

    import pygame
    

    Если вы не получили сообщение об ошибке, вы правильно установили pygame в своей Linux-системе :)

На macOS

Есть два способа установить его на mac:

Способ 1

Перейдите на страницу загрузки Pygame и загрузите программу установки mac. Запустите его, и он должен установить Pygame на ваш Mac.

Способ 2

Установить Homebrew :

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

Затем используйте Homebrew для установки Python 2.7.12 и Pygame:

brew install python; brew install homebrew/python/pygame

Теперь запустите Python в вашем терминале и попробуйте import pygame . Если он ничего не говорит, он успешно установлен.

Импорт pygame и рисование на дисплее

Начиная

Для начала работы с Pygame вы должны сделать следующее:

import pygame

Это открывает окно размером 640,480 и сохраняет его в переменной, называемой экраном.

Настройка имени окна

Настройка имени окна pygame требует следующего синтаксиса:

pygame.display.set_caption('Name')

О экране

  • Точка (0,0) находится в верхнем левом углу экрана.
  • x координаты увеличиваются слева направо, y координаты увеличиваются сверху вниз. Это правильные координаты на карте декартовой плоскости положительны, а левая сторона отрицательна. Однако верхние боковые координаты на картезианской плоскости отрицательны сверху и положительны ( Примечание : Это считается, если точки взяты из начала координат.)

Обновление экрана

Изменения, которые вы делаете на экране, например, заполняя его цветом или рисуя на нем, не отображаются сразу!
Итак, как это сделать?
Вы должны вызвать эту функцию:

pygame.display.update()

Цвета

Раскраска в pygame работает в режиме RGB.
Код для окраски:

color_Name = (r,g,b)
  • R обозначает красный цвет.
  • G означает зеленый цвет
  • B обозначает синий цвет.
  • Все три должны быть целыми числами от 0 до 255, причем 255 являются самыми яркими, а 0 - самыми темными

Рисование

  1. Нарисовать линии

    pygame.draw.lines(screen, color, closed, pointlist, thickness)
    
  2. Чтобы нарисовать прямоугольник

    pygame.draw.rect(screen, color, (x,y,width,height), thickness)
    
  3. Нарисовать круг

    pygame.draw.circle(screen, color, (x,y), radius, thickness)
    

Установка всего в цикл

Чтобы сделать цикл, используйте следующий код:

running = True
while running:
  for event in pygame.event.get():
    if event.type == pygame.QUIT:
      running = False
      pygame.quit()

Рисование прямоугольника в окне pygame (код)

import pygame
background_colour = (255,255,255) # White color
(width, height) = (300, 200) # Screen size
color=(0,0,0) #For retangle
screen = pygame.display.set_mode((width, height)) #Setting Screen
pygame.display.set_caption('Drawing') #Window Name
screen.fill(background_colour)#Fills white to screen
pygame.draw.rect(screen, color, (100,50,30,40), 1) #Drawing the rectangle
pygame.display.update()

#Loop
running = True
while running:
  for event in pygame.event.get():
    if event.type == pygame.QUIT:
      running = False
      pygame.quit()


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow