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