sábado, 26 de diciembre de 2009

Videos musicales con Pyhton

A falta de un editor de vídeo que permita mezclar animaciones sobre fondos y moverlas, me puse con pyhton-pygame a crear un vídeo musical.
Es todo parecido a crear un juego, con la diferencia de que no hay control externo.

Como ha de sincronizarse con una pista musical, tengo una serie de variables que me van diciendo en qué punto de la canción estoy, de acuerdo con la base musical en MIDI.

Así hay una variable tiempo que va corriendo hacia adelante en décimas de segundo.
Cada 16 tiempos sube un valor la variable tiempo_cuarto, que sería aproximadamente el tiempo transcurrido entre un bombo y una caja en ritmo simple,
y cada dos tiempo_cuarto sube un valor la variable tiempo_measure.

El "measure" es la unidad de medida de mi secuenciador, y podría asimilarse a hojas de partitura. Cuando termina un measure aparece otro con nuevas notas.
Normalmente relleno los measures con 4 bombos y cajas a ritmo simple, aunque este es de los pocos casos en los que el measure contiene la mitad de información (y lógicamente tocado al doble de velocidad): bombo-caja-bombo-caja, fín del measure.

Con estas variables, empiezo a lanzar las animaciones:
En la segunda mitad del octavo measure empieza a cantar, entonces:
if tiempo_measure==8 and tiempo_cuarta==2:
  Player.accion_cabeza=1
  Player.accion=2
  Player.escala=2
  Player.x=200
  Player.vx=4

La cabeza está separada del cuerpo, y tiene cuatro tipos de acciones:
0. callao
1. mueve la boca abriéndola bastante, prononciando aes, o como gritando.
2. mueve la boca con proliferación de dientes apretados, como pronunciando eses.
3. mueve la boca con proliferación de "morritos", oes o plosivas.

El cuerpo tiene 8 tipos de animaciones, depende del que seleccione se pone a bailar de una forma o de otra, o bate una espada, se pone a saltar... así sin parar hasta que le de otra orden con otro tipo de movimiento

Vx es el desplazamiento horizontal en pixels que hará el personaje cada fracción de tiempo, hasta que le mande otro valor o le pare, con Vx=0.

La escala determina el factor de escala, valga la redundancia, por el que se multiplicará el tamaño del cuerpo y la cabeza, recalculando la posición. Para hacer primeros planos.

En fín, que con la partitura MIDI de la canción, es como si le dieses un guión al protagonista de lo que tiene que hacer en cada momento... y hasta nueva orden.
Ponte a saltar... ahora mueve la boca... ahora cállate, ahora por el fondo de la cueva. Ahora colócate a la derecha y avanza hacia la izquierda levantando las piernas, ahora acércate, ahora aléjate y pon el fondo del bosque...

Con la canción sonando al lado hay que ajustar el metrónomo de Pygame para que vaya acompasado.. y aquí está el único problema.
El tiempo de python no es exacto, cada vez que cargas el programa su velocidad de ejecución varía ligeramente, sin importancia para un juego, pero un desastre cuando todo tiene que ir sincronizado. Si antes te iba más o menos bien ese metrónomo, ahora descubres que el video adelanta a la música...o que se queda atrás.
Por lo que al final habrá que reajustar el tiempo de todo el vídeo, con algún programa que te permita algo del tipo "convertir la duración de 2 minutos a 1:58:32"

Si el vídeo corriera al tiempo con la música, se podría meter un control de la boca mediante teclado, de forma que mientras canta le vas indicando al muñeco por golpes de teclado cómo ha de abrir la boca, clavándolo con la letra. Y grabando el vídeo en vivo... sería como un directo XD

La canción del vídeo es ésta, una parodia de David el gnomo, David el orco, con un orco como protagonista. Aunque para el vídeo sonará en versión revolucionada, a más velocidad y con el pitch agudo cuatro tonos subido, que queda más hilarante, sin llegar a sonar a "pitufos maquineros".

Aún no la he terminado porque me falta meterle a los orcos coristas.

 
 

Rectificación: Hoy lo he probado varias veces y va clavado con la música, de modo que no necesitaré ningún programa externo para mezclarlo. Igual tiene que ver con la librería time que le metí a última hora para dejar un lapso antes de que empezara el vídeo.

Aquí está:

jueves, 3 de diciembre de 2009

Elige tu propia orcoaventura

Quizá haga algo para la orcoscomp. Estoy planeando un mix entre aventura conversacional y librojuego con combates. Gracias a Eliuk ya tengo el código funcional para lo que es el motor, formado con extractos de la librería Fhablao.h, un parche de Datoki y sustituyendo los "Quips" por flags, usando la librería NewFlags.h

Ahora se me plantea la dificultad de crear las escenas librojuego. El concepto de puzzles es completamente diferente aquí que en modo conversacional. De hecho es complicado implementar algo parecido a un puzzle con un sistema de opciones, casi estás dando la solución.
Por tanto, por un lado los textos, el relato, cobran más importancia. Por otro, cuando el jugador debe decidir, las opciones deben de tener algún sentido e interés, el cual estará fuertemente ligado al interés que despierte el propio relato.

Lo cual no ocurre en la conversacional, donde tenemos multitud de opciones invisibles, y de entre ellas muy pocas que sean realmente prácticas.

Al principio pensé en esto con la idea de que sería más rápido y sencillo hacer un librojuego que una aventura conversacional corta, pero me estoy temiendo que no va a ser así, aun con el motor listo.
Podría "fusilar" algún libro de Lobo Solitario... XD
A parte de tener que pensar todas las subtramas, esto va a ser como volver a programar por tablas, haciéndote un mapita en árbol de localidades y comunicaciones entre ellas (opciones).
Claro, que todo se puede simplificar:




En cuanto al sistema de combate, se basará en turnos alternativos de atacar-defenderse, entrando en juego la Destreza en el Combate, la Energía, la ruleta, bonificaciones o penalizaciones en función del tipo de ataque, y penalizaciones por luchar contra más de un enemigo.

La energía mide tanto la vida como el cansancio, cuanto más fuerte estés mejor peleas.
Cuando la energía llega a cero mueres, incapaz de defenderte más.
.
Atacar a más de un enemigo supone que tienes que dividir tus puntos de destreza a la hora de defenderte entre el número de amenazas.

Las tiradas de la ruleta son de 0 a 9, siendo 1 pifia (fallo seguro) y 0 (10) acierto seguro. Además, sacar un 0 atacando a un enemigo que anteriormente obtuvo pifia supone un crítico: daño x 3.

Las tácticas de combate son 4:
1. defensiva.
2. equilibrada.
3. ofensiva.
4. sucida (berserker).
La defensiva es la única que no consume energía, se basa esquivar y buscar buenas posiciones para atacar sólo ante oportunidades claras. Como compensación, en el turno siguiente tendremos una bonificación de defensa.
La sucida es la que más aumenta la probabilidad de acierto en el enemigo, a costa de que en el turno siguiente, cuando seamos atacados, sufriremos una penalización en nuestra defensa, y además consume más energía.
El resto de las opciones tienes sus bonificaciones y penalizaciones igualmente.

Lor rivales mayormente serán orcos, lo que se traduce en una destreza en el combate inferior a la del protagonista, pero una fuerza mayor. Es decir: tienen menos probabilidad de acertar, pero cuando aciertan, su daño base será mayor. En la característica de Fuerza están incluídas tanto la potencia del atacante como la del arma con la que golpea.

Todas las reglas son ambivalentes, se aplican por igual al protagonista y a los enemigos, que también decidirán individualmente la táctica de combate que más les conviene en cada turno.