Як програмувати ігри на Python за допомогою бібліотеки Pygame

Ця стаття призначена для тих, хто вже знайомий з мовою програмування Python, і дозволяє докладніше вивчити бібліотеку Pygame для цієї мови. В якості наочного прикладу тут буде покроково продемонстрований процес програмування простої гри, в якій гравець повинен ухилятися від стрибаючих куль.

Частина1З 8:
Установка Pygame

  1. Скачайте Pygame.перейдіть за посиланням і знайдіть відповідну для вашої платформи версію бібліотеки: http://www.pygame.org/download.shtml .
  2. Запустіть інсталятор.
  3. Переконайтеся в тому, що установка завершилася успішно.відкрийте термінал Python. Введіть "import pygame". Якщо повідомлень про помилки не з'явиться, то Pygame був успішно встановлений.
      Import Pygame
      

Частина2З 8:
Створення головного вікна гри

  1. Створіть новий файл.
  2. Імпортуйте Pygame.pygame-це бібліотека, що реалізує доступ до графічних функцій мови програмування Python. Якщо ви хочете дізнатися докладніше про те, як працюють ці функції, інформація доступна на сайті Pygame. https://www.pygame.org/docs/
      Import Pygame
      From Pygame.locals Import *
      
  3. Задайте розміри вікна гри. Створіть глобальну змінну для розмірів вікна, щоб посилатися на неї з різних частин гри. Для зручності ці параметри краще вказувати саме на початку файлу, щоб при необхідності їх було простіше змінити в подальшому. Для більш складних проектів буде краще винести подібні дані в окремий файл.
      Resolution = (400,300)
      
  4. Визначте кілька кольорів. кольори в Pygame визначаються у форматі RGBA в межах від 0 до 255. Значення альфа (A) можна опустити, але інші кольори (червоний, зелений і синій) обов'язкові для заповнення.
      White = (255,255,255)
      Black = (0,0,0)
      Red = (255,0,0)
      
  5. Ініціалізуйте головний екран. використовуйте змінну resolution, визначену раніше.
      Screen = Pygame.Display.Set_mode(Resolution)
      
  6. Створіть цикл гри. Задайте повторення певних дій в кожному кадрі гри. Створіть цикл, який буде послідовно виконувати всі ці дії.
      While True:
      
  7. Визначте колір заливки екрану.
      Screen.Fill(White)
      
  8. Відобразіть екран.якщо на даному етапі запустити програму, то екран забарвиться білим кольором, а потім програма аварійно завершиться. Причина збою буде полягати в тому, що операційна система посилає події програмі, а програма їх просто не обробляє. Коли програма накопичує занадто багато необроблених подій, виникає збій.
      While True:
          ...
          Pygame.Display.Flip()
      
  9. Реалізуйте обробку подій.отримайте список всіх подій, які виникли між відтворенням кадрів. У нашому прикладі вас повинна хвилювати обробка тільки однієї події виходу (quit). Воно виникає, коли користувач закриває вікно гри. Обробка подій дозволить запобігти збій програми від появи занадто великої кількості подій.
      While True:
          ...
          For Event In Pygame.Event.Get():
              If Event.Type == QUIT:
                  Pygame.Quit()
      
  10. Випробуйте програму!зараз код програми повинен виглядати так:
      Import Pygame
      From Pygame.locals Import *
      
      Resolution = (400,300)
      White = (255,255,255)
      Black = (0,0,0)
      Red = (255,0,0)
      
      Screen = Pygame.Display.Set_mode(Resolution)
      
      While True:
          Screen.Fill(White)
          Pygame.Display.Flip()
      
          For Event In Pygame.Event.Get():
              If Event.Type == QUIT:
                  Pygame.Quit()
      

