126 lines
No EOL
2.9 KiB
Python
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() |