import key_codes, appuifw, e32, graphics, random
MAX_UFO_SIZE = 50
MAX_UFOS = 7
UFO_TIME = 100.0
PAD_W = 40
PAD_H = 15
PAD_COLOR = (12, 116, 204)
PAD_SPEED = 7
LASER_COLOR = (255, 0, 204)
TIME = 1000
def handle_redraw(rect):
global shoot, sleep, ufos, timer
buf.clear((0, 0, 0))
buf.rectangle((pad_x, H - PAD_H, pad_x + PAD_W, H),\
fill = PAD_COLOR)
if shoot:
x = pad_x + PAD_W / 2
buf.line((x, H - PAD_H, x, 0),\
width = 2, outline = LASER_COLOR)
shoot = False
sleep = 0.1
check_hits(x)
else:
sleep = 0.01
for x, y, s, t, hit in ufos:
f = 1.0 - (timer - t) / UFO_TIME
if hit:
c = (255, 0, 0)
else:
c = (0, f * 255, 0)
buf.ellipse((x, y, x + s, y + s), fill = c)
buf.text((10, 40), u"%d" % score,
fill = LASER_COLOR, font = "title")
buf.text((W - 70, 40), u"%d" % (TIME - timer),
fill = LASER_COLOR, font = "title")
canvas.blit(buf)
def check_hits(laser_x):
global ufos, score
i = 0
ok_ufos = []
for x, y, s, t, hit in ufos:
if laser_x > x and laser_x < x + s:
ok_ufos.append((x, y, s, t, True))
score += MAX_UFO_SIZE - (s - 1)
else:
ok_ufos.append((x, y, s, t, False))
ufos = ok_ufos
def update_ufos():
global ufos, timer
ok_ufos = []
for x, y, s, t, hit in ufos:
if not hit and timer < t + UFO_TIME:
ok_ufos.append((x, y, s, t, False))
ufos = ok_ufos
if len(ufos) < MAX_UFOS:
s = random.randint(10, MAX_UFO_SIZE)
x = random.randint(0, W - s)
y = random.randint(0, H - PAD_H * 3)
t = random.randint(0, UFO_TIME)
ufos.append((x, y, s, timer + t, False))
def handle_event(event):
global direction, shoot
if event['keycode'] == key_codes.EKeyLeftArrow:
direction = -PAD_SPEED
elif event['keycode'] == key_codes.EKeyRightArrow:
direction = PAD_SPEED
elif event['keycode'] == key_codes.EKeySelect:
shoot = True
def quit():
global timer
timer = TIME
ufos = []
shoot = False
direction = pad_x = score = timer = 0
appuifw.app.exit_key_handler = quit
appuifw.app.screen = 'large'
canvas = appuifw.Canvas(event_callback = handle_event,\
redraw_callback = handle_redraw)
W, H = canvas.size
buf = graphics.Image.new((W, H))
appuifw.app.body = canvas
while timer < TIME:
pad_x += direction
pad_x = min(pad_x, W - PAD_W)
pad_x = max(pad_x, 0)
update_ufos()
handle_redraw((W, H))
e32.ao_sleep(sleep)
timer += 1
print "Your final score was %d!" % score