#~ /*************************************************************************** #~ * soundNpic.py #~ * #~ * Fri Oct 22 09:08:36 2004 #~ * Copyright 2004 Stas #~ * stas@linux.isbeter.nl #~ ****************************************************************************/ # # 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 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, write to the Free Software Foundation, # 675 Mass Ave, Cambridge, MA 02139, USA. # RCFILE = 0 import os,sys,operator,random import pygame from pygame.constants import * from utils import load_image,load_sound,MyError,get_files class Img: pass class Snd: pass class PicSnd: def __init__(self,pic,snd,move,start,end): self.snd = snd self.image = pic self.original = pic self.move = -move self.orgmove = move self.end = end self.start = start self.count = start[1] self.rect = self.image.get_rect().move(start) self.dizzy = 0 self.flag = 0 def update(self): if self.dizzy: self._spin() else: self._updown() self.count += self.move return self.flag def _updown(self): self.flag = 0 self.rect = self.rect.move(0,self.move) if self.count <= self.end[1]: self.count = self.start[1] self.dizzy = 1 if self.rect[1] >= self.start[-1]: self.rect = self.image.get_rect().move(self.start) self.move = -self.orgmove self.count = self.start[1] self.flag = 1 def _spin(self): # Copy of the spin in pygame chimp, and a little bit of me center = self.rect.center self.dizzy = self.dizzy + 12 #print self.dizzy,self.count,self.move if self.dizzy >= 360: self.dizzy = 0 self.image = self.original self.move = -self.move/3 self.count = self.end[1] #print self.move else: self.image = pygame.transform.rotate(self.original, self.dizzy) self.rect = self.image.get_rect() self.rect.center = center # Not used def erase(self): self.rect = Img.screen.blit(Img.backgr,self.rect,self.rect) class Game(Img,Snd): """ soundNpic.py - part of childsplay.py, a suite of educational games for young children.""" def __init__(self,screen,backgr,rcdic,basepath,libdir): Img.screen = screen Img.backgr = backgr self.gamelevels = ('Level1',) self.gameitems = (1,) self.rcdic = rcdic self.basedir = basepath self.libdir = libdir self.stop = 0 self.score = 0 self._setup() def _setup(self): self.objs_to_move = [] def start(self,level,i): """Hit a image and listen to the sound, it doesn't do much more, for now""" try: wavfiles = get_files(os.path.join(self.libdir,'SoundNpicData',level),'*.ogg') except MyError,info: MyError.line = 110 MyError.name = __name__ raise MyError,info # loose the .ogg filenames = map(operator.getslice,wavfiles,(0,)*len(wavfiles),(-4,)*len(wavfiles)) objlist = [] self.objdict = {} self.rectlist = [] x = 10 offset = 10 y = 325 random.shuffle(filenames) try: for item in filenames: img = load_image(os.path.join(self.libdir,'SoundNpicData',level,item+'.png'),1) snd = os.path.join(self.libdir,'SoundNpicData',level,item+'.ogg') obj = PicSnd(img,snd,12,(x,y),(x,y-250)) objlist.append((obj)) x = x + obj.image.get_width()+ offset except MyError,info: MyError.line = 'method start()' MyError.name = __name__ raise MyError,info for obj in objlist: r = self.screen.blit(obj.image,obj.rect) self.objdict[tuple(r)] = obj self.rectlist.append((r)) pygame.display.update(self.rectlist) def loop(self,events): for event in events: if event.type is MOUSEBUTTONDOWN and self.objs_to_move == []: self._select_activate() obj_remove,dirty_rects = [],[] # main blit stuff for obj in self.objs_to_move: dirty_rects.append((self.screen.blit(self.backgr,obj.rect,obj.rect))) flag = obj.update() dirty_rects.append((self.screen.blit(obj.image,obj.rect))) if flag == 1: # obj returns 1 if finished obj_remove.append((obj)) pygame.display.update(dirty_rects) if obj_remove: self.objs_to_move.pop() return self.stop,self.score def _select_activate(self): pos = pygame.Rect(pygame.mouse.get_pos() + (4,4)) for rec in self.rectlist: if rec.contains(pos): obj = self.objdict[tuple(rec)] # Set up sound events playmusic = pygame.mixer.music try: file = obj.snd playmusic.load(file) except pygame.error,info: print >> sys.stderr,info,"\nDisable music" class NoneSound: def play(self,loop=None): pass playmusic = NoneSound() playmusic.play(2) self.objs_to_move.append((obj)) return def helptitle(self): return 'SoundNpic' def __str__(self): """Must return the original, not translated, title of this game. It's needed by the high score class of childsplay.""" return "SoundNpic" def help(self): text = [_("The aim of the game:"), _("Click on a picture and listen to the sound."), " ", _("Difficulty : 2-3 years"), " ", _("Number of levels : 1"), " ", _("Due to the size of the module, mostly pictures and sounds, it's"), _("split in separate modules instead of levels.")] return text