Bubbletree

This program falls into the category ‘fancy, but not usefull’. It basically starts with one circle, which spawns in new ones. The maximum number of circles is 100, their color is a gray tone (rgb between 50 and 100).

The First Example The Second Example The Third Example


# Python 2.7.7 Code
# Pygame 1.9.1 (for Python 2.7.7)
# Jonathan Frech 8th of May, 2015

# gets the scaled mouse position
def getMousePos():
	p = pygame.mouse.get_pos()
	return [
				p[0] / main.SCALE, p[1] / main.SCALE
			]

# gets the distance between two points
def getDistance(p1, p2):
	return int(
				math.sqrt((p2[0] - p1[0])**2 + (p2[1] - p1[1])**2)
			)

# validates color integer
# extra feature: _min and _max implementation
def colorValid(_color, _min = 0, _max = 255):
	newColor = math.fabs(_color)
	n = _max - _min
	if newColor > n:
		if int(newColor / n) % 2 == 0:
			newColor = newColor % n
		else:
			newColor = n - (newColor % n)
	
	return int(newColor) + _min

# gets the position on a circle
# circle center                           : '_pos'
# circle radius                           : '_radius'
# angle from center to point on the circle: '_angle'
def getCirclePos(_pos, _radius, _angle):
	return [
				int(_pos[0] + _radius * math.cos(math.radians(_angle))),
				int(_pos[1] + _radius * math.sin(math.radians(_angle)))
			]

# swaps a boolean
def boolSwap(_bool):
	if _bool:
		return False
	else:
		return True

class bubble():
	def __init__(self, _pos, _size):
		self.pos = _pos
		self.size = _size
		self.color = [
			colorValid(main.TICKS, 50, 100),
			colorValid(main.TICKS, 50, 100),
			colorValid(main.TICKS, 50, 100)
		]
		self.spawnDelay = 5
		self.done = False
		self.dead = False
		
		if self.pos[0] < 0:
			self.pos[0] = 0
		if self.pos[0] > main.WIDTH:
			self.pos[0] = main.WIDTH
		
		if self.pos[1] < 0:
			self.pos[1] = 0
		if self.pos[1] > main.HEIGHT:
			self.pos[1] = main.HEIGHT
	
	def tick(self):
		self.spawnDelay -= 1
		if not self.done and main.TICKS % 10 == 0 and self.spawnDelay <= 0:
			
			for _ in range(0, random.randint(1, 2)):
				s = random.randint(10, 50)
				main.BUBBLES.append(
					bubble(
						getCirclePos(self.pos, self.size, random.randint(0, 360)),
						s
					)
				)
			
			self.done = True
		
		#if self.spawnDelay <= -10:
		#	self.dead = True
	
	def render(self, _surface):
		pygame.draw.circle(_surface, self.color, self.pos, self.size)

# tick function
def tick():
	# handle events
	for event in pygame.event.get():
		# quit
		if event.type == pygame.QUIT:
				sys.exit()
		
		# keyup
		if event.type == pygame.KEYUP:
			# handle 'main.KEYSDOWN'
			if event.key in main.KEYSDOWN:
				main.KEYSDOWN.remove(event.key)
		
		# keydown
		if event.type == pygame.KEYDOWN:
			# handle 'main.KEYSDOWN'
			if event.key not in main.KEYSDOWN:
				main.KEYSDOWN.append(event.key)
	
	while len(main.BUBBLES) > 100:
		main.BUBBLES.pop(random.randint(0, len(main.BUBBLES) - 1))
	
	for _ in main.BUBBLES:
		_.tick()
		if _.dead:
			main.BUBBLES.remove(_)

# render function
def render():
	# fill
	main.SCREEN.fill(main.BACKGROUNDCOLOR)
	if main.FILL:
		main.SURF.fill(main.COLOR)
	
	for _ in main.BUBBLES:
		_.render(main.SURF)
	
	# blit and flip
	main.SCREEN.blit(pygame.transform.scale(main.SURF, [int(main.WIDTH * main.SCALE), int(main.HEIGHT * main.SCALE)]), [0, 0])
	pygame.display.flip()

# run function (uses tick() and render())
def run():
	ticksPerSecond = 60
	lastTime = time.time() * 1000000000
	nsPerTick =  1000000000.0 / float(ticksPerSecond)
	
	ticks = 0
	frames = 0
	
	lastTimer = time.time() * 1000
	delta = 0.0
	
	while True:
		now = time.time() * 1000000000
		delta += float(now - lastTime) / float(nsPerTick)
		lastTime = now
		shouldRender = False
				
		while delta >= 1:
			ticks += 1
			main.TICKS += 1
			tick()
			delta -= 1
			shouldRender = True
		
		if shouldRender:
			frames += 1
			render()
		
		if time.time() * 1000 - lastTimer >= 1000:
			lastTimer += 1000
			
			# debug
			#print("Frames: " + str(frames) + ", ticks: " + str(ticks))
			
			frames = 0
			ticks = 0

# dummy class for global variables
class dummy():
	pass

# importing needed modules
import pygame, sys, time, math, os, random

# main dummy
main = dummy()
main.TICKS = 0

main.RES = 1
main.WIDTH = 1080 / main.RES
main.HEIGHT = 720 / main.RES
main.SIZE = [main.WIDTH, main.HEIGHT]
main.CENTER = [main.WIDTH / 2, main.HEIGHT / 2]
main.CENTERFLOAT = [main.WIDTH / 2.0, main.HEIGHT / 2.0]

main.SCALE = 1 * main.RES
main.SCALEDSIZE = [int(main.WIDTH * main.SCALE), int(main.HEIGHT * main.SCALE)]
main.SCALEDSIZEFLOAT = [main.WIDTH * main.SCALE, main.HEIGHT * main.SCALE]

main.SURF = pygame.Surface(main.SIZE)

main.SCREEN = pygame.display.set_mode(main.SCALEDSIZE)
pygame.display.set_caption("Bubbletree")

main.BACKGROUNDCOLOR = [0, 0, 0]
main.COLOR = [150, 0, 0]
main.FILL = True

main.KEYSDOWN = []
main.BUBBLES = [bubble(main.CENTER, 50)]

# start program
run()
Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s