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

Részecskegyorsítás,

Az alábbi kód egy fejlett, több ezer részecskét mozgató gravitációs örvényt és színátmenetes láng-effektust szimulál. Interaktív: az egér mozgatásával megváltoztathatod a gravitációs mezőt, a kattintással pedig újabb részecskecunamit indíthatsz.
--------------
import pygame
import sys
import math
import random

# Inicializálás
pygame.init()

# Képernyő beállítások
WIDTH, HEIGHT = 1000, 750
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Pygame - Komplex Részecske Szimuláció")
clock = pygame.time.Clock()

# Részecske osztály
class Particle:
    def __init__(self, x, y):
        self.x = x
        self.y = y
        self.vx = random.uniform(-5, 5)
        self.vy = random.uniform(-5, 5)
        self.size = random.uniform(2, 8)
        self.color = (0, 0, 0)
        self.life = 255  # Átlátszóság / életkor

    def update(self, mouse_x, mouse_y, attract):
        # Gravitáció / Vonzás az egér felé
        dx = mouse_x - self.x
        dy = mouse_y - self.y
        dist = math.hypot(dx, dy)
        
        if dist > 20:
            force = attract / dist
            self.vx += force * (dx / dist)
            self.vy += force * (dy / dist)

        # Súrlódás (légellenállás)
        self.vx *= 0.96
        self.vy *= 0.96

        # Pozíció frissítése
        self.x += self.vx
        self.y += self.vy

        # Élettartam csökkentése
        self.life -= 3.0

        # Szín dinamikus változása (szivárványos láng)
        # A sebesség és az életkor alapján
        speed = math.hypot(self.vx, self.vy)
        r = int(min(255, self.life))
        g = int(min(255, max(0, speed * 10)))
        b = int(min(255, max(0, 255 - self.life)))
        self.color = (r, g, b)

    def draw(self, surface):
        if self.life > 0:
            # Csillogó részecskék rajzolása alfa csatornával
            s = pygame.Surface((self.size * 2, self.size * 2), pygame.SRCALPHA)
            pygame.draw.circle(s, self.color + (int(self.life),), (int(self.size), int(self.size)), int(self.size))
            surface.blit(s, (self.x - self.size, self.y - self.size))

# Főprogram ciklus
particles = []
attraction_force = 500  # Gravitációs vonzóerő
running = True

while running:
    # Háttér törlése (enyhe elmosódás az 'alpha' miatt)
    s = pygame.Surface((WIDTH, HEIGHT), pygame.SRCALPHA)
    s.fill((10, 10, 15, 20))
    screen.blit(s, (0, 0))

    # Események kezelése
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.MOUSEBUTTONDOWN:
            # Kattintásra robbanás
            for _ in range(50):
                particles.append(Particle(event.pos[0], event.pos[1]))

    # Egér pozíciójának lekérdezése
    mouse_x, mouse_y = pygame.mouse.get_pos()
    
    # Új részecskék folyamatos generálása
    for _ in range(15):
        particles.append(Particle(mouse_x + random.randint(-10, 10), mouse_y + random.randint(-10, 10)))

    # Részecskék frissítése és kirajzolása
    for p in reversed(particles):
        p.update(mouse_x, mouse_y, attraction_force)
        p.draw(screen)
        
        # Töröljük a halott részecskéket
        if p.life <= 0:
            particles.remove(p)

    # Információk megjelenítése (FPS, részecskeszám)
    font = pygame.font.SysFont(None, 24)
    fps_text = font.render(f"FPS: {int(clock.get_fps())}", True, (255, 255, 255))
    count_text = font.render(f"Részecskék: {len(particles)}", True, (255, 255, 255))
    screen.blit(fps_text, (10, 10))
    screen.blit(count_text, (10, 30))

    pygame.display.flip()
    clock.tick(60)

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


Nincsenek megjegyzések:

Megjegyzés küldése