Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/FollowMe.py
diff options
context:
space:
mode:
Diffstat (limited to 'FollowMe.py')
-rwxr-xr-xFollowMe.py218
1 files changed, 218 insertions, 0 deletions
diff --git a/FollowMe.py b/FollowMe.py
new file mode 100755
index 0000000..bc1c02f
--- /dev/null
+++ b/FollowMe.py
@@ -0,0 +1,218 @@
+#!/usr/bin/python
+# FollowMe.py
+"""
+ Copyright (C) 2010 Peter Hewitt
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+"""
+import g,utils,pygame,simon,buttons,sys,slider,load_save,rc_skip_last
+try:
+ import gtk
+except:
+ pass
+
+class FollowMe:
+
+ def __init__(self):
+ self.journal=True # set to False if we come in via main()
+ self.canvas=None # set to the pygame canvas if we come in via activity.py
+
+ def display(self):
+ g.screen.fill((0,255,0))
+ if self.aim.running or self.aim.glow_active:
+ pass
+ else:
+ x=g.imgs[g.green].x; y=g.imgs[g.green].y
+ w=g.imgs[g.green].w; h=g.imgs[g.green].h
+ pygame.draw.rect(g.screen,utils.WHITE,(x,y,w,h),g.sy(.2))
+ for img in g.imgs: # img from ImgClick (centred)
+ img.draw(g.screen)
+ if g.wrong:
+ img=g.imgs[g.wrong_ind]
+ utils.centre_blit(g.screen,g.wrong_img,(img.cx,img.cy))
+ img=g.imgs[g.right_ind]
+ utils.centre_blit(g.screen,g.glowy[g.right_ind],(img.cx,img.cy))
+ buttons.draw()
+ self.slider.draw()
+ self.ladder()
+ self.aim.glow()
+ self.player.glow(True)
+
+ def do_click(self):
+ self.glow_off()
+ if self.click(): return
+ bu=buttons.check()
+ if bu<>'':self.do_button(bu); return
+ if self.slider.mouse(): self.set_delay()
+
+ def do_button(self,bu):
+ if bu=='green': # start
+ self.aim.new1(); g.player_n=0; g.wrong=False; g.score=0
+ buttons.off("green"); buttons.on("back")
+ elif bu=='back': self.aim.start() # show again
+
+ def do_key(self,key):
+ if key in g.TICK:
+ self.change_level(); self.set_delay(); return
+ if key==pygame.K_v: g.version_display=not g.version_display; return
+ if self.aim.running or self.aim.glow_active: return
+ if key in g.CROSS: self.do_click(); return
+ if key in g.SQUARE:
+ if buttons.active('green'): self.do_button('green'); return
+ if buttons.active('back'): self.do_button('back'); return
+ if key in g.RIGHT:
+ g.green=self.rc.inc_c(g.green); g.imgs[g.green].mouse_set()
+ if key in g.LEFT:
+ g.green=self.rc.dec_c(g.green); g.imgs[g.green].mouse_set()
+ if key in g.UP:
+ g.green=self.rc.dec_r(g.green); g.imgs[g.green].mouse_set()
+ if key in g.DOWN:
+ g.green=self.rc.inc_r(g.green); g.imgs[g.green].mouse_set()
+
+ def mouse_set(self):
+ ind=0
+ for imgc in g.imgs:
+ if imgc.mouse_on(): g.green=ind; return
+ ind+=1
+
+ def change_level(self):
+ g.level+=1
+ if g.level>self.slider.steps: g.level=1
+
+ def ladder(self):
+ if g.score>g.best: g.best=g.score
+ if g.best>11:
+ cx=g.sx(30.55); cy=g.sy(13.25)
+ utils.centre_blit(g.screen,g.star,(cx,cy))
+ utils.display_number(g.best,(cx,cy),g.font2)
+ if g.score>0:
+ n=g.score-1
+ if n>11: n=11
+ g.screen.blit(g.ladder,(g.sx(26.95),g.sy(13.7)))
+ x=g.man_x0+n*g.man_dx; y=g.man_y0+n*g.man_dy
+ g.screen.blit(g.man,(x,y))
+ cx=x+g.man_sc_dx; cy=y+g.man_sc_dy
+ if g.score<g.best or g.best<12:
+ utils.centre_blit(g.screen,g.star,(cx,cy))
+ utils.display_number(g.score,(cx,cy),g.font2)
+
+ def which(self):
+ ind=0
+ for img in g.imgs:
+ if img.mouse_on(): return ind
+ ind+=1
+ return -1 # none clicked
+
+ def click(self):
+ if self.aim.running: return False
+ if g.wrong: return False
+ ind=self.which()
+ if ind==-1: return False
+ if len(self.aim.list1)==0: return False
+ self.player.glow_start(ind)
+ buttons.off("back")
+ if ind==self.aim.list1[g.player_n]:
+ g.player_n+=1
+ if g.player_n>g.score: g.score=g.player_n
+ if g.player_n==len(self.aim.list1): # all correct - add another
+ self.aim.inc(); g.player_n=0
+ else:
+ g.wrong=True; g.wrong_ind=ind
+ g.right_ind=self.aim.list1[g.player_n]
+ buttons.on("green")
+ return True # click processed
+
+ def glow_off(self):
+ self.aim.glow_off(); self.player.glow_off()
+
+ def set_delay(self):
+ self.aim.glow_time=(4-g.level)*500-300
+ self.aim.delay=(4-g.level)*330
+
+ def flush_queue(self):
+ flushing=True
+ while flushing:
+ flushing=False
+ if self.journal:
+ while gtk.events_pending(): gtk.main_iteration()
+ for event in pygame.event.get(): flushing=True
+
+ def run(self):
+ g.init()
+ if not self.journal: utils.load()
+ load_save.retrieve()
+ self.aim=simon.Simon(1200) # arg is glow time
+ self.set_delay()
+ self.player=simon.Simon(200)
+ bx=g.sx(22.42); by=g.sy(20.8)
+ buttons.Button("green",(bx,by),True)
+ buttons.Button("back",(bx,by),True); buttons.off("back")
+ self.slider=slider.Slider(g.sx(9),g.sy(20.8),3,utils.BLUE)
+ self.rc=rc_skip_last.RC(3,5)
+ if self.canvas<>None: self.canvas.grab_focus()
+ ctrl=False
+ pygame.key.set_repeat(600,120); key_ms=pygame.time.get_ticks()
+ going=True
+ while going:
+ if self.journal:
+ # Pump GTK messages.
+ while gtk.events_pending(): gtk.main_iteration()
+
+ # Pump PyGame messages.
+ for event in pygame.event.get():
+ if event.type==pygame.QUIT:
+ if not self.journal: utils.save()
+ going=False
+ elif event.type == pygame.MOUSEMOTION:
+ g.pos=event.pos
+ g.redraw=True
+ if self.canvas<>None: self.canvas.grab_focus()
+ self.mouse_set()
+ elif event.type == pygame.MOUSEBUTTONDOWN:
+ g.redraw=True
+ if event.button==1: self.do_click(); self.flush_queue()
+ elif event.type == pygame.KEYDOWN:
+ # throttle keyboard repeat
+ if pygame.time.get_ticks()-key_ms>110:
+ key_ms=pygame.time.get_ticks()
+ if ctrl:
+ if event.key==pygame.K_q:
+ if not self.journal: utils.save()
+ going=False; break
+ else:
+ ctrl=False
+ if event.key in (pygame.K_LCTRL,pygame.K_RCTRL):
+ ctrl=True; break
+ self.do_key(event.key); g.redraw=True
+ self.flush_queue()
+ elif event.type == pygame.KEYUP:
+ ctrl=False
+ if not going: break
+ if g.player_n==0 and not buttons.active('green'):
+ buttons.on("back")
+ self.player.do()
+ self.aim.do()
+ if g.redraw:
+ self.display()
+ if g.version_display: utils.version_display()
+ if self.aim.running or self.aim.glow_active:
+ pass
+ else:
+ g.screen.blit(g.pointer,g.pos)
+ pygame.display.flip()
+ g.redraw=False
+ g.clock.tick(40)
+
+if __name__=="__main__":
+ pygame.init()
+ pygame.display.set_mode((1024,768),pygame.FULLSCREEN)
+ game=FollowMe()
+ game.journal=False
+ game.run()
+ pygame.display.quit()
+ pygame.quit()
+ sys.exit(0)