Загрузить PDF Загрузить PDF

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

Часть 1
Часть 1 из 8:

Установка Pygame

Загрузить PDF
  1. 1
    Скачайте Pygame. Перейдите по ссылке и найдите подходящую для вашей платформы версию библиотеки: http://www.pygame.org/download.shtml .
  2. 2
    Запустите установщик.
  3. 3
    Убедитесь в том, что установка завершилась успешно. Откройте терминал Python. Введите «import pygame». Если сообщений об ошибках не появится, то Pygame был успешно установлен.
       import 
       pygame 
      
    Реклама
Часть 2
Часть 2 из 8:

Создание главного окна игры

Загрузить PDF
  1. 1
    Создайте новый файл.
  2. 2
    Импортируйте Pygame. Pygame — это библиотека, реализующая доступ к графическим функциям языка программирования Python. Если вы хотите узнать подробнее о том, как работают эти функции, информация доступна на сайте Pygame. https://www.pygame.org/docs/
       import 
       pygame 
       from 
       pygame.locals 
       import 
       * 
      
  3. 3
    Задайте размеры окна игры. Создайте глобальную переменную для размеров окна, чтобы ссылаться на нее из разных частей игры. Для удобства эти параметры лучше указывать именно в начале файла, чтобы при необходимости их было проще изменить в дальнейшем. Для более сложных проектов будет предпочтительнее вынести подобные данные в отдельный файл.
       resolution 
       = 
       ( 
       400 
       , 
       300 
       ) 
      
  4. 4
    Определите несколько цветов. Цвета в Pygame определяются в формате RGBA в пределах от 0 до 255. Значение альфа (A) можно опустить, но остальные цвета (красный, зеленый и синий) обязательны для заполнения.
       white 
       = 
       ( 
       255 
       , 
       255 
       , 
       255 
       ) 
       black 
       = 
       ( 
       0 
       , 
       0 
       , 
       0 
       ) 
       red 
       = 
       ( 
       255 
       , 
       0 
       , 
       0 
       ) 
      
  5. 5
    Инициализируйте главный экран. Используйте переменную resolution, определенную ранее.
       screen 
       = 
       pygame 
       . 
       display 
       . 
       set_mode 
       ( 
       resolution 
       ) 
      
  6. 6
    Создайте цикл игры. Задайте повторение определенных действий в каждом кадре игры. Создайте цикл, который будет последовательно выполнять все эти действия.
       while 
       True 
       : 
      
  7. 7
    Определите цвет заливки экрана.
       screen 
       . 
       fill 
       ( 
       white 
       ) 
      
  8. 8
    Отобразите экран. Если на данном этапе запустить программу, то экран окрасится белым цветом, а затем программа аварийно завершится. Причина сбоя будет заключаться в том, что операционная система посылает события программе, а программа их просто не обрабатывает. Когда программа накапливает слишком много необработанных событий, возникает сбой.
       while 
       True 
       : 
       ... 
       pygame 
       . 
       display 
       . 
       flip 
       () 
      
  9. 9
    Реализуйте обработку событий. Получите список всех событий, которые возникли между отрисовкой кадров. В нашем примере вас должна волновать обработка только одного события выхода (quit). Оно возникает, когда пользователь закрывает окно игры. Обработка событий позволит предотвратить сбой программы от появления слишком большого числа событий.
       while 
       True 
       : 
       ... 
       for 
       event 
       in 
       pygame 
       . 
       event 
       . 
       get 
       (): 
       if 
       event 
       . 
       type 
       == 
       QUIT 
       : 
       pygame 
       . 
       quit 
       () 
      
  10. 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
Часть 3 из 8:

Создание игровых объектов

