una ayudadita con la animacion?

Consulte acerca de programas, técnicas, algoritmos etc.

una ayudadita con la animacion?

Notapor shackra » Mar Ene 18, 2011 6:41 am

hola! :D

sucede que estoy trabajando en el ejemplo6 sobre el uso de PySFML, actualmente hice una clase a partir de la clase sf.Sprite para trabajar con la animacion y no hacerme bolas... pero, veo que la animacion no es muy... suave que digamos, y bueno, tampoco conozco tecnicas de animacion competentes :-/ (en realidad, este es mi primer proyecto donde hago sprites y los animo mientras se mueven...). aqui les dejo el codigo:

no olviden bajar la imagen si quieren correr el juego...
Imagen

Código: Seleccionar todo
from PySFML import sf
import random, os

class MySprite(sf.Sprite):
    """ extendemos la clase sf.Sprite para dotarla de nuevos atributos y
    funciones que necesitamos para trabajar mas comodamente con los personajes
    de nuestro juego.
    """
    # para este ejemplo solo moveremos la imagen cuando las teclas derecha e
    # izquierda son pulsadas
    # en este ejemplo animaremos el personaje mientras lo movemos, lo haremos
    # de manera sencilla...
   
    def __init__(self):
        # intentemos usar la clase sf.self.... cargamos una imagen
        self.imagen  = sf.Image()
        self.imagen.LoadFromFile("doraemon.png")
        # asignamos una imagen al Sprite
        sf.Sprite.__init__(self, self.imagen)
        # ponemos el Sprite a la mitad de la pantalla
        self.SetX(400)
        self.SetY(150)
        # creamos unos atributos que nos ayudaran en la animacion
        self.cambia     = 0
        self.alternar   = 0
        self.cambia_max = 6
        self.vel        = 8

    def mover(self, direccion):
        """ metodo que nos permite mover al self hacia la izquierda o hacia la derecha.
        """
        # FIXME: al voltear a Doraemon debemos hacer que mueva un pie.
        # FIXME: al mover a Doraemon un "pasito" **deberia** mover un pie
        #        y no quedarse estatico.
        # volteamos la imagen del Sprite
        self.FlipX(direccion)
       
        if self.cambia <= self.cambia_max:
            # si self.cambia es menor o igual a su maximo
            # sumamos uno al atributo.
            self.cambia = self.cambia + 1
        else:
            if self.alternar == 3:
                # si self.alternar llega al maximo de los frames disponibles
                # volvemos al primer frame, el "frame 0".
                self.alternar = 0
               
            # cambiamos el frame...
            if self.alternar   == 0:
                # el frame que buscamos se ubica en ese rectangulo
                self.SetSubRect(sf.IntRect(204, 0, 244, 40))
                #print "derecha"
            elif self.alternar == 1:
                self.SetSubRect(sf.IntRect(0, 0, 43, 40))
                #print "de pie"
            elif self.alternar == 2:
                self.SetSubRect(sf.IntRect(164, 0, 204, 40))
                #print "izquierda"
            # alistamos el primer frame :D
            self.alternar = self.alternar + 1
            #print "self.alternar: {0}".format(self.alternar)
        if direccion:
            self.Move(-self.vel,0)
        else:
            self.Move(self.vel, 0)

    def detener(self):
        """ metodo para "detener" a Doraemon.
       
        este metodo no tiene nada que ver con el movimiento del Sprite.
        solo cambia el frame cuando mueve los pies al frame donde esta de
        pie."""
        # cambiamos algunos atributos del Sprite
        self.cambia   = 0
        self.alternar = 1
        # cambiamos el frame
        self.SetSubRect(sf.IntRect(0, 0, 43, 40))
        print "esta quieto y sonrie como un idiota, glol"

    def velocidad(self, cambiar_que, cantidad):
        """ este metodo nos permite cambiar la velocidad del movimiento del Sprite
            o la velocidad con la que cambian los frames.
        """
        if cambiar_que:
            # cambiamos el retardo que existe entre un frame y otro
            if self.cambia_max  == 0:
                # no podemos usar numeros negativos o 0!!
                self.cambia_max = 1
            else:
                # cambiamos la velocidad de la animacion.
                self.cambia_max = self.cambia_max + cantidad
        else:
            # cambiamos la velocidad con la que se mueve el Sprite
            if self.vel  == 0:
                self.vel = 1
            else:
                self.vel = self.vel + cantidad

    def textoInformativo(self):
        """ dibuja un texto con finalidades informativas en la pantalla del juego.
        """
        texto   = "Velocidad de movimiento: {0} (Teclas: S - X).\n".format(self.vel)
        texto   = texto + "Retardo entre Frames: {0} (Teclas: A - Z).\n".format(self.cambia_max)
        texto   = texto + "Mover con las flechas direccionales Izquierda y Derecha."
        texto_d = sf.String(texto)
        return texto_d

# Como que me da mucha pereza y usare los objetos de color de sf.Color,
# Vamos a usar variables para esos objetos de color.
Black   = sf.Color.Black
MyGreen = sf.Color(186, 254, 202)

# creamos la ventana del juego
ventana = sf.RenderWindow(sf.VideoMode(800,300), "Prueba 6 con PySFML por Shackra")

# obtenemos el input de los eventos de la ventana creada, mira sf.Input para mas informacion
# parece ser que no es necesario declarar este objeto dentro del loop para actualizar su estado...
entrada = ventana.GetInput()

# ahora usamos esa imagen cargada y creamos un self
doraemon = MySprite()
# sf.IntRect(left, top, right, bottom) <--- por si te lo preguntabas...
doraemon.SetSubRect(sf.IntRect(0, 0, 43, 40))

# iniciamos el loop del juego
salir = False
while not salir:
    eventos = sf.Event()
    while ventana.GetEvent(eventos):
        if eventos.Type == sf.Event.Closed:
            salir = True

        if eventos.Type == sf.Event.KeyPressed:
            if eventos.Key.Code == sf.Key.Escape:
                # el usuario pide salir del juego
                salir = True
            if eventos.Key.Code  == sf.Key.Right:
                doraemon.mover(False)
            if eventos.Key.Code ==  sf.Key.Left:
                doraemon.mover(True)
               
            # cambiamos el retardo entre los frames
            if eventos.Key.Code == sf.Key.A:
                doraemon.velocidad(True, 1)
            if eventos.Key.Code == sf.Key.Z:
                doraemon.velocidad(True, -1)
            # cambiamos la velocidad del movimiento del Sprite
            if eventos.Key.Code == sf.Key.S:
                doraemon.velocidad(False, 1)
            if eventos.Key.Code == sf.Key.X:
                doraemon.velocidad(False, -1)

        if eventos.Type == sf.Event.KeyReleased:
            doraemon.detener()

        #limpiamos la ventana y dibujamos los objetos en la pantalla
        ventana.Clear(MyGreen)
        ventana.Draw(doraemon)
        ventana.Draw(doraemon.textoInformativo())
        ventana.Display()

ventana.Close()
Avatar de Usuario
shackra
 
Mensajes: 308
Registrado: Lun Jun 15, 2009 4:10 pm
Ubicación: Costa Rica

Volver a General

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado

cron