
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...

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




