bouncy/bouncy.py

126 lines
No EOL
2.9 KiB
Python

import pygame
from pygame.locals import *
import os
import sys
import math
import random
pygame.init()
repeat = 0
def handle_keys(keys, elapsed):
global bounce, speed_player, trails, dir_player, color_player, repeat
def repeatdelay(wait):
global repeat
repeat += elapsed
if repeat == elapsed:
return True
if repeat >= wait:
repeat = 0
return True
return False
for key in keys:
if key == K_b:
bounce = not bounce
elif key == K_q:
sys.exit(0)
elif key == K_c and repeatdelay(0.2):
color_player = (random.randint(0,255), random.randint(0,255), random.randint(0,255))
elif key == K_t and repeatdelay(1.0):
trails = not trails
elif key == K_UP and repeatdelay(0.02):
speed_player += 0.05
elif key == K_DOWN and repeatdelay(0.02):
speed_player -= 0.05
elif key == K_LEFT and repeatdelay(0.02):
dir_player -= (math.pi / 180.0)
elif key == K_RIGHT and repeatdelay(0.02):
dir_player += (math.pi / 180.0)
def move(coords, dir, mag):
return [coords[0] + (math.sin(dir) * mag), coords[1] - (math.cos(dir) * mag)]
def limitdir(dir):
while dir < 0:
dir += math.pi*2.0
while dir > math.pi*2.0:
dir -= math.pi*2.0
return dir
def bouncedir(normal, dir):
inv_normal = limitdir(normal + math.pi)
return limitdir(normal + (inv_normal - dir))
loc_player = [100.0,150.0]
dir_player = math.pi * 0.80
size = width, height = (640,480)
scr = pygame.display.set_mode(size)
#options
color_player = (255,255,255)
bounce = True
speed_player = 5.0
trails = False
scr.fill((0,0,0))
last_frame = pygame.time.get_ticks()
keys = []
while True:
events = pygame.event.get((KEYDOWN, KEYUP))
for ev in events:
if ev.type == KEYUP:
try:
del keys[keys.index(ev.key)]
except IndexError:
pass
else:
keys += [ev.key]
pygame.time.wait(1)
elapsed_ms = pygame.time.get_ticks() - last_frame
elapsed = elapsed_ms / 1000.0
last_frame = pygame.time.get_ticks()
handle_keys(keys, elapsed)
pygame.event.pump()
loc_new = move(loc_player, dir_player, speed_player * 10.0 * elapsed)
if loc_new[0] < 5:
if not bounce:
loc_new[0] = width-6
else:
dir_player = bouncedir(math.pi*0.5, dir_player)
elif loc_new[1] < 5:
if not bounce:
loc_new[1] = height-6
else:
dir_player = bouncedir(math.pi, dir_player)
elif loc_new[0] > width - 5:
if not bounce:
loc_new[0] = 6
else:
dir_player = bouncedir(math.pi*1.5, dir_player)
elif loc_new[1] > height - 5:
if not bounce:
loc_new[1] = 6
else:
dir_player = bouncedir(0, dir_player)
if bounce:
loc_new = move(loc_player, dir_player, speed_player * 10.0 * elapsed)
if not trails:
pygame.draw.circle(scr, (0,0,0), loc_player, 2, 1)
pygame.draw.circle(scr, color_player, loc_new, 2, 1)
loc_player = loc_new
pygame.display.flip()