domingo 8 de marzo de 2009

De vuelta en casa y curvas.

Ahora vivo en mi propia casa. Una cosa en la lista menos :)

Desde hace mucho tiempo siempre quise hacer una cosa en mis animaciones: curvas. Siempre he querido hacer que un sprite se mueva como en las presentaciones de los juegos de CAPCOM o SNK. La foto de un luchador haciendo pose que viene desde fuera de la pantalla a mucha velocidad y suavemente se coloca en la en su posición.
Para conseguier este efecto primero pensé en utilizar tablas de senos y cosenos para añadir un modificador a una funcion lineal simple. Pero siempre que lo intenté implementar, ni siquiera conseguí compilar.
Desde hace un tiempo tengo este libro de matemáticas para juegos. En uno de los capítulos, tras unas sesudas demostraciones matemáticas, enseña las fórmulas que describen cómo hallar un vector que interpola otros cuatro que describen el punto inicial, final y dos modificadores. En otras palabras, curvas Hermite y Beizer:


claseVector2D curvaHermite(Uint32 tInicial, Uint32 tFinal, Uint32 tAhora, claseVector2D p1, claseVector2D p2, claseVector2D t1, claseVector2D t2){
claseVector2D H(0,0);
if ((tAhora > tFinal)||(tAhora < tInicial)) return H;
double t=(double)(tAhora-tInicial)/(double)(tFinal-tInicial); // t es un valor entre 0 y 1
//printf("%f , %d, %d, %d\n",t,tInicial,tFinal,tAhora); // debug
H=((1-(3*t*t)+(2*t*t*t))*p1)+(((t*t)*(3-2*t))*p2)+(t*((t-1)*(t-1))*t1)+(((t*t)*(t-1))*t2);
return H;
}

claseVector2D curvaBeizer(Uint32 tInicial, Uint32 tFinal, Uint32 tAhora, claseVector2D p0, claseVector2D p3, claseVector2D p1, claseVector2D p2){
claseVector2D B(0,0);
if ((tAhora > tFinal)||(tAhora < tInicial)) return B;
double t=(double)(tAhora-tInicial)/(double)(tFinal-tInicial); // t es un valor entre 0 y 1
B=(((1-t)*(1-t)*(1-t))*p0)+(((3*t)*((1-t)*(1-t)))*p1)+(((3*(t*t))*(1-t))*p2)+((t*t*t)*p3); // se puede optimizar esta formula calculando (1-t) y pasandolo a una variable
return B;
}


Simple y eficiente. En otro post explico la implementación de "claseVector2D".

sábado 7 de febrero de 2009

Sensación extraña

Volver a ver mi código después de tantos meses, es raro. En general lo entiendo bien, pero parece que algunas cosas son demasiado complicadas para lo que hacen.

Ahora que estoy en paro, tengo más tiempo para cacharrear y he descubierto esta pequeña joyita: irrlicht. He conseguido mover un cubo por una pista hecha en blender como si fuera un coche.

Creo que voy a volver con el proyecto e incluso iniciar otro para no terminar ninguno de los dos :)

miércoles 19 de noviembre de 2008

Eh! que me bloquean...

Tengo tan olvidada esta página, que google cree que soy "spam". Bueno, señores de google, no se preocupen. Respondí a la solicitud y al "captcha" de sonido (por que la imagen era imposible de descifrar).
Este proyecto esta en parada técnica. Ahora mismo estoy buscando trabajo y no puedo estar con esto. Pero volveré.

domingo 18 de mayo de 2008

Ping?

Parece que el proyecto esta parado, pero no olvidado.
De momento, publicaré lo que tengo hecho hasta ahora, ya que el servidor donde alojaba antes ya no está disponible. ¿Alguien me ofrece unos cuantos megabytes en línea? Con 250 me conformo :)

martes 15 de abril de 2008

ping?

Estoy vivo, pero últimamente hay mucho trabajo: una nueva PS3 al que instalar linux, creación de un media server (media tomb) para la PS3, un guerrero undead de nivel 21 y subiendo, fiestas de cumpleaños con gente perdiendo el conocimiento... En fin, muchas cosas sucediendo.

lunes 31 de marzo de 2008

¿Textos al pinchar en sprites? Hecho.

Estoy pensando ahora en más tipos de eventos y en disparar más de una acción por evento. También estaría bien hacer un par de escenas de ejemplos y publicar unos binarios.

martes 25 de marzo de 2008

Temas pendientes

Que no se me olvide que tengo pendiente:
  • Crear método "void claseTexto::SetParrafoVisible(unsigned short int parrafo)". Cambia el estado del parrafo indicado a visible.
  • Crear método "void claseTexto::print()". Hacer tick() al parrafo visible. Si devuelve true, imprime el párrafo marcado como visible. si no, es que ya no es visible. Ajustar propiedades privadas para el nuevo estado.
  • Crear contador "tick" y bool Visible en claseParrafoTexto.
  • Crear metodo "bool claseParrafoTexto::tick()". tick++. Cuando tick supere un valor, cambiar visible a false y devolver false. Si no, devolver true.
  • Crear nueva accion-evento "muestra texto" y llamadas correspondientes en claseJuego.
  • Hacer prueba de pinchar en sprite y mostrar texto.
  • Ir pensando en eventos para gestionar objetivos del juego.
  • Ir pensando en condicionar la construcción de escenas dependiendo de los objetivos conseguidos.
  • Ir pensando en nuevos tipos de escena: diálogo, lucha...