Частина3З 8:
Створення ігрових об'єктів

  1. Створіть новий клас об'єктів і його конструктор. Задайте всі властивості об'єкта. Також визначте значення за замовчуванням для кожного з властивостей.
      Class Ball:
          Def __init__(Self, XPos =  Resolution[0] / 2, YPos = Resolution[1] / 2, XVel = 1, YVel = 1, Rad = 15):
              Self.X = XPos
              Self.Y = YPos
              Self.Dx = XVel
              Self.Dy = YVel
              Self.Radius = Rad
              Self.Type = "ball"
      
  2. Визначте отрисовку об'єкта. використовуйте властивості об'єкта, задані в конструкторі, щоб зобразити кулю як коло на поверхні, переданої параметром в функцію. Поверхнею буде екран, який ви створили раніше, визначивши його розміри.
      Def Draw(Self, Surface):
              Pygame.Draw.Circle(Surface, Black, (Self.X, Self.Y), Self.Radius)
      
  3. Створіть екземпляр класу і додайте в цикл гри завдання малювати кулю при кожній ітерації циклу.
      Ball = Ball()
      
      While True:
      	...
          Ball.Draw(Screen)
      
  4. Примусьте об'єкт рухатися. Створіть функцію, яка оновлює положення об'єкта. Викликайте цю функцію в кожній ітерації циклу.
      Class Ball:
      	...
          Def Update(Self):
              Self.X += Self.Dx
              Self.Y += Self.Dy
      
  5. Обмежте частоту кадрів. куля буде рухатися дуже швидко, тому що цикл гри повторюється сотні разів на секунду. Використовуйте таймер Pygame, щоб обмежити частоту зміни кадрів до 60 fps.
    Clock = Pygame.Time.Clock()
    
    While True:
    	...
    	Clock.Tick(60)
    
  • Тримайте кулю на екрані. Додайте перевірки в функцію оновлення положення, щоб змінити напрямок руху кулі, якщо він досягає меж екрану.
      Class Ball:
      	...
          Def Update(Self):
      		...
              If (Self.X &#lt;= 0 Or Self.X &#gt;= Resolution[0]):
                  Self.Dx *= -1
              If (Self.Y &#lt;= 0 Or Self.Y &#gt;= Resolution[1]):
                  Self.Dy *= -1
      
  • Випробуйте програму! Зараз код програми повинен виглядати так:
      Import Pygame
      From Pygame.locals Import *
      
      Resolution = (400,300)
      White = (255,255,255)
      Black = (0,0,0)
      Red = (255,0,0)
      
      Screen = Pygame.Display.Set_mode(Resolution)
      
      Class Ball:
          Def __init__(Self, XPos =  Resolution[0] / 2, YPos = Resolution[1] / 2, XVel = 1, YVel = 1, Rad = 15):
              Self.X = XPos
              Self.Y = YPos
              Self.Dx = XVel
              Self.Dy = YVel
              Self.Radius = Rad
              Self.Type = "ball"
      
          Def Draw(Self, Surface):
              Pygame.Draw.Circle(Surface, Black, (Self.X, Self.Y), Self.Radius)
      
          Def Update(Self):
              Self.X += Self.Dx
              Self.Y += Self.Dy
              If (Self.X &#lt;= 0 Or Self.X &#gt;= Resolution[0]):
                  Self.Dx *= -1
              If (Self.Y &#lt;= 0 Or Self.Y &#gt;= Resolution[1]):
                  Self.Dy *= -1
      
      Ball = Ball()
      Clock = Pygame.Time.Clock()
      
      While True:
          Screen.Fill(White)
          Ball.Draw(Screen)
          Ball.Update()
          Pygame.Display.Flip()
          Clock.Tick(60)
      
          For Event In Pygame.Event.Get():
              If Event.Type == QUIT:
                  Pygame.Quit()
      
  • Частина4З 8:
    Структурування гри

    1. Використовуйте класи для структурування. надалі гра стане більш складною. Використовуйте техніки об'єктно-орієнтованого програмування для структурування коду.
    2. Перетворіть цикл гри в клас.оскільки в даний момент гра вже включає в себе дані, в тому числі ігрові об'єкти і функції, має сенс замінити цикл гри на клас.
        Class Game():
        
    3. Додайте конструктор.з його допомогою ви отрісуете кілька об'єктів, використовуваних в грі, створите екран, таймер і ініціалізуєте Pygame. Pygame необхідно ініціалізувати для того, щоб надалі використовувати такі можливості, як текст або звук.
        Class Game():
            Def __init__(Self):
                Pygame.Init()
                
                Self.Screen = Pygame.Display.Set_mode(Resolution)
                Self.Clock = Pygame.Time.Clock()
        
    4. Задайте обробку подій у функції.
        Class Game():
        	...
        	Def HandleEvents(Self):
                For Event In Pygame.Event.Get():
                    If Event.Type == QUIT:
                        Pygame.Quit()
        
    5. Зробіть цикл гри функцією.викликайте функцію обробки подій у кожній ітерації циклу.
        Class Game():
        	...
        	Def Run(Self):
                While True:
                    Self.HandleEvents()
        			
        			Self.Screen.Fill(White)
        			
                    Self.Clock.Tick(60)
                    Pygame.Display.Flip()
        
    6. Задайте обробку безлічі об'єктів гри.на даному етапі код гри викликає оновлення і перемальовування окремих об'єктів в кожному кадрі. З таким підходом код гри вийде досить громіздким і безладним, особливо якщо в грі буде багато об'єктів. Розумніше спочатку додавати об'єкти в масив, а потім оновлювати і перемальовувати всі об'єкти в масиві на кожній ітерації циклу. Тепер в гру легко можна внести новий об'єкт і визначити для нього іншу стартову позицію.
        Class Game():
            Def __init__(Self):
        		...
                Self.GameObjects = []
                Self.GameObjects.Append(Ball())
                Self.GameObjects.Append(Ball(100))
        
            ...
        
            Def Run(Self):
                While True:
                    Self.HandleEvents()
        
                    For GameObj In Self.GameObjects:
                        GameObj.Update()
        
                    Self.Screen.Fill(White)
        
                    For GameObj In Self.GameObjects:
                        GameObj.Draw(Self.Screen)
        
                    Self.Clock.Tick(60)
                    Pygame.Display.Flip()
        
    7. Випробуйте програму!зараз код програми повинен виглядати так:
        Import Pygame
        From Pygame.locals Import *
        
        Resolution = (400,300)
        White = (255,255,255)
        Black = (0,0,0)
        Red = (255,0,0)
        
        Screen = Pygame.Display.Set_mode(Resolution)
        
        Class Ball:
            Def __init__(Self, XPos =  Resolution[0] / 2, YPos = Resolution[1] / 2, XVel = 1, YVel = 1, Rad = 15):
                Self.X = XPos
                Self.Y = YPos
                Self.Dx = XVel
                Self.Dy = YVel
                Self.Radius = Rad
                Self.Type = "ball"
        
            Def Draw(Self, Surface):
                Pygame.Draw.Circle(Surface, Black, (Self.X, Self.Y), Self.Radius)
        
            Def Update(Self):
                Self.X += Self.Dx
                Self.Y += Self.Dy
                If (Self.X &#lt;= 0 Or Self.X &#gt;= Resolution[0]):
                    Self.Dx *= -1
                If (Self.Y &#lt;= 0 Or Self.Y &#gt;= Resolution[1]):
                    Self.Dy *= -1
        
        Class Game():
            Def __init__(Self):
                Pygame.Init()
                
                Self.Screen = Pygame.Display.Set_mode(Resolution)
                Self.Clock = Pygame.Time.Clock()
                Self.GameObjects = []
                Self.GameObjects.Append(Ball())
                Self.GameObjects.Append(Ball(100))
        
            Def HandleEvents(Self):
                For Event In Pygame.Event.Get():
                    If Event.Type == QUIT:
                        Pygame.Quit()
        
            Def Run(Self):
                While True:
                    Self.HandleEvents()
        
                    For GameObjIn Self.GameObjects:
                        GameObj.Update()
        
                    Self.Screen.Fill(White)
        
                    For GameObj In Self.GameObjects:
                        GameObj.Draw(Self.Screen)
        
                    Self.Clock.Tick(60)
                    Pygame.Display.Flip()
        
        Game().Run()
        

    Частина5З 8:
    Додавання об'єкта»гравець "

    1. Створіть клас гравця і його конструктор. вам необхідно створити ще одне коло, керований рухом миші. Ініціалізуйте його параметри в конструкторі. Єдиним важливим значенням буде радіус.
        Class Player:
            Def __init__(Self, Rad = 20):
                Self.X = 0
                Self.Y = 0
                Self.Radius = Rad
        
    2. Визначте отрисовку об'єкта гравця.він малюється аналогічно тому, як малювалися інші ігрові об'єкти.
        Class Player:
        	...
            Def Draw(Self, Surface):
                Pygame.Draw.Circle(Surface, Red, (Self.X, Self.Y), Self.Radius)
        
    3. Додайте управління мишею для об'єкта гравця.у кожному кадрі гри необхідно перевіряти положення покажчика миші і співвідносити положення об'єкта гравця з цією точкою.
        Class Player:
        	...
            Def Update(Self):
                Cord = Pygame.Mouse.Get_pos()
                Self.

    Ще почитати: