2026. június 29., hétfő

Kandallóban interaktív tűz-szimuláció

Interaktív tűz-szimulációt és színátmenetes részecske-örvényt hoz létre, amely a GPU gyorsítás hiányában is lenyűgöző vizuális élményt nyújt.
----------
import pygame
import sys
import math
import random

# Inicializálás
pygame.init()

# Ablak beállítások
WIDTH, HEIGHT = 1000, 750
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Komplex Pygame Részecskeszimuláció és Tűzhatás")

# Óra a sebesség (FPS) szabályozásához
clock = pygame.time.Clock()

# Színpaletta
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)

class Particle:
    def __init__(self, x, y):
        self.x = x
        self.y = y
        # Véletlen irány és sebesség
        angle = random.uniform(0, math.pi * 2)
        speed = random.uniform(2, 8)
        self.vx = math.cos(angle) * speed
        self.vy = math.sin(angle) * speed - 2  # Enyhe felhajtóerő
        
        # Élettartam és méret
        self.life = random.randint(50, 100)
        self.max_life = self.life
        self.size = random.uniform(4, 10)
        
        # Színárnyalat (meleg színek)
        self.color = (255, random.randint(100, 200), 0)

    def update(self, gravity):
        self.vx *= 0.96  # Légellenállás
        self.vy += gravity # Gravitáció/Felhajtóerő
        self.x += self.vx
        self.y += self.vy
        self.life -= 1

    def draw(self, surface):
        alpha = int((self.life / self.max_life) * 255)
        # Átlátszó (alpha) felület létrehozása a lágy fényhatáshoz
        img = pygame.Surface((self.size * 2, self.size * 2), pygame.SRCALPHA)
        pygame.draw.circle(img, (self.color[0], self.color[1], self.color[2], alpha), (self.size, self.size), self.size)
        surface.blit(img, (int(self.x - self.size), int(self.y - self.size)))

# Fő programciklus
particles = []
gravity = 0.05
color_shift = 0

running = True
while running:
    # Események kezelése
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_SPACE:
                # Gravitáció megváltoztatása szóközre
                gravity = -gravity if gravity > 0 else 0.05

    # Háttér törlése enyhe átlátszósággal az "utófény" (motion blur) hatáshoz
    s = pygame.Surface((WIDTH, HEIGHT), pygame.SRCALPHA)
    s.fill((0, 0, 0, 25))
    screen.blit(s, (0, 0))

    # Új részecskék generálása az egér pozíciójában vagy középen
    mouse_pos = pygame.mouse.get_pos()
    if pygame.mouse.get_pressed()[0]:
        spawn_point = mouse_pos
    else:
        spawn_point = (WIDTH // 2, HEIGHT - 50)
        
    for _ in range(8):
        particles.append(Particle(spawn_point[0], spawn_point[1]))

    # Színátmenet animációja idővel
    color_shift = (color_shift + 1) % 360

    # Részecskék frissítése és rajzolása
    for p in reversed(particles):
        p.update(gravity)
        if p.life <= 0:
            particles.remove(p)
        else:
            p.draw(screen)

    # Képernyő frissítése
    pygame.display.flip()
    clock.tick(60)

pygame.quit()
sys.exit()
-----------

--------------
https://onecompiler.com/pygame#draft-fxyj

Nincsenek megjegyzések:

Megjegyzés küldése