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