Pysoya: menú de ejemplo
Dependencias: python-soya
Os dejo aquí una prueba que estoy haciendo de soya. Es una librería 3D libre para python en la que se programa a lo python (no os dejéis engañar por el código). Está hecho al vuelo en unas 4 horas.
Refinaré el código, ya que cuando empecé con él, no tenía ni idea de cómo iba soya :(
Así que aquí lo dejo. Como ya sabréis, en opengl en GNU no se puede usar WGL para poner fuentes en 3D.
La idea es que cada letra del menú sea independiente para poder hacer todo tipo de efectos en 3d, desde ondas y demás. Ahora mismo he puesto MUY MUY MUY a lo guarro un seno asociado al item seleccionado.
No, no hace nada más aun, incluso hay que salir con CTRL-C, pero en un día más lo tengo correcto.
¿Hacemos el taeko como primer objetivo? En una semana lo tenemos, en dos a lo sumo.
Yo ahora tengo un poco más de tiempo, pero en no mucho vuelvo a España, así que no podré hacer nada. Venga, que alguien se anime.
Copiad y pegad y mirad un poco para ver cómo funciona soya y cómo NO hay que programar jamás en python.
Un saludo!
# brue (C) 2007 # GPLv2 import soya import soya.label3d import math ########################################### X_POS = -0.5 Y_POS = 0.9 Z_POS = -1 X_SEP = 0.15 Y_SEP = -0.35 Z_CAM = 1.5 opciones = ["JUGAR", "SALIR","OPCION 3", "OPCION 4", "OP5"] ########################################### class onechar(soya.Body): def __init__(self, world, c, x, y, z): self.x = x self.y = y self.z = z self.value = c self.rend = soya.label3d.Label3D(world, c) self.rend.set_xyz(x, y, z) self.rend.lit = 0 soya.Body.__init__(self, world) def get_pos(self): return (self.x,self.y,self.z) def set_pos(self, x, y, z): self.x = x self.y = y self.z = z self.rend.set_xyz(x, y, z) def get_value(self): return self.value def set_value(self, c): self.value = c def debug(self): print self.get_value(), "->", self.get_pos() print "+++" class onestring: def __init__(self, world, s, x, y, z, sep, sel=0): self.x = x self.y = y self.z = z self.selected=sel self.str = [] self.sep = sep count = 0 for c in s: self.str.append(onechar(world, c, self.x+(self.sep*count), self.y, self.z)) count = count + 1 def get_pos(self): return (self.x,self.y, self.z) def test_anim(self): for c in self.str: c.set_pos(c.get_pos[0],c.get_pos[1],c.get_pos[2]+0.01) def set_pos(self, x, y, z): count = 0 for c in self.str: c.set_pos(x+(self.sep*count),y,z) count = count + 1 def length(self): return len(self.str) def get_value(self): rstr = [] for c in self.str: rstr.append(c.get_value()) return rstr def set_value(self, s): self.str = [] count = 0 for c in s: newchar = onechar(c, self.x+(self.sep*count), self.y, self.z) self.str.append(newchar) count = count + 1 def set_selected(self): self.selected = 1 def unset_selected(self): self.selected = 0 def selected(self): return self.selected def debug(self): for i in self.str: print i.debug() print "----" class menu_obj(soya.Body): def __init__(self, world, l, x,y,z, xsep, ysep): self.m = [] self.xsep = xsep self.ysep = ysep self.mx = x self.my = y self.mz = z self. sel_index = 0 count=0 self.incre=0 for c in l: self.m.append(onestring(world,c,x,y+(ysep*count),z,xsep)) count = count + 1 self.m[0].set_selected() soya.Body.__init__(self, world) def reset(self): self.m = [] def select(self, i): for os in self.m: os.unset_selected() self.m[i].set_selected() self.sel_index = i def reset_c(self, c, ind): cont = 0 for carma in c: carma.set_pos(X_POS+(cont*X_SEP),Y_POS+(ind*Y_SEP),Z_POS) cont = cont + 1 def advance_time(self, proportion): soya.Body.advance_time(self, proportion) if self.incre== 1: self.incre = -1 for c in self.m[self.sel_index].str: c.rend.add_mul_vector(proportion,soya.Vector(self,0,0,((math.sin(self.incre))*0.01))) self.incre = self.incre + 0.1 for event in soya.process_event(): if event[0] == soya.sdlconst.MOUSEMOTION: self.mouse_posy = event[2] y_total = len(opciones)*Y_SEP for i in range(len(opciones)): current_y = camera.coord3d_to_2d(soya.Point(self,X_POS+0.1,Y_POS+(i*Y_SEP),Z_POS))[1] current_y_n = camera.coord3d_to_2d(soya.Point(self,X_POS+0.1,Y_POS+((i+1)*Y_SEP),Z_POS))[1] print "i:", i ,"-",current_y, "hasta ", current_y_n print self.mouse_posy if (self.mouse_posy > current_y) and (self.mouse_posy < current_y_n) and (i != self.sel_index): self.reset_c(self.m[self.sel_index].str,self.sel_index) self.sel_index=i def debug(self): for s in self.m: print s.debug() if __name__ == "__main__": soya.init() scene = soya.World() menu = menu_obj(scene, opciones ,X_POS,Y_POS,Z_POS,X_SEP,Y_SEP) camera = soya.Camera(scene) camera.z = Z_CAM camera.fov = 100.0 soya.set_root_widget(camera) print "---mainloop---" soya.MainLoop(scene).main_loop()
[ show comments ]
blog comments powered by Disqus