ember/main.py
2026-05-03 15:03:33 +01:00

73 lines
1.9 KiB
Python

from typing import List
import pygame
import sys
import numpy as np
import imageio
from config import HEIGHT, WIDTH
from tqdm import tqdm
from ember import Ember
from wind import WindField
IS_DEVELOPMENT = False
EMBER_COUNT = 600
FRAME_RATE = 60
RUNNING_TIME_IN_SECONDS = 300
WIND_STRENTH = 300
delta_time = 1 / 150
embers: List[Ember] = [Ember() for _ in range(EMBER_COUNT)]
wind_field = WindField(WIDTH, HEIGHT)
pygame.init()
flags = pygame.HWSURFACE | pygame.HWACCEL
screen = pygame.display.set_mode((WIDTH, HEIGHT), flags)
pygame.display.set_caption("Animated Video")
clock = pygame.time.Clock()
video_file = "animation.mp4"
video_writer = imageio.get_writer(video_file, fps=FRAME_RATE)
for frame in tqdm(range(RUNNING_TIME_IN_SECONDS * FRAME_RATE)):
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
# screen.fill((0, 0, 0))
# Add a semi-transparent rectangle to create the trail effect
fade_surface = pygame.Surface((WIDTH, HEIGHT), pygame.SRCALPHA)
fade_surface.fill(
(0, 0, 0, 10)
) # Adjust the last parameter for the opacity (0-255)
screen.blit(fade_surface, (0, 0))
wind_field.update(time=frame / 150)
# wind_field.draw(screen)
for ember in embers:
wind = wind_field.get_wind(ember.position)
velocity_x = wind[0] * WIND_STRENTH
velocity_y = wind[1] * WIND_STRENTH
ember.update((velocity_x, velocity_y), delta_time=delta_time)
ember.draw(screen)
pygame.display.flip()
if not IS_DEVELOPMENT:
current_frame = pygame.surfarray.array3d(screen)
current_frame = np.rot90(current_frame)
# current_frame = np.flip(current_frame, axis=0)
video_writer.append_data(current_frame.copy())
if IS_DEVELOPMENT:
clock.tick(FRAME_RATE)
if not IS_DEVELOPMENT:
video_writer.close()