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()


blog comments powered by Disqus