From da77c8f245b5f186445352992cb6280503585985 Mon Sep 17 00:00:00 2001 From: flavio Date: Thu, 20 Dec 2012 18:13:21 +0000 Subject: Follow Me Base --- diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4842d8c --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +*.py[co] +*.bak 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.scoreg.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) diff --git a/MANIFEST b/MANIFEST new file mode 100644 index 0000000..8c1774d --- /dev/null +++ b/MANIFEST @@ -0,0 +1,70 @@ +slider.py +setup.py +g.py +buttons.py +imgClick.py +load_save.py +simon.py +utils.py +FollowMe.py +rc_skip_last.py +activity.py +sugargame/__init__.py +sugargame/canvas.py +sugargame/event.py +activity/activity.info +activity/activity.svg +data/pointer.png +data/7.png +data/fast.png +data/3.png +data/man.png +data/star.png +data/green_down.png +data/ladder.png +data/back_up.png +data/13.png +data/slow.png +data/10.png +data/12.png +data/8.png +data/xo.png +data/9.png +data/14.png +data/back_down.png +data/4.png +data/6.png +data/11.png +data/5.png +data/2.png +data/1.png +data/wrong.png +data/green_up.png +data/glow/7.png +data/glow/3.png +data/glow/13.png +data/glow/10.png +data/glow/12.png +data/glow/8.png +data/glow/9.png +data/glow/14.png +data/glow/4.png +data/glow/6.png +data/glow/11.png +data/glow/5.png +data/glow/2.png +data/glow/1.png +data/glowy/7.png +data/glowy/3.png +data/glowy/13.png +data/glowy/10.png +data/glowy/12.png +data/glowy/8.png +data/glowy/9.png +data/glowy/14.png +data/glowy/4.png +data/glowy/6.png +data/glowy/11.png +data/glowy/5.png +data/glowy/2.png +data/glowy/1.png diff --git a/activity.py b/activity.py new file mode 100755 index 0000000..fdaa0f9 --- /dev/null +++ b/activity.py @@ -0,0 +1,53 @@ +# activity.py +# my standard link between sugar and my activity + +from gettext import gettext as _ + +import gtk +import pygame +from sugar.activity import activity +from sugar.graphics.toolbutton import ToolButton +import gobject +import sugargame.canvas +import load_save +import FollowMe + +class PeterActivity(activity.Activity): + def __init__(self, handle): + super(PeterActivity, self).__init__(handle) + + # Build the activity toolbar. + toolbox = activity.ActivityToolbox(self) + activity_toolbar = toolbox.get_activity_toolbar() + activity_toolbar.keep.props.visible = False + activity_toolbar.share.props.visible = False + + toolbox.show() + self.set_toolbox(toolbox) + + # Create the game instance. + self.game = FollowMe.FollowMe() + + # Build the Pygame canvas. + self._pygamecanvas = \ + sugargame.canvas.PygameCanvas(self) + # Note that set_canvas implicitly calls + # read_file when resuming from the Journal. + self.set_canvas(self._pygamecanvas) + self.game.canvas=self._pygamecanvas + + # Start the game running. + self._pygamecanvas.run_pygame(self.game.run) + + def read_file(self, file_path): + try: + f = open(file_path, 'r') + except: + return #**** + load_save.load(f) + f.close() + + def write_file(self, file_path): + f = open(file_path, 'w') + load_save.save(f) + f.close() diff --git a/activity/activity.info b/activity/activity.info new file mode 100644 index 0000000..2fda8c4 --- /dev/null +++ b/activity/activity.info @@ -0,0 +1,8 @@ +[Activity] +name = Follow Me +activity_version = 22 +host_version = 1 +bundle_id = org.laptop.community.FollowMe +icon = activity +show_launcher = yes +exec = sugar-activity activity.PeterActivity diff --git a/activity/activity.svg b/activity/activity.svg new file mode 100644 index 0000000..2555585 --- /dev/null +++ b/activity/activity.svg @@ -0,0 +1,105 @@ + + +]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/buttons.py b/buttons.py new file mode 100755 index 0000000..9542796 --- /dev/null +++ b/buttons.py @@ -0,0 +1,106 @@ +# buttons.py +import g,utils,pygame + +class Button: + _instances=[] + + def __init__(self,name,(x1,y1),centre=True): # eg ('plus',(30,40)) + self._instances.append(self) + up=utils.load_image(name+"_up.png",True) + down=utils.load_image(name+"_down.png",True) + w=up.get_width();h=up.get_height();x=x1;y=y1 + if centre: + self.cx=x; self.cy=y + x=x-w/2; y=y-h/2 + else: + self.cx=x+w/2; self.cy=y+h/2 + self.rect=pygame.Rect(x,y,w,h) + self.name=name; self.x=x; self.y=y; self.active=True + self.up=up; self.down=down; self.stay_down=False + + def mouse_on(self): + mx,my=g.pos + return self.rect.collidepoint(mx,my) + + def draw_up(self): + g.screen.blit(self.up,(self.x,self.y)) + + def draw_down(self): + g.screen.blit(self.down,(self.x,self.y)) + + def on(self): + self.active=True + + def off(self): + self.active=False + +def draw(): + for b in Button._instances: + if b.active: + if b.stay_down: + b.draw_down() + else: + b.draw_up() + +def check(): + clear() + for b in Button._instances: + if b.active: + if b.mouse_on(): + if b.name in ('xyz1','xyz2'): + b.stay_down=True + else: + b.draw_down() + g.screen.blit(g.pointer,g.pos) + pygame.display.flip() + pygame.time.wait(300) + return b.name #**** + return '' # no button pressed + +def clear(): + for b in Button._instances: b.stay_down=False + +def active(name): + for b in Button._instances: + if b.name==name: return b.active #**** + return False # not found + +def stay_down(name): + for b in Button._instances: + if b.name==name: b.stay_down=True; return #**** + return + +def mouse_on(name): + mx,my=g.pos + for b in Button._instances: + if b.name==name: + return b.rect.collidepoint(mx,my) + return False + +def set_mouse(name): + p2=g.pointer.get_height()/2 + for b in Button._instances: + if b.name==name: + x=b.cx; y=b.cy+p2 + pygame.mouse.set_pos(x,y); g.pos=(x,y) + +# eg1 buttons.on('plus') +# eg2 buttons.on(['plus','times']) +def on(name): + if type(name)==type('a'): + list1=[]; list1.append(name) + else: + list1=name + for b in Button._instances: + if b.name in list1: b.active=True + +# eg1 buttons.off('plus') +# eg2 buttons.off(['plus','times']) +def off(name): + if type(name)==type('a'): + list1=[]; list1.append(name) + else: + list1=name + for b in Button._instances: + if b.name in list1: b.active=False + diff --git a/data/1.png b/data/1.png new file mode 100755 index 0000000..d809c57 --- /dev/null +++ b/data/1.png Binary files differ diff --git a/data/10.png b/data/10.png new file mode 100755 index 0000000..874aec2 --- /dev/null +++ b/data/10.png Binary files differ diff --git a/data/11.png b/data/11.png new file mode 100755 index 0000000..624a619 --- /dev/null +++ b/data/11.png Binary files differ diff --git a/data/12.png b/data/12.png new file mode 100755 index 0000000..374b4ab --- /dev/null +++ b/data/12.png Binary files differ diff --git a/data/13.png b/data/13.png new file mode 100755 index 0000000..a1e3903 --- /dev/null +++ b/data/13.png Binary files differ diff --git a/data/14.png b/data/14.png new file mode 100755 index 0000000..1ef3e38 --- /dev/null +++ b/data/14.png Binary files differ diff --git a/data/2.png b/data/2.png new file mode 100755 index 0000000..ba74d1c --- /dev/null +++ b/data/2.png Binary files differ diff --git a/data/3.png b/data/3.png new file mode 100755 index 0000000..3827fed --- /dev/null +++ b/data/3.png Binary files differ diff --git a/data/4.png b/data/4.png new file mode 100755 index 0000000..6e29e2f --- /dev/null +++ b/data/4.png Binary files differ diff --git a/data/5.png b/data/5.png new file mode 100755 index 0000000..bd4c28d --- /dev/null +++ b/data/5.png Binary files differ diff --git a/data/6.png b/data/6.png new file mode 100755 index 0000000..15067b1 --- /dev/null +++ b/data/6.png Binary files differ diff --git a/data/7.png b/data/7.png new file mode 100755 index 0000000..21548bf --- /dev/null +++ b/data/7.png Binary files differ diff --git a/data/8.png b/data/8.png new file mode 100755 index 0000000..8205f76 --- /dev/null +++ b/data/8.png Binary files differ diff --git a/data/9.png b/data/9.png new file mode 100755 index 0000000..7cc120b --- /dev/null +++ b/data/9.png Binary files differ diff --git a/data/back_down.png b/data/back_down.png new file mode 100755 index 0000000..1da7008 --- /dev/null +++ b/data/back_down.png Binary files differ diff --git a/data/back_up.png b/data/back_up.png new file mode 100755 index 0000000..2023b80 --- /dev/null +++ b/data/back_up.png Binary files differ diff --git a/data/fast.png b/data/fast.png new file mode 100755 index 0000000..f638c00 --- /dev/null +++ b/data/fast.png Binary files differ diff --git a/data/glow/1.png b/data/glow/1.png new file mode 100755 index 0000000..517b396 --- /dev/null +++ b/data/glow/1.png Binary files differ diff --git a/data/glow/10.png b/data/glow/10.png new file mode 100755 index 0000000..07cf282 --- /dev/null +++ b/data/glow/10.png Binary files differ diff --git a/data/glow/11.png b/data/glow/11.png new file mode 100755 index 0000000..75aa9ed --- /dev/null +++ b/data/glow/11.png Binary files differ diff --git a/data/glow/12.png b/data/glow/12.png new file mode 100755 index 0000000..e1c84b2 --- /dev/null +++ b/data/glow/12.png Binary files differ diff --git a/data/glow/13.png b/data/glow/13.png new file mode 100755 index 0000000..991db74 --- /dev/null +++ b/data/glow/13.png Binary files differ diff --git a/data/glow/14.png b/data/glow/14.png new file mode 100755 index 0000000..fa382e9 --- /dev/null +++ b/data/glow/14.png Binary files differ diff --git a/data/glow/2.png b/data/glow/2.png new file mode 100755 index 0000000..d0244c6 --- /dev/null +++ b/data/glow/2.png Binary files differ diff --git a/data/glow/3.png b/data/glow/3.png new file mode 100755 index 0000000..56bee60 --- /dev/null +++ b/data/glow/3.png Binary files differ diff --git a/data/glow/4.png b/data/glow/4.png new file mode 100755 index 0000000..5eec50a --- /dev/null +++ b/data/glow/4.png Binary files differ diff --git a/data/glow/5.png b/data/glow/5.png new file mode 100755 index 0000000..f05510c --- /dev/null +++ b/data/glow/5.png Binary files differ diff --git a/data/glow/6.png b/data/glow/6.png new file mode 100755 index 0000000..4e83d68 --- /dev/null +++ b/data/glow/6.png Binary files differ diff --git a/data/glow/7.png b/data/glow/7.png new file mode 100755 index 0000000..7241602 --- /dev/null +++ b/data/glow/7.png Binary files differ diff --git a/data/glow/8.png b/data/glow/8.png new file mode 100755 index 0000000..888dd7a --- /dev/null +++ b/data/glow/8.png Binary files differ diff --git a/data/glow/9.png b/data/glow/9.png new file mode 100755 index 0000000..ade2c0a --- /dev/null +++ b/data/glow/9.png Binary files differ diff --git a/data/glowy/1.png b/data/glowy/1.png new file mode 100755 index 0000000..9bdb579 --- /dev/null +++ b/data/glowy/1.png Binary files differ diff --git a/data/glowy/10.png b/data/glowy/10.png new file mode 100755 index 0000000..6ff6261 --- /dev/null +++ b/data/glowy/10.png Binary files differ diff --git a/data/glowy/11.png b/data/glowy/11.png new file mode 100755 index 0000000..e04a6d2 --- /dev/null +++ b/data/glowy/11.png Binary files differ diff --git a/data/glowy/12.png b/data/glowy/12.png new file mode 100755 index 0000000..fa8948e --- /dev/null +++ b/data/glowy/12.png Binary files differ diff --git a/data/glowy/13.png b/data/glowy/13.png new file mode 100755 index 0000000..cedc13c --- /dev/null +++ b/data/glowy/13.png Binary files differ diff --git a/data/glowy/14.png b/data/glowy/14.png new file mode 100755 index 0000000..e1b3108 --- /dev/null +++ b/data/glowy/14.png Binary files differ diff --git a/data/glowy/2.png b/data/glowy/2.png new file mode 100755 index 0000000..fbd013c --- /dev/null +++ b/data/glowy/2.png Binary files differ diff --git a/data/glowy/3.png b/data/glowy/3.png new file mode 100755 index 0000000..a01c739 --- /dev/null +++ b/data/glowy/3.png Binary files differ diff --git a/data/glowy/4.png b/data/glowy/4.png new file mode 100755 index 0000000..15a29e0 --- /dev/null +++ b/data/glowy/4.png Binary files differ diff --git a/data/glowy/5.png b/data/glowy/5.png new file mode 100755 index 0000000..f52cd4c --- /dev/null +++ b/data/glowy/5.png Binary files differ diff --git a/data/glowy/6.png b/data/glowy/6.png new file mode 100755 index 0000000..317f1e9 --- /dev/null +++ b/data/glowy/6.png Binary files differ diff --git a/data/glowy/7.png b/data/glowy/7.png new file mode 100755 index 0000000..aca8192 --- /dev/null +++ b/data/glowy/7.png Binary files differ diff --git a/data/glowy/8.png b/data/glowy/8.png new file mode 100755 index 0000000..c68b0d7 --- /dev/null +++ b/data/glowy/8.png Binary files differ diff --git a/data/glowy/9.png b/data/glowy/9.png new file mode 100755 index 0000000..4316d54 --- /dev/null +++ b/data/glowy/9.png Binary files differ diff --git a/data/green_down.png b/data/green_down.png new file mode 100755 index 0000000..645684c --- /dev/null +++ b/data/green_down.png Binary files differ diff --git a/data/green_up.png b/data/green_up.png new file mode 100755 index 0000000..2dc5b20 --- /dev/null +++ b/data/green_up.png Binary files differ diff --git a/data/ladder.png b/data/ladder.png new file mode 100755 index 0000000..67bd7b6 --- /dev/null +++ b/data/ladder.png Binary files differ diff --git a/data/man.png b/data/man.png new file mode 100755 index 0000000..2a519ac --- /dev/null +++ b/data/man.png Binary files differ diff --git a/data/pointer.png b/data/pointer.png new file mode 100755 index 0000000..7fceb06 --- /dev/null +++ b/data/pointer.png Binary files differ diff --git a/data/slow.png b/data/slow.png new file mode 100755 index 0000000..e6d3a2a --- /dev/null +++ b/data/slow.png Binary files differ diff --git a/data/star.png b/data/star.png new file mode 100755 index 0000000..506bb48 --- /dev/null +++ b/data/star.png Binary files differ diff --git a/data/wrong.png b/data/wrong.png new file mode 100755 index 0000000..10701d3 --- /dev/null +++ b/data/wrong.png Binary files differ diff --git a/data/xo.png b/data/xo.png new file mode 100755 index 0000000..c272e68 --- /dev/null +++ b/data/xo.png Binary files differ diff --git a/g.py b/g.py new file mode 100755 index 0000000..4233b0b --- /dev/null +++ b/g.py @@ -0,0 +1,127 @@ +# g.py - globals +import pygame,utils,random,imgClick + +app='Follow Me'; ver='1.0' +ver='1.1' +# new bgd +# ladder +ver='1.2' +# scaled font @ imgf +# man on ladder +# green bgd -> new buttons +ver='1.3' +# star separate & left @ top +ver='1.4' #<<<< Release 3 +# added magician pic +ver='1.5' +# magician -> object +# speed slider +# change green button colour +ver='1.5' +# rationalised g.py +# no Esc on XO +# simon.py - delay also controlled by slider +# save level +ver='2.0' +# sugar coated +# got this to work ok BUT cursor flickers +ver='2.1' +# added journal switch +# swapped me & grapes +# added version display for right click +ver='2.2' +# cf Boxes +ver='2.3' +# app title +ver='2.4' +# yellow glow for player & longer +# increased glow size +# random seed +ver='3.0' +# redraw implemented +ver='4.0' +# new sugar cursor etc +ver='21' +# bigger white glow +# no pointer or rectangle while leading +ver='22' +# flush_queue() doesn't use gtk on non-XO + +UP=(264,273) +DOWN=(258,274) +LEFT=(260,276) +RIGHT=(262,275) +CROSS=(259,120) +CIRCLE=(265,111) +SQUARE=(263,32) +TICK=(257,13) + +def init(): # called by main() + random.seed() + global redraw + global screen,w,h,font1,font2,clock,click_snd + global factor,offset,imgf,message,version_display + global pos,pointer + redraw=True + version_display=False + screen = pygame.display.get_surface() + pygame.display.set_caption(app) + screen.fill((70,0,70)) + pygame.display.flip() + w,h=screen.get_size() + if float(w)/float(h)>1.5: #widescreen + offset=(w-4*h/3)/2 # we assume 4:3 - centre on widescreen + else: + h=int(.75*w) # allow for toolbar - works to 4:3 + offset=0 + clock=pygame.time.Clock() + factor=float(h)/24 # measurement scaling factor (32x24 = design units) + offset=(w-4*h/3)/2 # we assume 4:3 - centre on widescreen + imgf=float(h)/900 # image scaling factor - all images built for 1200x900 + if pygame.font: + t=int(54*imgf); font1=pygame.font.Font(None,t) + t=int(48*imgf); font2=pygame.font.Font(None,t) + message='' + pos=pygame.mouse.get_pos() + pointer=utils.load_image('pointer.png',True) + pygame.mouse.set_visible(False) + + # this activity only + global imgs,glow,glowy,wrong_img,man,ladder,star,score + global man_x0,man_y0,man_dx,man_dy,man_sc_dx,man_sc_dy + global wrong,player_n,best,level + global max_w,max_h,green + wrong_img=utils.load_image('wrong.png',True); wrong_ind=0; right_ind=0 + man=utils.load_image('man.png',True) + man_x0=sx(25.5); man_y0=sy(18.31) + man_dx=(sx(27.87)-man_x0)/11.0; man_dy=(sy(12.15)-man_y0)/11.0 + man_sc_dx=sx(25.38)-man_x0; man_sc_dy=sy(18.61)-man_y0 + ladder=utils.load_image('ladder.png',True) + star=utils.load_image('star.png',True) + cy=sy(3.2); dx=sy(6.4); dy=sy(6.2); i=1 + score=0; best=0; level=1 + imgs=[]; glow=[]; glowy=[]; max_w=0; max_h=0 + for r in range(1,4): + cx=sx(3.2) + for c in range(1,6): + img=utils.load_image(str(i)+'.png',True) + imgC=imgClick.ImgClick(img,(cx,cy),True) + if imgC.w>max_w: max_w=imgC.w + if imgC.h>max_h: max_h=imgC.h + imgs.append(imgC) + glow.append(utils.load_image(str(i)+'.png',True,'glow')) + glowy.append(utils.load_image(str(i)+'.png',True,'glowy')) + cx+=dx; i+=1 + if i==15: break + cy+=dy + player_n=0 # player click counter + wrong=False + green=0 + imgs[green].mouse_set() + +def sx(f): # scale x function + return int(f*factor+offset+.5) + +def sy(f): # scale y function + return int(f*factor+.5) + diff --git a/imgClick.py b/imgClick.py new file mode 100755 index 0000000..707ab86 --- /dev/null +++ b/imgClick.py @@ -0,0 +1,27 @@ +#imgClick.py +# eg click_img=ImgClickClass(img,(x,y)) (x,y)=top left +# if click_img.mouse_on(): +# click_img.draw(gscreen) + +import g,pygame + +class ImgClick: # for clickable images + def __init__(self,img,(x1,y1),centre=False): + w=img.get_width();h=img.get_height();x=x1;y=y1 + if centre: x=x-w/2; y=y-h/2; self.cx=x1; self.cy=y1 + else: self.cx=x+w/2; self.cy=y+h/2 + self.rect=pygame.Rect(x,y,w,h) + self.x=x; self.y=y; self.img=img + self.w=w; self.h=h + + + def mouse_on(self): + return self.rect.collidepoint(g.pos) + + def draw(self,screen): + screen.blit(self.img,(self.x,self.y)) + + def mouse_set(self): + pygame.mouse.set_pos((self.cx,self.cy)) + g.pos=(self.cx,self.cy) + diff --git a/load_save.py b/load_save.py new file mode 100755 index 0000000..33d1265 --- /dev/null +++ b/load_save.py @@ -0,0 +1,26 @@ +#load_save.py +import g + +loaded=[] # list of strings + +def load(f): + global loaded + try: + for line in f.readlines(): + loaded.append(line) + except: + pass + +def save(f): + f.write(str(g.best)+'\n') + f.write(str(g.level)+'\n') + +# note need for rstrip() on strings +def retrieve(): + global loaded + if len(loaded)>1: + g.best=int(loaded[0]) + g.level=int(loaded[1]) + + + diff --git a/rc_skip_last.py b/rc_skip_last.py new file mode 100755 index 0000000..6557039 --- /dev/null +++ b/rc_skip_last.py @@ -0,0 +1,46 @@ +# rc.py + +class RC(): + def __init__(self,nr,nc): + self.nr=nr; self.nc=nc + + def inc_r(self,ind): + r,c=self.row_col(ind) + r+=1 + if r==self.nr: r=0 + if r==(self.nr-1) and c==(self.nc-1): r=0 + return self.indx(r,c) + + def dec_r(self,ind): + r,c=self.row_col(ind) + r-=1 + if r<0: r=self.nr-1 + if r==(self.nr-1) and c==(self.nc-1): r=self.nr-2 + return self.indx(r,c) + + def inc_c(self,ind): + r,c=self.row_col(ind) + c+=1 + if c==self.nc: c=0 + if r==(self.nr-1) and c==(self.nc-1): c=0 + return self.indx(r,c) + + def dec_c(self,ind): + r,c=self.row_col(ind) + c-=1 + if c<0: c=self.nc-1 + if r==(self.nr-1) and c==(self.nc-1): c=self.nc-2 + return self.indx(r,c) + + def row_col(self,ind): + i=0 + for r in range(self.nr): + for c in range(self.nc): + if i==ind: return r,c + i+=1 + + def indx(self,r,c): + return r*self.nc+c + + + diff --git a/setup.py b/setup.py new file mode 100755 index 0000000..77fda74 --- /dev/null +++ b/setup.py @@ -0,0 +1,4 @@ +#!/usr/bin/env python +from sugar.activity import bundlebuilder +if __name__ == "__main__": + bundlebuilder.start() diff --git a/simon.py b/simon.py new file mode 100755 index 0000000..4633ab4 --- /dev/null +++ b/simon.py @@ -0,0 +1,65 @@ +# simon.py +import g,pygame,random,utils + +class Simon: # most methods only used by aim instance + + def __init__(self,glow_time): + self.glow_time=glow_time; self.list1=[] + self.running=False; self.ind=0; self.started=False + self.glow_active=False + self.delay=1000 # between item displays - only used by aim instance + + def new1(self): + self.list1=[]; self.inc(); self.started=False + + def do(self): + if self.glow_active: + d=pygame.time.get_ticks()-self.glow_ms + if d<0 or d>=self.glow_time: + self.glow_active=False; g.redraw=True + if self.running and not self.glow_active: + d=pygame.time.get_ticks()-self.ms + if d<0 or d>=self.delay: # time to display + g.redraw=True + self.glow_start(self.list1[self.ind]); self.ind+=1 + self.ms=pygame.time.get_ticks()+self.glow_time + if self.ind==len(self.list1): self.running=False + + def inc(self): + while True: # don't allow double at the start + r=random.randint(0,len(g.imgs)-1) + if self.list1==[]: break + if len(self.list1)>1: break + if r<>self.list1[0]: break + #if len(self.list1)>1: r=self.list1[0]+1 ### + self.list1.append(r) + self.play(); self.started=True + + def play(self): # delayed start + self.running=True; self.ind=0 + self.ms=pygame.time.get_ticks() + + def start(self): # immediate start + self.running=True; self.ind=0 + self.ms=pygame.time.get_ticks()-self.delay + + def glow(self,y=False): + if self.glow_active: + ind=self.glow_ind + cx=g.imgs[ind].cx; cy=g.imgs[ind].cy + img=g.glow[ind] + if y: img=g.glowy[ind] + utils.centre_blit(g.screen,img,(cx,cy)) + + def glow_start(self,ind): + self.glow_ms=pygame.time.get_ticks() + self.glow_active=True + self.glow_ind=ind + + def glow_off(self): + self.glow_active=False + + + + + diff --git a/slider.py b/slider.py new file mode 100755 index 0000000..8968e6f --- /dev/null +++ b/slider.py @@ -0,0 +1,55 @@ +# slider.py +import utils,pygame,g,copy + +# sets g.level 1..steps +class Slider: + def __init__(self,cx,cy,steps,colour=utils.BLACK): + self.easy=utils.load_image('slow.png',True) + self.hard=utils.load_image('fast.png',True) + self.xo=utils.load_image('xo.png',True) + iw=self.hard.get_width(); ih=self.hard.get_height() + w=g.sy(16); w2=w/2; h2=ih/2 + self.x1=cx-w2; self.y=cy-h2; self.x2=cx+w2-iw + x=cx-w2+iw*1.2; w=w-2*iw*1.2; h=g.sy(.12);y=cy+g.sy(.34) + self.rect=pygame.Rect(x,y,w,h) + mh=g.sy(1);self.mark=pygame.Rect(x,y-mh/2+h/2,h,mh) + self.steps=steps; self.dx=w/(steps-1);self.colour=colour + self.cx=cx; self.cy=cy + marks=[]; x=self.rect.left; click_rects=[]; dx=self.dx + for i in range(self.steps): + rect=copy.copy(self.mark); rect.left=x-5; rect.width=10; marks.append(rect) + click_rect=pygame.Rect(x-dx/2,self.mark.top,dx,self.mark.h) + click_rects.append(click_rect) + x+=dx + self.marks=marks; self.click_rects=click_rects + + def draw(self): + g.screen.blit(self.easy,(self.x1,self.y)); + g.screen.blit(self.hard,(self.x2,self.y)) + pygame.draw.rect(g.screen,self.colour,self.rect) # horizontal line + x=self.rect.left # now draw marks + for i in range(self.steps): + self.mark.left=x; pygame.draw.rect(g.screen,self.colour,self.mark) + if i==(g.level-1): + dx=self.xo.get_width()/2; dy=self.xo.get_height()/2 + g.screen.blit(self.xo,(x-dx+self.mark.w/2,self.cy-dy)) + x+=self.dx + + def mouse(self): + mx,my=g.pos + rect=self.easy.get_rect(topleft=(self.x1,self.y)) + if rect.collidepoint(mx,my): + if g.level>1: g.level-=1; return True#**** + rect=self.hard.get_rect(topleft=(self.x2,self.y)) + if rect.collidepoint(mx,my): + if g.level.1: # only scale if factor <> 1 + w=img.get_width(); h=img.get_height() + try: + img=pygame.transform.smoothscale(img,(int(g.imgf*w),int(g.imgf*h))) + except: + img=pygame.transform.scale(img,(int(g.imgf*w),int(g.imgf*h))) + return img + +# eg new_list=copy_list(old_list) +def copy_list(l): + new_list=[];new_list.extend(l) + return new_list + +def shuffle(lst): + l1=lst; lt=[] + for i in range(len(lst)): + ln=len(l1); r=random.randint(0,ln-1); + lt.append(lst[r]); l1.remove(lst[r]) + return lt + +def centre_blit(screen,img,(cx,cy),angle=0): # rotation is clockwise + img1=img + if angle!=0: img1=pygame.transform.rotate(img,-angle) + rect=img1.get_rect() + screen.blit(img1,(cx-rect.width/2,cy-rect.height/2)) + +def text_blit(screen,s,font,(cx,cy),(r,g,b)): + text=font.render(s,True,(0,0,0)) + rect=text.get_rect(); rect.centerx=cx+2; rect.centery=cy+2 + screen.blit(text,rect) + text=font.render(s,True,(r,g,b)) + rect=text.get_rect(); rect.centerx=cx; rect.centery=cy + screen.blit(text,rect) + return rect + +def text_blit1(screen,s,font,(x,y),(r,g,b)): + text=font.render(s,True,(r,g,b)) + rect=text.get_rect(); rect.x=x; rect.y=y + screen.blit(text,rect) + +# m is the message +# d is the # of pixels in the border around the text +# (cx,cy) = co-ords centre - (0,0) means use screen centre +def message(screen,font,m,(cx,cy)=(0,0),d=20): + if m!='': + if pygame.font: + text=font.render(m,True,(255,255,255)) + shadow=font.render(m,True,(0,0,0)) + rect=text.get_rect() + if cx==0: cx=screen.get_width()/2 + if cy==0: cy=screen.get_height()/2 + rect.centerx=cx;rect.centery=cy + bgd=pygame.Surface((rect.width+2*d,rect.height+2*d)) + bgd.fill((0,255,255)) + bgd.set_alpha(128) + screen.blit(bgd,(rect.left-d,rect.top-d)) + screen.blit(shadow,(rect.x+2,rect.y+2,rect.width,rect.height)) + screen.blit(text,rect) + +def mouse_on_img(img,(x,y)): # x,y=top left + w=img.get_width() + h=img.get_height() + mx,my=g.pos + if mx(x+w): return False + if my(y+h): return False + try: # in case out of range + col=img.get_at((int(mx-x),int(my-y))) + except: + return False + if col[3]<10: return False + return True + +def mouse_on_img1(img,(cx,cy)): + xy=centre_to_top_left(img,(cx,cy)) + return mouse_on_img(img,xy) + +def mouse_on_img_rect(img,(cx,cy)): + w2=img.get_width()/2; h2=img.get_height()/2 + x1=cx-w2; y1=cy-h2; x2=cx+w2; y2=cy+h2 + return mouse_in(x1,y1,x2,y2) + +def mouse_in(x1,y1,x2,y2): + mx,my=g.pos + if x1>mx: return False + if x2my: return False + if y2None: + outline=outline_font.render(str(n),True,BLACK) + centre_blit(g.screen,outline,(cx,cy)) + centre_blit(g.screen,text,(cx,cy)) + +def display_number1(n,(x,cy),font,colour=BLACK): + if pygame.font: + text=font.render(str(n),True,colour) + y=cy-text.get_height()/2 + g.screen.blit(text,(x,y)) + +def top_left_to_centre(img,(x,y)): + cx=x+img.get_width()/2; cy=y+img.get_height()/2 + return (cx,cy) + +def centre_to_top_left(img,(cx,cy)): + x=cx-img.get_width()/2; y=cy-img.get_height()/2 + return (x,y) + + + -- cgit v0.9.1