Last active
December 10, 2021 08:37
-
-
Save ShashkovS/24a0020debe7b4a00fe232b44d6e38ac to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import pygame | |
from pygame import locals | |
import sys | |
from random import randint, choice, uniform | |
from dataclasses import dataclass | |
NUM_STARS = 300 | |
D = 1 | |
@dataclass | |
class Star: | |
x: float | |
y: float | |
z: float | |
r: int | |
color: tuple | |
def gen_star(): | |
'''Создать звезду''' | |
x = randint(-1000000 // 2, 1000000 // 2) | |
y = randint(1, 1000) | |
z = randint(-1000000 // 2, 1000000 // 2) | |
r = randint(10, 3000) | |
color = (randint(0, 255), randint(0, 255), randint(0, 255)) | |
return Star(x, y, z, r, color) | |
def create_stars(): | |
'''Создать массив звёзд''' | |
stars = [] | |
for i in range(NUM_STARS): | |
stars.append(gen_star()) | |
return stars | |
def move_stars(stars, speed): | |
'''Сдвинуть все звёзды | |
Если звезда перестала попадать на экран, то заменяем её на новую''' | |
Vx, Vy, Vz = speed | |
for i, star in enumerate(stars): | |
star.x += Vx | |
star.y += Vy | |
star.z += Vz | |
if ( | |
not (1 < star.y < 1000) | |
or not (-500 < D * star.x / star.y < 500) | |
or not (-500 < D * star.x / star.y < 500) | |
): | |
stars[i] = gen_star() | |
def draw_stars(stars, screen): | |
'''Отрисовать все звёзды''' | |
# Сортируем звёзды, чтобы те, которые ближе к экрану, отрисовывались позже | |
stars.sort(key=lambda star: -star.y) | |
for i, star in enumerate(stars): | |
y = star.y | |
# Координаты должны быть целыми, это — требование pygame | |
screen_x = int(500 + D * star.x / y) | |
screen_y = int(500 + D * star.z / y) | |
screen_r = int(D * star.r / y) | |
pygame.draw.circle(screen, star.color, (screen_x, screen_y), screen_r) | |
def process_keys(pressed_keys, speed): | |
'''Обрабатываем нажатия клавиш | |
Используем WASD для вверх/вниз/влево/вправо и QE для вперёд/назад''' | |
if pressed_keys[locals.K_UP] or pressed_keys[locals.K_w]: | |
speed[2] += 100 | |
if pressed_keys[locals.K_DOWN] or pressed_keys[locals.K_s]: | |
speed[2] -= 100 | |
if pressed_keys[locals.K_LEFT] or pressed_keys[locals.K_a]: | |
speed[0] += 100 | |
if pressed_keys[locals.K_RIGHT] or pressed_keys[locals.K_d]: | |
speed[0] -= 100 | |
if pressed_keys[locals.K_q]: | |
speed[1] -= 1 | |
if pressed_keys[locals.K_e]: | |
speed[1] += 1 | |
# Здесь ставим размер экрана | |
screen = pygame.display.set_mode((1000, 1000)) | |
clock = pygame.time.Clock() | |
stars = create_stars() | |
# Текущая скорость, стартуем с 0 | |
speed = [0, 0, 0] | |
while True: | |
# Заливаем всё чёрным | |
screen.fill((0, 0, 0)) | |
# Обрабатываем закрытие экрана | |
for event in pygame.event.get(): | |
if event.type == pygame.QUIT: | |
pygame.quit() | |
sys.exit() | |
# Обрабатываем нажатия клавиш | |
process_keys(pygame.key.get_pressed(), speed) | |
# Двигаем звёзды | |
move_stars(stars, speed) | |
# Рисуем звёзды | |
draw_stars(stars, screen) | |
# Выводим рисунок на экран | |
pygame.display.flip() | |
# Ждём 1/30 секунды | |
clock.tick(30) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment