Skip to content

Instantly share code, notes, and snippets.

@ShashkovS
Last active December 10, 2021 08:37
Show Gist options
  • Save ShashkovS/24a0020debe7b4a00fe232b44d6e38ac to your computer and use it in GitHub Desktop.
Save ShashkovS/24a0020debe7b4a00fe232b44d6e38ac to your computer and use it in GitHub Desktop.
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