import appuifw, e32, key_codes, graphics, random,audio from graphics import Image try: import sensor from sensor import orientation SENSOR = True except ImportError: SENSOR = False class Tiro: def __init__(self,x,y): self.y =y-10 self.x =x-20 self.img=0 self.cantImg =3 def update(self): t.y += 5 def incImg(self): self.img+=1 if self.img == self.cantImg: self.img=0 class Enemigo: def __init__(self,x,y,v): self.y =y self.x =x self.img=0 self.cantImg =4 self.velocidad =v def update(self): self.y-=self.velocidad def incImg(self): self.img+=1 if self.img == self.cantImg: self.img=0 class Explosion: def __init__(self,x,y): self.y =y self.x =x self.img=0 self.cantImg =4 def update(self): pass def incImg(self): self.img+=1 if self.img > self.cantImg: self.img=4 #constantes WHITE = (255,255,255) RED = (255,0,0) BLUE = (0,0,255) YELLOW = (255,255,0) GREEN = (127,255,0) posXenemigos =[-5,-50,-100,-100,-185] #variables Globales running = True x = -100 y = -270 img = None fondoImg = None fondoImg2= None nave1Img = None nave1Img = None img = None mask_nave1Img = None tiroImgs = [] tiroMasks = [] tiros=[] enemigoImgs =[] enemigoMacks=[] enemigos=[] explosionImgs = [] explosionMasks=[] explosiones =[] puntos=0 punto=2 restaPorNave=2 restaPorTiro=1 puntosAnt=0 velocidad=1 dirControl=1 # para cambiar de direccion el sensor para jugar con la TV. sonido =-1 sonidoDeDisparo=None def automask(im): width, height = im.size mask = Image.new(im.size, '1') # black and white tran = im.getpixel((0,0))[0] # transparent top-left for y in range(height): line = im.getpixel([(x, y) for x in range(width)]) for x in range(width): if line[x] == tran: mask.point((x,y), 0) # mask on the point return mask def dibujarTexto(p): img.text((10,9), u'Puntos:'+unicode(str(p)), fill = RED) def dibujarNave(x,y): img.blit(nave1Img,(x,y),(0,0),mask=mask_nave1Img) def dibujarTiros(): global puntos,restaPorTiro contadorDeTirosFuera = 0 for t in tiros: img.blit(tiroImgs[t.img],(t.x,t.y),(0,0),mask=tiroMasks[t.img]) t.incImg() if t.y > -10: contadorDeTirosFuera +=1 for i in range(contadorDeTirosFuera): tiros.pop() puntos -=restaPorTiro def dibujarEnemigos(): global puntos,velocidad,restaPorNave contadorDeEnemigosFuera = 0 inx = random.randint(0,4) for e in enemigos: img.blit(enemigoImgs[e.img],(e.x,e.y),(0,0),mask=enemigoMasks[e.img]) e.incImg() if e.y < -290: contadorDeEnemigosFuera +=1 for i in range(contadorDeEnemigosFuera): enemigos.pop() enemigos.insert(0,Enemigo(posXenemigos[inx%5],-10, velocidad)) inx =+1 puntos -=restaPorNave def dibujarExplosion(): cOut = 0 for e in explosiones: img.blit(explosionImgs[e.img],(e.x,e.y),(0,0),mask=explosionMasks[e.img]) e.incImg() if e.img == e.cantImg: cOut +=1 for i in range(cOut): explosiones.pop() def handle_redraw(rect): if img: canvas.blit(img) def controlColiciones(): global puntos,velocidad,punto global x,y ie=0 eliminarTiros =[] eliminarEnemigos =[] for e in enemigos: it=0; for t in tiros: if ((t.y > e.y-50) and (t.y < e.y)) and ((t.x > e.x-50) and (t.x < e.x)): explosiones.insert(0,Explosion(e.x,e.y)) eliminarTiros.append(it) eliminarEnemigos.append(ie) it+=1 ie+=1 ie=0 puntosAnt=puntos for e in enemigos: if (e.x < x+25 and e.x> x-25) and (e.y < y+25 and e.y> y-25): eliminarEnemigos.append(ie) explosiones.insert(0,Explosion(e.x,e.y)) puntos=-20 for i in eliminarTiros: try: del tiros[i] except: pass for i in eliminarEnemigos: try: del enemigos[i] except: pass enemigos.insert(0,Enemigo(random.choice(posXenemigos),-10,velocidad)) puntos+=punto if puntos%15 == 0: if len(enemigos) < 6:enemigos.insert(0,Enemigo(random.choice(posXenemigos),-10,velocidad)) velocidad+=1 return puntosAnt def update(): global gameoverImg,fondoImg2,nave1Img,nave2Img,img,puntos,puntosAnt global x,y img.blit(fondoImg2,(0,0),(0,0)) puntosAnt = controlColiciones() dibujarTiros() dibujarEnemigos() dibujarExplosion() dibujarNave(x,y) dibujarTexto(puntos) if puntos < -15: img.blit(gameoverImg,(0,0),(0,0)) img.text((85,200), u'Puntos:'+unicode(str(puntosAnt)), RED,u'LatinPlain30') canvas.blit(img) def salir(): global running running = False def continuar(): global enemigos,posXenemigos,tiros global puntos,puntosAnt,canvas,fondoImg2,img img.blit(fondoImg2,(0,0),(0,0)) canvas.blit(img) inx = random.randint(0,4) enemigos=[] tiros=[] explosiones=[] if puntos!=0: puntos=puntosAnt for i in range(2): enemigos.insert(0,Enemigo(posXenemigos[inx%5],-10,velocidad)) inx =+1 def start(): global velocidad,puntos,puntosAnt velocidad =1 puntos = 0 continuar() def handle_event(event): global x,y,sonidoDeDisparo,sonido ev = event['keycode'] if event['type'] == appuifw.EEventKeyDown: pass if ev == key_codes.EKeySelect and len(tiros) <= 4: tiros.insert(0,Tiro(x,y)) if sonido==1: sonidoDeDisparo.play() def event_sensor(data): global x,dirControl x += dirControl*(data["data_2"]/10) if x < -190: x=-190 if x > 0: x=0 def cambiarDirControl(): global dirControl if dirControl== 1:dirControl=-1 elif dirControl==-1:dirControl= 1 def cambiarSonido(): global sonido if sonido== 1:sonido=-1 elif sonido==-1:sonido= 1 ####################################################################################### canvas = appuifw.Canvas(redraw_callback = handle_redraw,event_callback = handle_event) appuifw.app.body = canvas appuifw.app.screen = 'full' w, h = canvas.size img = graphics.Image.new((w, h)) cargaImg = Image.open(u'E:\\r2_space\\carga.png').resize((w,h)) img.blit(cargaImg,(0,0),(0,0)) canvas.blit(img) appuifw.app.menu = [(u"Nuevo", start), (u"Continuar", continuar), (u"Cambio de Direccion", cambiarDirControl), (u"Sonido", cambiarSonido) ] canvas.rectangle((75,150,90,160),fill=GREEN) # carga de barra de load fondoImg = Image.open(u'E:\\r2_space\\fondo.png') canvas.rectangle((90,150,100,160),fill=GREEN) # carga de barra de load gameoverImg = Image.open(u'E:\\r2_space\\gameover.png').resize((w,h)) sonidoDeDisparo = audio.Sound.open(u'E:\\r2_space\\laser.wav') canvas.rectangle((100,150,110,160),fill=GREEN) # carga de barra de load nave1Img = Image.open(u'E:\\r2_space\\nave1.png') mask_nave1Img = automask(nave1Img) canvas.rectangle((110,150,120,160),fill=GREEN) # carga de barra de load enemigoImgs = [Image.open(u'E:\\r2_space\\enemigo1.png'), Image.open(u'E:\\r2_space\\enemigo2.png'), Image.open(u'E:\\r2_space\\enemigo3.png'), Image.open(u'E:\\r2_space\\enemigo4.png') ] enemigoMasks = [automask(enemigoImgs[0]), automask(enemigoImgs[1]), automask(enemigoImgs[2]), automask(enemigoImgs[3]) ] canvas.rectangle((120,150,130,160),fill=GREEN) # carga de barra de load tiroImgs = [Image.open(u'E:\\r2_space\\tiro1.png'), Image.open(u'E:\\r2_space\\tiro2.png'), Image.open(u'E:\\r2_space\\tiro3.png') ] tiroMasks = [automask(tiroImgs[0]), automask(tiroImgs[1]), automask(tiroImgs[2]) ] canvas.rectangle((130,150,150,160),fill=GREEN) # carga de barra de load explosionImgs = [Image.open(u'E:\\r2_space\\explob1.png').resize((45,45)), Image.open(u'E:\\r2_space\\explob2.png').resize((45,45)), Image.open(u'E:\\r2_space\\explob3.png').resize((45,45)), Image.open(u'E:\\r2_space\\explob4.png').resize((45,45)) ] explosionMasks=[automask(explosionImgs[0]), automask(explosionImgs[1]), automask(explosionImgs[2]), automask(explosionImgs[3]) ] fondoImg2 = fondoImg.resize((w,h)) canvas.rectangle((150,150,170,160),fill=GREEN) # carga de barra de load if SENSOR: sensors = sensor.sensors() if sensors.has_key('AccSensor'): SENSOR_ACC = True sensor_data = sensors['AccSensor'] sensor_acc = sensor.Sensor(sensor_data['id'], sensor_data['category']) sensor_acc.set_event_filter(sensor.EventFilter()) sensor_acc.connect(event_sensor) running = True while running: if puntos >= -15: for t in tiros: t.update() for e in enemigos: e.update() update() e32.ao_yield()