Обработка столкновений¶
Реализуйте игровую сцену, состоящую из движущейся цели и пушки, стреляющей снарядами.
"""
+-----------------------+
| |||||| | <- target
| |
| |
| * | <- bullet
| |
| |
| /'\ | <- cannon
+-----------------------+
"""
import random
import sys
import pygame
from pygame.color import THECOLORS
pygame.init()
WIDTH = 640
HEIGHT = 480
screen = pygame.display.set_mode((WIDTH, HEIGHT))
class Cannon:
def __init__(self):
# TODO(1.1): создайте атрибуты пушки:
# * Цвет
# * Список точек
# Пусть пушка отображается как равнобедренный треугольник с высотой
# и основанием по 50px. Отображается в середине окна
# на нижней границе, см. схему в начале файла.
...
def draw(self):
# TODO(1.2): отобразите созданную в __init__ последовательность точек
# заданным цветом.
...
class Bullet:
def __init__(self):
# TODO(2.1): создайте атрибуты снаряда.
# * Центр окружности снаряда
# * Радиус
# * Цвет
# * Скорость (для тестов использовать значение 3)
...
def draw(self):
# TODO(2.2): отобразите снаряд.
...
def move(self):
# TODO(2.3): реализуйте перемещение снаряда.
# Для этого нужно создать его новый центр со смещением speed по оси OY
# к началу коориднат.
...
class Target:
def __init__(self):
# TODO(3.1): создайте атрибуты мишени.
# * Цвет
# * Скорость
# * Прямоугольник
...
def draw(self):
# TODO(3.2): отобразите мишень.
...
def move(self):
# TODO(3.3): реализуйте движение мишени.
# При достижении края окна мишень должна менять направление движения
# на противположное. Это можно реализовать сменой знака сокрости.
...
colors = list(THECOLORS.values())
def get_random_color():
return random.choice(colors)
cannon = Cannon()
target = Target()
bullet = Bullet()
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
screen.fill(THECOLORS['black'])
target.move()
bullet.move()
# TODO(2.4): если снаряд достиг верхней границы окна, создать новый снаряд.
# TODO(4.1): если мишень и снаряд пересеклись, сменить цвет мишени на
# случайный, создать новй снаряд.
# Для определения пересечения используйте метод прямоугольника:
# Rect.collidepoint(point)
cannon.draw()
target.draw()
bullet.draw()
pygame.display.flip()
pygame.time.wait(33)
Реализуйте простейший тир, в котором игрок должен кликать по цели.
import math
import random
import sys
import pygame
from pygame.color import THECOLORS
pygame.mixer.init(22050, -16, 2, 64)
pygame.init()
WIDTH = 640
HEIGHT = 480
screen = pygame.display.set_mode((WIDTH, HEIGHT))
color = THECOLORS['purple1']
circle_radius = 50
def distance(p1, p2):
# TODO(3.3): Реализуйте функцию, которая вычисляет
# расстояние между точками p1 и p2.
...
def point_in_circle(p, circle_center, circle_radius):
# TODO(3.2): Реализуйте функцию, которая возвращает True,
# если точка находится внутри круга.
# Для полноценной работы функции вам понадобится
# реализовать функцию distance, но написать определение
# принадлежности точки кругу вы можете уже сейчас.
...
def place_circle():
# TODO(1.1): Функция должна вернуть кортеж, состоящий из
# координат центра круга: (x, y)
...
# TODO(1.2): инициализируйте центр круга
circle_center = ...
# TODO(5.1): Загрузите звук выстрела.
# Воспользуйтесь конструктором
# pygame.mixer.Sound(file_path: str) -> Sound
shot = ...
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
# TODO(2.1): Обработайте событие нажатия кнопки мыши
# pygame.MOUSEBUTTONDOWN
# TODO(2.2): При нажатии кнопки мыши смените цвет круга.
# TODO(3.1): Доработайте приложение так, чтобы круг менял цвет только
# если вы кликаете по нему. Для этого вам понадобирся реализовать
# функции point_in_circle и distance.
# TODO(4.1): доработайте приложение так, чтобы при
# клике по кругу он появлялся в случайной точке
# экрана.
# TODO(5.2): Воспроизведите звук выстрела в случае попадания по кругу.
# Используйте метод play() объекта класса Sound.
# TODO(6.1): Реализуйте подсчет очков. Если игрок попал в круг за
# секунду, то он получает 100 очков. За 2 секунды - 50. Дольше - 1.
...
screen.fill(THECOLORS['black'])
# TODO(1.3) Нарисуйте круг выбранного цвета.
...
pygame.display.flip()
pygame.time.wait(33)
Реализуйте движущийся шар, отскакивающий от стен.
import math
import sys
import pygame
from pygame.color import THECOLORS
pygame.init()
WIDTH = 1280
HEIGHT = 800
screen = pygame.display.set_mode((WIDTH, HEIGHT))
circle_center = (WIDTH // 2, HEIGHT // 2)
circle_radius = 50
circle_color = THECOLORS['purple2']
SPEED = 20
current_angle = -10
def get_move(angle):
angle = angle / 180. * math.pi
return (
int(SPEED * math.cos(angle)),
int(SPEED * math.sin(angle)))
def move_circle(center, move):
# TODO(1): функция возвращает новый центр окружности после смещения.
...
def get_angle(center):
# TODO(2): Функция принимает текущий центр круга и определяет,
# под каким углом он должен продолжать движение.
...
move = get_move(current_angle)
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
screen.fill(THECOLORS['black'])
# TODO(3):
# * Вычислить угол движения круга.
# * Вычислить вектор движения
# * Вычислить новый центр окружности
pygame.draw.circle(screen, circle_color, circle_center, circle_radius)
pygame.display.flip()
pygame.time.wait(33)
Звук выстрела: shot.wav.