Загрузить PDF
  1. 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. 2
    Определите отрисовку объекта. Используйте свойства объекта, заданные в конструкторе, чтобы изобразить шар как круг на поверхности, переданной параметром в функцию. Поверхностью будет экран, который вы создали ранее, определив его размеры.
       def 
       draw 
       ( 
       self 
       , 
       surface 
       ): 
       pygame 
       . 
       draw 
       . 
       circle 
       ( 
       surface 
       , 
       black 
       , 
       ( 
       self 
       . 
       x 
       , 
       self 
       . 
       y 
       ), 
       self 
       . 
       radius 
       ) 
      
  3. 3
    Создайте экземпляр класса и добавьте в цикл игры задание рисовать шар при каждой итерации цикла.
       ball 
       = 
       Ball 
       () 
       while 
       True 
       : 
       ... 
       ball 
       . 
       draw 
       ( 
       screen 
       ) 
      
  4. 4
    Заставьте объект двигаться. Создайте функцию, обновляющую положение объекта. Вызывайте эту функцию в каждой итерации цикла.
       class 
       Ball 
       : 
       ... 
       def 
       update 
       ( 
       self 
       ): 
       self 
       . 
       x 
       += 
       self 
       . 
       dx 
       self 
       . 
       y 
       += 
       self 
       . 
       dy 
      
  5. 5
    Ограничьте частоту кадров. Шар будет двигаться очень быстро, потому что цикл игры повторяется сотни раз в секунду. Используйте таймер Pygame, чтобы ограничить частоту смены кадров до 60 fps.
    Реклама
     clock 
     = 
     pygame 
     . 
     time 
     . 
     Clock 
     () 
     while 
     True 
     : 
     ... 
     clock 
     . 
     tick 
     ( 
     60 
     ) 
    
  • Держите шар на экране. Добавьте проверки в функцию обновления положения, чтобы изменить направление движения шара, если он достигает границ экрана.
       class 
       Ball 
       : 
       ... 
       def 
       update 
       ( 
       self 
       ): 
       ... 
       if 
       ( 
       self 
       . 
       x 
       <= 
       0 
       or 
       self 
       . 
       x 
       >= 
       resolution 
       [ 
       0 
       ]): 
       self 
       . 
       dx 
       *= 
       - 
       1 
       if 
       ( 
       self 
       . 
       y 
       <= 
       0 
       or 
       self 
       . 
       y 
       >= 
       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 
       <= 
       0 
       or 
       self 
       . 
       x 
       >= 
       resolution 
       [ 
       0 
       ]): 
       self 
       . 
       dx 
       *= 
       - 
       1 
       if 
       ( 
       self 
       . 
       y 
       <= 
       0 
       or 
       self 
       . 
       y 
       >= 
       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
    Часть 4 из 8:

    Структурирование игры

    Загрузить PDF
    1. 1
      Используйте классы для структурирования. В дальнейшем игра станет более сложной. Используйте техники объектно-ориентированного программирования для структурирования кода.
    2. 2
      Преобразуйте цикл игры в класс. Поскольку в настоящий момент игра уже включает в себя данные, в том числе игровые объекты и функции, имеет смысл заменить цикл игры на класс.
         class 
         game 
         (): 
        
    3. 3
      Добавьте конструктор. С его помощью вы отрисуете несколько объектов, используемых в игре, создадите экран, таймер и инициализируете Pygame. Pygame необходимо инициализировать для того, чтобы в дальнейшем использовать такие возможности, как текст или звук.
         class 
         game 
         (): 
         def 
         __init__ 
         ( 
         self 
         ): 
         pygame 
         . 
         init 
         () 
         self 
         . 
         screen 
         = 
         pygame 
         . 
         display 
         . 
         set_mode 
         ( 
         resolution 
         ) 
         self 
         . 
         clock 
         = 
         pygame 
         . 
         time 
         . 
         Clock 
         () 
        
    4. 4
      Задайте обработку событий в функции.
         class 
         game 
         (): 
         ... 
         def 
         handleEvents 
         ( 
         self 
         ): 
         for 
         event 
         in 
         pygame 
         . 
         event 
         . 
         get 
         (): 
         if 
         event 
         . 
         type 
         == 
         QUIT 
         : 
         pygame 
         . 
         quit 
         () 
        
    5. 5
      Сделайте цикл игры функцией. Вызывайте функцию обработки событий в каждой итерации цикла.
         class 
         game 
         (): 
         ... 
         def 
         run 
         ( 
         self 
         ): 
         while 
         True 
         : 
         self 
         . 
         handleEvents 
         () 
         self 
         . 
         screen 
         . 
         fill 
         ( 
         white 
         ) 
         self 
         . 
         clock 
         . 
         tick 
         ( 
         60 
         ) 
         pygame 
         . 
         display 
         . 
         flip 
         () 
        
    6. 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. 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 
         <= 
         0 
         or 
         self 
         . 
         x 
         >= 
         resolution 
         [ 
         0 
         ]): 
         self 
         . 
         dx 
         *= 
         - 
         1 
         if 
         ( 
         self 
         . 
         y 
         <= 
         0 
         or 
         self 
         . 
         y 
         >= 
         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 
         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 
         () 
         game 
         () 
         . 
         run 
         () 
        
      Реклама
    Часть 5
    Часть 5 из 8:

    Добавление объекта «Игрок»

    Загрузить PDF
    1. 1
      Создайте класс игрока и его конструктор. Вам необходимо создать еще один круг, управляемый движением мыши. Инициализируйте его параметры в конструкторе. Единственным важным значением будет радиус.
         class 
         Player 
         : 
         def 
         __init__ 
         ( 
         self 
         , 
         rad 
         = 
         20 
         ): 
         self 
         . 
         x 
         = 
         0 
         self 
         . 
         y 
         = 
         0 
         self 
         . 
         radius 
         = 
         rad 
        
    2. 2
      Определите отрисовку объекта игрока. Он рисуется аналогично тому, как рисовались другие игровые объекты.
         class 
         Player 
         : 
         ... 
         def 
         draw 
         ( 
         self 
         , 
         surface 
         ): 
         pygame 
         . 
         draw 
         . 
         circle 
         ( 
         surface 
         , 
         red 
         , 
         ( 
         self 
         . 
         x 
         , 
         self 
         . 
         y 
         ), 
         self 
         . 
         radius 
         ) 
        
    3. 3
      Добавьте управление мышью для объекта игрока. В каждом кадре игры необходимо проверять положение указателя мыши и соотносить положение объекта игрока с этой точкой.
         class 
         Player 
         : 
         ... 
         def 
         update 
         ( 
         self 
         ): 
         cord 
         = 
         pygame 
         . 
         mouse 
         . 
         get_pos 
         () 
         self 
         . 
         x 
         = 
         cord 
         [ 
         0 
         ] 
         self 
         . 
         y 
         = 
         cord 
         [ 
         1 
         ] 
        
    4. 4
      Добавьте объект игрока в массив gameObjects. Создайте новый экземпляр объекта и добавьте его в список gameObjects.
         class 
         game 
         (): 
         def 
         __init__ 
         ( 
         self 
         ): 
         ... 
         self 
         . 
         gameObjects 
         . 
         append 
         ( 
         Player 
         ()) 
        
    5. 5
      Испытайте программу! Сейчас код программы должен выглядеть так:
         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 
         <= 
         0 
         or 
         self 
         . 
         x 
         >= 
         resolution 
         [ 
         0 
         ]): 
         self 
         . 
         dx 
         *= 
         - 
         1 
         if 
         ( 
         self 
         . 
         y 
         <= 
         0 
         or 
         self 
         . 
         y 
         >= 
         resolution 
         [ 
         1 
         ]): 
         self 
         . 
         dy 
         *= 
         - 
         1 
         class 
         Player 
         : 
         def 
         __init__ 
         ( 
         self 
         , 
         rad 
         = 
         20 
         ): 
         self 
         . 
         x 
         = 
         0 
         self 
         . 
         y 
         = 
         0 
         self 
         . 
         radius 
         = 
         rad 
         self 
         . 
         type 
         = 
         "player" 
         def 
         draw 
         ( 
         self 
         , 
         surface 
         ): 
         pygame 
         . 
         draw 
         . 
         circle 
         ( 
         surface 
         , 
         red 
         , 
         ( 
         self 
         . 
         x 
         , 
         self 
         . 
         y 
         ), 
         self 
         . 
         radius 
         ) 
         def 
         update 
         ( 
         self 
         ): 
         cord 
         = 
         pygame 
         . 
         mouse 
         . 
         get_pos 
         () 
         self 
         . 
         x 
         = 
         cord 
         [ 
         0 
         ] 
         self 
         . 
         y 
         = 
         cord 
         [ 
         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 
         ( 
         Player 
         ()) 
         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 
         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 
         () 
         game 
         () 
         . 
         run 
         () 
        
      Реклама
    Часть 6
    Часть 6 из 8:

    Создание взаимодействия объектов

    Загрузить PDF
    1. 1
      Измените функции обновления положения. Чтобы реализовать взаимодействие объектов, необходимо обеспечить им доступ к свойствам друг друга. Добавьте новый параметр в функцию Update, чтобы передать данные списка gameObjects. Параметр необходимо добавить в функции классов игрока и шаров. Если у вас определено много классов, наследование поможет сохранить список параметров одинаковым.
         class 
         Ball 
         : 
         ... 
         def 
         update 
         ( 
         self 
         , 
         gameObjects 
         ): 
         ... 
         class 
         Player 
         : 
         ... 
         def 
         update 
         ( 
         self 
         , 
         gameObjects 
         ): 
        
    2. 2
      Введите проверку фактов столкновения игрока с шарами. Просматривайте все объекты и определяйте среди них те, которые относятся к шарам. Затем, используя радиусы объектов и формулу определения расстояния, проверяйте, столкнулись ли объекты между собой. Проверять столкновения между кругами несложно. Это главная причина того, что в качестве примера в данной игре не используются фигуры другой формы.
         class 
         Player 
         : 
         ... 
         def 
         update 
         ( 
         self 
         , 
         gameObjects 
         ): 
         ... 
         for 
         gameObj 
         in 
         gameObjects 
         : 
         if 
         gameObj 
         . 
         type 
         == 
         "ball" 
         : 
         if 
         ( 
         gameObj 
         . 
         x 
         - 
         self 
         . 
         x 
         ) 
         ** 
         2 
         + 
         ( 
         gameObj 
         . 
         y 
         - 
         self 
         . 
         y 
         ) 
         ** 
         2 
         <= 
         ( 
         gameObj 
         . 
         radius 
         + 
         self 
         . 
         radius 
         ) 
         ** 
         2 
         : 
        
    3. 3
      Задайте конец игры при столкновении игрока с шаром. На данном этапе просто задайте выход из игры.
         if 
         ( 
         gameObj 
         . 
         x 
         - 
         self 
         . 
         x 
         ) 
         ** 
         2 
         + 
         ( 
         gameObj 
         . 
         y 
         - 
         self 
         . 
         y 
         ) 
         ** 
         2 
         <= 
         ( 
         gameObj 
         . 
         radius 
         + 
         self 
         . 
         radius 
         ) 
         ** 
         2 
         : 
         pygame 
         . 
         quit 
         () 
        
    4. 4
      Испытайте программу! Сейчас код программы должен выглядеть так:
         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 
         , 
         gameObjects 
         ): 
         self 
         . 
         x 
         += 
         self 
         . 
         dx 
         self 
         . 
         y 
         += 
         self 
         . 
         dy 
         if 
         ( 
         self 
         . 
         x 
         <= 
         0 
         or 
         self 
         . 
         x 
         >= 
         resolution 
         [ 
         0 
         ]): 
         self 
         . 
         dx 
         *= 
         - 
         1 
         if 
         ( 
         self 
         . 
         y 
         <= 
         0 
         or 
         self 
         . 
         y 
         >= 
         resolution 
         [ 
         1 
         ]): 
         self 
         . 
         dy 
         *= 
         - 
         1 
         class 
         Player 
         : 
         def 
         __init__ 
         ( 
         self 
         , 
         rad 
         = 
         20 
         ): 
         self 
         . 
         x 
         = 
         0 
         self 
         . 
         y 
         = 
         0 
         self 
         . 
         radius 
         = 
         rad 
         self 
         . 
         type 
         = 
         "player" 
         def 
         draw 
         ( 
         self 
         , 
         surface 
         ): 
         pygame 
         . 
         draw 
         . 
         circle 
         ( 
         surface 
         , 
         red 
         , 
         ( 
         self 
         . 
         x 
         , 
         self 
         . 
         y 
         ), 
         self 
         . 
         radius 
         ) 
         def 
         update 
         ( 
         self 
         , 
         gameObjects 
         ): 
         cord 
         = 
         pygame 
         . 
         mouse 
         . 
         get_pos 
         () 
         self 
         . 
         x 
         = 
         cord 
         [ 
         0 
         ] 
         self 
         . 
         y 
         = 
         cord 
         [ 
         1 
         ] 
         for 
         gameObj 
         in 
         gameObjects 
         : 
         if 
         gameObj 
         . 
         type 
         == 
         "ball" 
         : 
         if 
         ( 
         gameObj 
         . 
         x 
         - 
         self 
         . 
         x 
         ) 
         ** 
         2 
         + 
         ( 
         gameObj 
         . 
         y 
         - 
         self 
         . 
         y 
         ) 
         ** 
         2 
         <= 
         ( 
         gameObj 
         . 
         radius 
         + 
         self 
         . 
         radius 
         ) 
         ** 
         2 
         : 
         pygame 
         . 
         quit 
         () 
         class 
         game 
         (): 
         def 
         __init__ 
         ( 
         self 
         ): 
         pygame 
         . 
         init 
         () 
         self 
         . 
         screen 
         = 
         pygame 
         . 
         display 
         . 
         set_mode 
         ( 
         resolution 
         ) 
         self 
         . 
         clock 
         = 
         pygame 
         . 
         time 
         . 
         Clock 
         () 
         self 
         . 
         gameObjects 
         = 
         [] 
         self 
         . 
         gameObjects 
         . 
         append 
         ( 
         Player 
         ()) 
         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 
         gameObj 
         in 
         self 
         . 
         gameObjects 
         : 
         gameObj 
         . 
         update 
         ( 
         self 
         . 
         gameObjects 
         ) 
         self 
         . 
         screen 
         . 
         fill 
         ( 
         white 
         ) 
         for 
         gameObj 
         in 
         self 
         . 
         gameObjects 
         : 
         gameObj 
         . 
         draw 
         ( 
         self 
         . 
         screen 
         ) 
         self 
         . 
         clock 
         . 
         tick 
         ( 
         60 
         ) 
         pygame 
         . 
         display 
         . 
         flip 
         () 
         game 
         () 
         . 
         run 
         () 
        
      Реклама
    Часть 7
    Часть 7 из 8:

    Добавление игрового контроллера для создания объектов

    Загрузить PDF
    1. 1
      Создайте класс игрового контроллера. Игровые контроллеры отвечают за ход игры. Они не совпадают с классом самой игры, который отвечает за отрисовку и обновление всех игровых объектов. Контроллер будет периодически добавлять новый шар на экран и усложнять игру. Добавьте конструктор и инициализируйте некоторые стартовые значения. Интервал будет означать время, через которое будет добавляться новый шар.
         class 
         GameController 
         : 
         def 
         __init__ 
         ( 
         self 
         , 
         interval 
         = 
         5 
         ): 
         self 
         . 
         inter 
         = 
         interval 
         self 
         . 
         next 
         = 
         pygame 
         . 
         time 
         . 
         get_ticks 
         () 
         + 
         ( 
         2 
         * 
         1000 
         ) 
         self 
         . 
         type 
         = 
         "game controller" 
        
    2. 2
      Добавьте функцию обновления. Она будет проверять, сколько времени прошло с момента добавления предыдущего шара или от начала игры. Если время превысит заданный интервал, то будет сброшен таймер и добавлен новый шар.
         class 
         GameController 
         : 
         ... 
         def 
         update 
         ( 
         self 
         , 
         gameObjects 
         ): 
         if 
         self 
         . 
         next 
         < 
         pygame 
         . 
         time 
         . 
         get_ticks 
         (): 
         self 
         . 
         next 
         = 
         pygame 
         . 
         time 
         . 
         get_ticks 
         () 
         + 
         ( 
         self 
         . 
         inter 
         * 
         1000 
         ) 
         gameObjects 
         . 
         append 
         ( 
         Ball 
         ()) 
        
    3. 3
      Установите для шаров случайные скорости. Чтобы игра вела себя по-разному, необходимо позволить ей использовать случайные числа для параметра скорости. Теперь скорость шаров станет определяться числом с плавающей десятичной запятой, а не целым числом.
         class 
         GameController 
         : 
         ... 
         def 
         update 
         ( 
         self 
         , 
         gameObjects 
         ): 
         if 
         self 
         . 
         next 
         < 
         pygame 
         . 
         time 
         . 
         get_ticks 
         (): 
         self 
         . 
         next 
         = 
         pygame 
         . 
         time 
         . 
         get_ticks 
         () 
         + 
         ( 
         self 
         . 
         inter 
         * 
         1000 
         ) 
         gameObjects 
         . 
         append 
         ( 
         Ball 
         ( 
         xVel 
         = 
         random 
         () 
         * 
         2 
         , 
         yVel 
         = 
         random 
         () 
         * 
         2 
         )) 
        
    4. 4
      Исправьте функцию отрисовки. Функция draw не работает с числами с плавающей запятой (float). Поэтому необходимо выразить позицию шара в целых числах, прежде чем его отрисовывать.
         class 
         Ball 
         : 
         ... 
         def 
         draw 
         ( 
         self 
         , 
         surface 
         ): 
         pygame 
         . 
         draw 
         . 
         circle 
         ( 
         surface 
         , 
         black 
         , 
         ( 
         int 
         ( 
         self 
         . 
         x 
         ), 
         int 
         ( 
         self 
         . 
         y 
         )), 
         self 
         . 
         radius 
         ) 
        
    5. 5
      Определите метод отрисовки для игрового контроллера. Поскольку это тоже объект игры, в главном игровом цикле будет попытка нарисовать его. Поэтому для контроллера необходимо определить функцию отрисовки, которая ничего не делает, чтобы избежать сбоя игры.
         class 
         GameController 
         : 
         ... 
         def 
         draw 
         ( 
         self 
         , 
         screen 
         ): 
         pass 
        
    6. 6
      Добавьте игровой контроллер в gameObjects и удалите 2 шара. Игра должна добавлять новый шар каждые 5 секунд.
         class 
         game 
         (): 
         def 
         __init__ 
         ( 
         self 
         ): 
         ... 
         self 
         . 
         gameObjects 
         = 
         [] 
         self 
         . 
         gameObjects 
         . 
         append 
         ( 
         GameController 
         ()) 
         self 
         . 
         gameObjects 
         . 
         append 
         ( 
         Player 
         ()) 
        
    7. 7
      Испытайте программу! Сейчас код программы должен выглядеть так:
         import 
         pygame 
         from 
         random 
         import 
         random 
         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 
         , 
         ( 
         int 
         ( 
         self 
         . 
         x 
         ), 
         int 
         ( 
         self 
         . 
         y 
         )), 
         self 
         . 
         radius 
         ) 
         def 
         update 
         ( 
         self 
         , 
         gameObjects 
         ): 
         self 
         . 
         x 
         += 
         self 
         . 
         dx 
         self 
         . 
         y 
         += 
         self 
         . 
         dy 
         if 
         ( 
         self 
         . 
         x 
         <= 
         0 
         or 
         self 
         . 
         x 
         >= 
         resolution 
         [ 
         0 
         ]): 
         self 
         . 
         dx 
         *= 
         - 
         1 
         if 
         ( 
         self 
         . 
         y 
         <= 
         0 
         or 
         self 
         . 
         y 
         >= 
         resolution 
         [ 
         1 
         ]): 
         self 
         . 
         dy 
         *= 
         - 
         1 
         class 
         Player 
         : 
         def 
         __init__ 
         ( 
         self 
         , 
         rad 
         = 
         20 
         ): 
         self 
         . 
         x 
         = 
         0 
         self 
         . 
         y 
         = 
         0 
         self 
         . 
         radius 
         = 
         rad 
         self 
         . 
         type 
         = 
         "player" 
         def 
         draw 
         ( 
         self 
         , 
         surface 
         ): 
         pygame 
         . 
         draw 
         . 
         circle 
         ( 
         surface 
         , 
         red 
         , 
         ( 
         self 
         . 
         x 
         , 
         self 
         . 
         y 
         ), 
         self 
         . 
         radius 
         ) 
         def 
         update 
         ( 
         self 
         , 
         gameObjects 
         ): 
         cord 
         = 
         pygame 
         . 
         mouse 
         . 
         get_pos 
         () 
         self 
         . 
         x 
         = 
         cord 
         [ 
         0 
         ] 
         self 
         . 
         y 
         = 
         cord 
         [ 
         1 
         ] 
         for 
         gameObj 
         in 
         gameObjects 
         : 
         if 
         gameObj 
         . 
         type 
         == 
         "ball" 
         : 
         if 
         ( 
         gameObj 
         . 
         x 
         - 
         self 
         . 
         x 
         ) 
         ** 
         2 
         + 
         ( 
         gameObj 
         . 
         y 
         - 
         self 
         . 
         y 
         ) 
         ** 
         2 
         <= 
         ( 
         gameObj 
         . 
         radius 
         + 
         self 
         . 
         radius 
         ) 
         ** 
         2 
         : 
         pygame 
         . 
         quit 
         () 
         class 
         GameController 
         : 
         def 
         __init__ 
         ( 
         self 
         , 
         interval 
         = 
         5 
         ): 
         self 
         . 
         inter 
         = 
         interval 
         self 
         . 
         next 
         = 
         pygame 
         . 
         time 
         . 
         get_ticks 
         () 
         + 
         ( 
         2 
         * 
         1000 
         ) 
         self 
         . 
         type 
         = 
         "game controller" 
         def 
         update 
         ( 
         self 
         , 
         gameObjects 
         ): 
         if 
         self 
         . 
         next 
         < 
         pygame 
         . 
         time 
         . 
         get_ticks 
         (): 
         self 
         . 
         next 
         = 
         pygame 
         . 
         time 
         . 
         get_ticks 
         () 
         + 
         ( 
         self 
         . 
         inter 
         * 
         1000 
         ) 
         gameObjects 
         . 
         append 
         ( 
         Ball 
         ( 
         xVel 
         = 
         random 
         () 
         * 
         2 
         , 
         yVel 
         = 
         random 
         () 
         * 
         2 
         )) 
         def 
         draw 
         ( 
         self 
         , 
         screen 
         ): 
         pass 
         class 
         game 
         (): 
         def 
         __init__ 
         ( 
         self 
         ): 
         pygame 
         . 
         init 
         () 
         self 
         . 
         screen 
         = 
         pygame 
         . 
         display 
         . 
         set_mode 
         ( 
         resolution 
         ) 
         self 
         . 
         clock 
         = 
         pygame 
         . 
         time 
         . 
         Clock 
         () 
         self 
         . 
         gameObjects 
         = 
         [] 
         self 
         . 
         gameObjects 
         . 
         append 
         ( 
         GameController 
         ()) 
         self 
         . 
         gameObjects 
         . 
         append 
         ( 
         Player 
         ()) 
         def 
         handleEvents 
         ( 
         self 
         ): 
         for 
         event 
         in 
         pygame 
         . 
         event 
         . 
         get 
         (): 
         if 
         event 
         . 
         type 
         == 
         QUIT 
         : 
         pygame 
         . 
         quit 
         () 
         def 
         run 
         ( 
         self 
         ): 
         while 
         True 
         : 
         self 
         . 
         handleEvents 
         () 
         for 
         gameObj 
         in 
         self 
         . 
         gameObjects 
         : 
         gameObj 
         . 
         update 
         ( 
         self 
         . 
         gameObjects 
         ) 
         self 
         . 
         screen 
         . 
         fill 
         ( 
         white 
         ) 
         for 
         gameObj 
         in 
         self 
         . 
         gameObjects 
         : 
         gameObj 
         . 
         draw 
         ( 
         self 
         . 
         screen 
         ) 
         self 
         . 
         clock 
         . 
         tick 
         ( 
         60 
         ) 
         pygame 
         . 
         display 
         . 
         flip 
         () 
         game 
         () 
         . 
         run 
         () 
        
      Реклама
    Часть 8
    Часть 8 из 8:

    Добавление счета и завершение игры

    Загрузить PDF
    1. 1
      Добавьте счет в класс игрового контроллера. Создайте объект класса Font и переменную score. Объект Font должен отрисовываться в каждом кадре для отображения текущего счета и его увеличения в каждом кадре при обновлении.
         class 
         GameController 
         : 
         def 
         __init__ 
         ( 
         self 
         , 
         interval 
         = 
         5 
         ): 
         ... 
         self 
         . 
         score 
         = 
         0 
         self 
         . 
         scoreText 
         = 
         pygame 
         . 
         font 
         . 
         Font 
         ( 
         None 
         , 
         12 
         ) 
         def 
         update 
         ( 
         self 
         , 
         gameObjects 
         ): 
         ... 
         self 
         . 
         score 
         += 
         1 
         def 
         draw 
         ( 
         self 
         , 
         screen 
         ): 
         screen 
         . 
         blit 
         ( 
         self 
         . 
         scoreText 
         . 
         render 
         ( 
         str 
         ( 
         self 
         . 
         score 
         ), 
         True 
         , 
         black 
         ), 
         ( 
         5 
         , 
         5 
         )) 
        
    2. 2
      Измените процесс завершения игры. Уберите простой выход из игры при столкновении игрока с шаром. Вместо этого создайте переменную в классе игрока, которая будет проверяться игрой. Когда переменная gameOver станет истинной, необходимо остановить обновление объектов. Все объекты замрут на месте, поэтому игрок сможет понять, что произошло, и увидит свой счет. Объекты по-прежнему будут отображаться на экране, но просто перестанут обновляться.
         class 
         Player 
         : 
         def 
         __init__ 
         ( 
         self 
         , 
         rad 
         = 
         20 
         ): 
         ... 
         self 
         . 
         gameOver 
         = 
         False 
         def 
         update 
         ( 
         self 
         , 
         gameObjects 
         ): 
         ... 
         for 
         gameObj 
         in 
         gameObjects 
         : 
         if 
         gameObj 
         . 
         type 
         == 
         "ball" 
         : 
         if 
         ( 
         gameObj 
         . 
         x 
         - 
         self 
         . 
         x 
         ) 
         ** 
         2 
         + 
         ( 
         gameObj 
         . 
         y 
         - 
         self 
         . 
         y 
         ) 
         ** 
         2 
         <= 
         ( 
         gameObj 
         . 
         radius 
         + 
         self 
         . 
         radius 
         ) 
         ** 
         2 
         : 
         self 
         . 
         gameOver 
         = 
         True 
         class 
         game 
         (): 
         def 
         __init__ 
         ( 
         self 
         ): 
         ... 
         self 
         . 
         gameOver 
         = 
         False 
         def 
         run 
         ( 
         self 
         ): 
         while 
         True 
         : 
         self 
         . 
         handleEvents 
         () 
         if 
         not 
         self 
         . 
         gameOver 
         : 
         for 
         gameObj 
         in 
         self 
         . 
         gameObjects 
         : 
         gameObj 
         . 
         update 
         ( 
         self 
         . 
         gameObjects 
         ) 
         if 
         gameObj 
         . 
         type 
         == 
         "player" 
         : 
         self 
         . 
         gameOver 
         = 
         gameObj 
         . 
         gameOver 
        
    3. 3
      Испытайте программу! Итоговый код программы должен выглядеть так:
         import 
         pygame 
         from 
         random 
         import 
         random 
         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 
         , 
         ( 
         int 
         ( 
         self 
         . 
         x 
         ), 
         int 
         ( 
         self 
         . 
         y 
         )), 
         self 
         . 
         radius 
         ) 
         def 
         update 
         ( 
         self 
         , 
         gameObjects 
         ): 
         self 
         . 
         x 
         += 
         self 
         . 
         dx 
         self 
         . 
         y 
         += 
         self 
         . 
         dy 
         if 
         ( 
         self 
         . 
         x 
         <= 
         0 
         or 
         self 
         . 
         x 
         >= 
         resolution 
         [ 
         0 
         ]): 
         self 
         . 
         dx 
         *= 
         - 
         1 
         if 
         ( 
         self 
         . 
         y 
         <= 
         0 
         or 
         self 
         . 
         y 
         >= 
         resolution 
         [ 
         1 
         ]): 
         self 
         . 
         dy 
         *= 
         - 
         1 
         class 
         Player 
         : 
         def 
         __init__ 
         ( 
         self 
         , 
         rad 
         = 
         20 
         ): 
         self 
         . 
         x 
         = 
         0 
         self 
         . 
         y 
         = 
         0 
         self 
         . 
         radius 
         = 
         rad 
         self 
         . 
         type 
         = 
         "player" 
         self 
         . 
         gameOver 
         = 
         False 
         def 
         draw 
         ( 
         self 
         , 
         surface 
         ): 
         pygame 
         . 
         draw 
         . 
         circle 
         ( 
         surface 
         , 
         red 
         , 
         ( 
         self 
         . 
         x 
         , 
         self 
         . 
         y 
         ), 
         self 
         . 
         radius 
         ) 
         def 
         update 
         ( 
         self 
         , 
         gameObjects 
         ): 
         cord 
         = 
         pygame 
         . 
         mouse 
         . 
         get_pos 
         () 
         self 
         . 
         x 
         = 
         cord 
         [ 
         0 
         ] 
         self 
         . 
         y 
         = 
         cord 
         [ 
         1 
         ] 
         for 
         gameObj 
         in 
         gameObjects 
         : 
         if 
         gameObj 
         . 
         type 
         == 
         "ball" 
         : 
         if 
         ( 
         gameObj 
         . 
         x 
         - 
         self 
         . 
         x 
         ) 
         ** 
         2 
         + 
         ( 
         gameObj 
         . 
         y 
         - 
         self 
         . 
         y 
         ) 
         ** 
         2 
         <= 
         ( 
         gameObj 
         . 
         radius 
         + 
         self 
         . 
         radius 
         ) 
         ** 
         2 
         : 
         self 
         . 
         gameOver 
         = 
         True 
         class 
         GameController 
         : 
         def 
         __init__ 
         ( 
         self 
         , 
         interval 
         = 
         5 
         ): 
         self 
         . 
         inter 
         = 
         interval 
         self 
         . 
         next 
         = 
         pygame 
         . 
         time 
         . 
         get_ticks 
         () 
         + 
         ( 
         2 
         * 
         1000 
         ) 
         self 
         . 
         type 
         = 
         "game controller" 
         self 
         . 
         score 
         = 
         0 
         self 
         . 
         scoreText 
         = 
         pygame 
         . 
         font 
         . 
         Font 
         ( 
         None 
         , 
         12 
         ) 
         def 
         update 
         ( 
         self 
         , 
         gameObjects 
         ): 
         if 
         self 
         . 
         next 
         < 
         pygame 
         . 
         time 
         . 
         get_ticks 
         (): 
         self 
         . 
         next 
         = 
         pygame 
         . 
         time 
         . 
         get_ticks 
         () 
         + 
         ( 
         self 
         . 
         inter 
         * 
         1000 
         ) 
         gameObjects 
         . 
         append 
         ( 
         Ball 
         ( 
         xVel 
         = 
         random 
         () 
         * 
         2 
         , 
         yVel 
         = 
         random 
         () 
         * 
         2 
         )) 
         self 
         . 
         score 
         += 
         1 
         def 
         draw 
         ( 
         self 
         , 
         screen 
         ): 
         screen 
         . 
         blit 
         ( 
         self 
         . 
         scoreText 
         . 
         render 
         ( 
         str 
         ( 
         self 
         . 
         score 
         ), 
         True 
         , 
         black 
         ), 
         ( 
         5 
         , 
         5 
         )) 
         class 
         game 
         (): 
         def 
         __init__ 
         ( 
         self 
         ): 
         pygame 
         . 
         init 
         () 
         self 
         . 
         screen 
         = 
         pygame 
         . 
         display 
         . 
         set_mode 
         ( 
         resolution 
         ) 
         self 
         . 
         clock 
         = 
         pygame 
         . 
         time 
         . 
         Clock 
         () 
         self 
         . 
         gameObjects 
         = 
         [] 
         self 
         . 
         gameObjects 
         . 
         append 
         ( 
         GameController 
         ()) 
         self 
         . 
         gameObjects 
         . 
         append 
         ( 
         Player 
         ()) 
         self 
         . 
         gameOver 
         = 
         False 
         def 
         handleEvents 
         ( 
         self 
         ): 
         for 
         event 
         in 
         pygame 
         . 
         event 
         . 
         get 
         (): 
         if 
         event 
         . 
         type 
         == 
         QUIT 
         : 
         pygame 
         . 
         quit 
         () 
         def 
         run 
         ( 
         self 
         ): 
         while 
         True 
         : 
         self 
         . 
         handleEvents 
         () 
         if 
         not 
         self 
         . 
         gameOver 
         : 
         for 
         gameObj 
         in 
         self 
         . 
         gameObjects 
         : 
         gameObj 
         . 
         update 
         ( 
         self 
         . 
         gameObjects 
         ) 
         if 
         gameObj 
         . 
         type 
         == 
         "player" 
         : 
         self 
         . 
         gameOver 
         = 
         gameObj 
         . 
         gameOver 
         self 
         . 
         screen 
         . 
         fill 
         ( 
         white 
         ) 
         for 
         gameObj 
         in 
         self 
         . 
         gameObjects 
         : 
         gameObj 
         . 
         draw 
         ( 
         self 
         . 
         screen 
         ) 
         self 
         . 
         clock 
         . 
         tick 
         ( 
         60 
         ) 
         pygame 
         . 
         display 
         . 
         flip 
         () 
         game 
         () 
         . 
         run 
         () 
        
      Реклама

    Об этой статье

    Эту страницу просматривали 15 030 раз.

    Была ли эта статья полезной?

    Реклама