Эпическая заставка, вдохновленная фильмом “Матрица”

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

Шаг 1: Подготовка среды

Для начала нам нужно установить необходимые библиотеки. Убедитесь, что у вас установлен Python и библиотека Pygame. Если нет, установите их с помощью pip:

pip install pygame

Шаг 2: Импорт библиотек

Мы начнем с импорта необходимых библиотек:

import os
import pygame as pg
from random import choice, randrange
  • os поможет нам настроить окружение.
  • pygame (импортирован как pg) — это наша основная графическая библиотека.
  • random используется для генерации случайных чисел и выбора случайных символов.

Шаг 3: Настройка окна и параметров

Мы создадим окно с разрешением 1600×900 пикселей и настроим некоторые параметры:

os.environ['SDL_VIDEO_CENTERED'] = '1'
RES = WIDTH, HEIGHT = 1600, 900
FONT_SIZE = 40
alpha_value = 0
  • SDL_VIDEO_CENTERED центрирует окно на экране.
  • RES задает разрешение окна.
  • FONT_SIZE определяет размер шрифта.
  • alpha_value будет использоваться для управления прозрачностью.

Шаг 4: Инициализация Pygame

Теперь инициализируем Pygame и создадим окно:

pg.init()
screen = pg.display.set_mode(RES)
surface = pg.Surface(RES)
surface.set_alpha(alpha_value)
clock = pg.time.Clock()
  • screen — это основное окно, где будет отображаться наша заставка.
  • surface — это дополнительная поверхность, на которой мы будем рисовать символы.
  • clock поможет нам контролировать частоту кадров.

Шаг 5: Создание символов

Мы будем использовать японские символы катаканы для создания эффекта “матричного дождя”. Создадим список символов и отрендерим их с разными цветами:

katakana = [chr(int('0x30a0', 16) + i) for i in range(96)]
font = pg.font.Font('font/ms mincho.ttf', FONT_SIZE, bold=True)
green_katakana = [font.render(char, True, (40, randrange(160, 256), 40)) for char in katakana]
lightgreen_katakana = [font.render(char, True, pg.Color('lightgreen')) for char in katakana]
  • katakana содержит символы катаканы.
  • font задает шрифт и его размер.
  • green_katakana и lightgreen_katakana — это списки отрендеренных символов с разными цветами.
  • название шрифта MS Mincho.ttf его надо загрузить в папку font проекта
Шрифт MS Mincho.ttf

Шрифт MS Mincho.ttf — это стандартный японский шрифт, который обычно предустановлен на компьютерах с операционной системой Windows. Если у вас установлена Windows, вы можете найти этот шрифт в системной папке со шрифтами. 

Если шрифт MS Mincho.ttf отсутствует на вашем компьютере, вы можете поискать его в интернете.

Шаг 6: Создание классов Symbol и SymbolColumn

Теперь создадим два класса: Symbol и SymbolColumn. Класс Symbol будет представлять отдельный символ, а SymbolColumn — колонку символов.

class Symbol:
    def __init__(self, x, y, speed):
        self.x, self.y = x, y
        self.speed = speed
        self.value = choice(green_katakana)
        self.interval = randrange(5, 30)

    def draw(self, color):
        frames = pg.time.get_ticks()
        if not frames % self.interval:
            self.value = choice(green_katakana if color == 'green'      else lightgreen_katakana)
        self.y = self.y + self.speed if self.y < HEIGHT else -FONT_SIZE
        surface.blit(self.value, (self.x, self.y))


class SymbolColumn:
    def __init__(self, x, y):
        self.column_height = randrange(8, 24)
        self.speed = randrange(3, 7)
        self.symbols = [Symbol(x, i, self.speed) for i in range(y, y - FONT_SIZE * self.column_height, -FONT_SIZE)]

    def draw(self):
        [symbol.draw('green') if i else symbol.draw('lightgreen') for i, symbol in enumerate(self.symbols)]
  • Symbol управляет позицией, скоростью и отрисовкой символа.
  • SymbolColumn создает колонку символов и управляет их отрисовкой.

Шаг 7: Создание колонок символов

Теперь создадим колонки символов, которые будут заполнять экран:

symbol_columns = [SymbolColumn(x, randrange(-HEIGHT, 0)) for x in range(0, WIDTH, FONT_SIZE)]

Каждая колонка будет начинаться с случайной позиции по вертикали.

Шаг 8: Основной цикл программы

Наконец, создадим основной цикл программы, где будет происходить отрисовка и обновление экрана:

while True:
    screen.blit(surface, (0, 0))
    surface.fill(pg.Color('black'))

    [symbol_column.draw() for symbol_column in symbol_columns]

    if not pg.time.get_ticks() % 20 and alpha_value < 170:
        alpha_value += 6
        surface.set_alpha(alpha_value)

    [exit() for i in pg.event.get() if i.type == pg.QUIT]
    pg.display.flip()
    clock.tick(60)
  • В этом цикле мы отрисовываем символы, управляем прозрачностью и обрабатываем события, такие как закрытие окна.

Заключение

Теперь у вас есть код, который создает эффект “матричного дождя”. Вы можете экспериментировать с параметрами, такими как скорость, цвет и размер символов, чтобы создать уникальную заставку. Удачи в вашем программировании!

Skill
50%

поддержать автора