Загрузить PDF
Загрузить PDF
Данная статья предназначена для тех, кто уже знаком с языком программирования Python, и позволяет подробнее изучить библиотеку Pygame для этого языка. В качестве наглядного примера здесь будет пошагово продемонстрирован процесс программирования простой игры, в которой игрок должен уворачиваться от прыгающих шаров.
Шаги
-
1Скачайте Pygame. Перейдите по ссылке и найдите подходящую для вашей платформы версию библиотеки: http://www.pygame.org/download.shtml .
-
2Запустите установщик.
-
3Убедитесь в том, что установка завершилась успешно. Откройте терминал Python. Введите «import pygame». Если сообщений об ошибках не появится, то Pygame был успешно установлен.
import pygame
Реклама
-
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 ()
Реклама
-
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
<=
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
()
-
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 <= 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 ()
Реклама
-
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 . x = cord [ 0 ] self . y = cord [ 1 ]
-
4Добавьте объект игрока в массив gameObjects. Создайте новый экземпляр объекта и добавьте его в список gameObjects.
class game (): def __init__ ( self ): ... self . gameObjects . append ( Player ())
-
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 ()
Реклама
-
1Измените функции обновления положения. Чтобы реализовать взаимодействие объектов, необходимо обеспечить им доступ к свойствам друг друга. Добавьте новый параметр в функцию Update, чтобы передать данные списка gameObjects. Параметр необходимо добавить в функции классов игрока и шаров. Если у вас определено много классов, наследование поможет сохранить список параметров одинаковым.
class Ball : ... def update ( self , gameObjects ): ... class Player : ... def update ( self , gameObjects ):
-
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Задайте конец игры при столкновении игрока с шаром. На данном этапе просто задайте выход из игры.
if ( gameObj . x - self . x ) ** 2 + ( gameObj . y - self . y ) ** 2 <= ( gameObj . radius + self . radius ) ** 2 : pygame . quit ()
-
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 ()
Реклама
-
1Создайте класс игрового контроллера. Игровые контроллеры отвечают за ход игры. Они не совпадают с классом самой игры, который отвечает за отрисовку и обновление всех игровых объектов. Контроллер будет периодически добавлять новый шар на экран и усложнять игру. Добавьте конструктор и инициализируйте некоторые стартовые значения. Интервал будет означать время, через которое будет добавляться новый шар.
class GameController : def __init__ ( self , interval = 5 ): self . inter = interval self . next = pygame . time . get_ticks () + ( 2 * 1000 ) self . type = "game controller"
-
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Установите для шаров случайные скорости. Чтобы игра вела себя по-разному, необходимо позволить ей использовать случайные числа для параметра скорости. Теперь скорость шаров станет определяться числом с плавающей десятичной запятой, а не целым числом.
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Исправьте функцию отрисовки. Функция draw не работает с числами с плавающей запятой (float). Поэтому необходимо выразить позицию шара в целых числах, прежде чем его отрисовывать.
class Ball : ... def draw ( self , surface ): pygame . draw . circle ( surface , black , ( int ( self . x ), int ( self . y )), self . radius )
-
5Определите метод отрисовки для игрового контроллера. Поскольку это тоже объект игры, в главном игровом цикле будет попытка нарисовать его. Поэтому для контроллера необходимо определить функцию отрисовки, которая ничего не делает, чтобы избежать сбоя игры.
class GameController : ... def draw ( self , screen ): pass
-
6Добавьте игровой контроллер в gameObjects и удалите 2 шара. Игра должна добавлять новый шар каждые 5 секунд.
class game (): def __init__ ( self ): ... self . gameObjects = [] self . gameObjects . append ( GameController ()) self . gameObjects . append ( Player ())
-
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 ()
Реклама
-
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Измените процесс завершения игры. Уберите простой выход из игры при столкновении игрока с шаром. Вместо этого создайте переменную в классе игрока, которая будет проверяться игрой. Когда переменная 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Испытайте программу! Итоговый код программы должен выглядеть так:
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 ()
Реклама
Реклама