102 lines
3.0 KiB
Python
102 lines
3.0 KiB
Python
import pygame, sys, os
|
|
from pygame.locals import *
|
|
from random import randint
|
|
pygame.init()
|
|
|
|
MAXSPEED = 15
|
|
SIZE = 3
|
|
COLOR = (45, 90, 45)
|
|
WINDOWSIZE = 400
|
|
TIMETICK = 1
|
|
MAXPART = 50
|
|
|
|
freeParticles = pygame.sprite.Group()
|
|
tree = pygame.sprite.Group()
|
|
|
|
window = pygame.display.set_mode((WINDOWSIZE, WINDOWSIZE))
|
|
pygame.display.set_caption("Brownian Tree")
|
|
|
|
screen = pygame.display.get_surface()
|
|
|
|
|
|
class Particle(pygame.sprite.Sprite):
|
|
def __init__(self, vector, location, surface):
|
|
pygame.sprite.Sprite.__init__(self)
|
|
self.vector = vector
|
|
self.surface = surface
|
|
self.accelerate(vector)
|
|
self.add(freeParticles)
|
|
self.rect = pygame.Rect(location[0], location[1], SIZE, SIZE)
|
|
self.surface.fill(COLOR, self.rect)
|
|
|
|
def onEdge(self):
|
|
if self.rect.left <= 0:
|
|
self.vector = (abs(self.vector[0]), self.vector[1])
|
|
elif self.rect.top <= 0:
|
|
self.vector = (self.vector[0], abs(self.vector[1]))
|
|
elif self.rect.right >= WINDOWSIZE:
|
|
self.vector = (-abs(self.vector[0]), self.vector[1])
|
|
elif self.rect.bottom >= WINDOWSIZE:
|
|
self.vector = (self.vector[0], -abs(self.vector[1]))
|
|
|
|
def update(self):
|
|
if freeParticles in self.groups():
|
|
self.surface.fill((0,0,0), self.rect)
|
|
self.remove(freeParticles)
|
|
if pygame.sprite.spritecollideany(self, freeParticles):
|
|
self.accelerate((randint(-MAXSPEED, MAXSPEED),
|
|
randint(-MAXSPEED, MAXSPEED)))
|
|
self.add(freeParticles)
|
|
elif pygame.sprite.spritecollideany(self, tree):
|
|
self.stop()
|
|
else:
|
|
self.add(freeParticles)
|
|
|
|
self.onEdge()
|
|
|
|
if (self.vector == (0,0)) and tree not in self.groups():
|
|
self.accelerate((randint(-MAXSPEED, MAXSPEED),
|
|
randint(-MAXSPEED, MAXSPEED)))
|
|
self.rect.move_ip(self.vector[0], self.vector[1])
|
|
self.surface.fill(COLOR, self.rect)
|
|
|
|
def stop(self):
|
|
self.vector = (0,0)
|
|
self.remove(freeParticles)
|
|
self.add(tree)
|
|
|
|
def accelerate(self, vector):
|
|
self.vector = vector
|
|
|
|
NEW = USEREVENT + 1
|
|
TICK = USEREVENT + 2
|
|
|
|
pygame.time.set_timer(NEW, 50)
|
|
pygame.time.set_timer(TICK, TIMETICK)
|
|
|
|
|
|
def input(events):
|
|
for event in events:
|
|
if event.type == QUIT:
|
|
sys.exit(0)
|
|
elif event.type == NEW and (len(freeParticles) < MAXPART):
|
|
Particle((randint(-MAXSPEED,MAXSPEED),
|
|
randint(-MAXSPEED,MAXSPEED)),
|
|
(randint(0, WINDOWSIZE), randint(0, WINDOWSIZE)),
|
|
screen)
|
|
elif event.type == TICK:
|
|
freeParticles.update()
|
|
|
|
|
|
half = WINDOWSIZE/2
|
|
tenth = WINDOWSIZE/10
|
|
|
|
root = Particle((0,0),
|
|
(randint(half-tenth, half+tenth),
|
|
randint(half-tenth, half+tenth)), screen)
|
|
root.stop()
|
|
|
|
while True:
|
|
input(pygame.event.get())
|
|
pygame.display.flip()
|