miércoles, 11 de junio de 2014
martes, 6 de mayo de 2014
NinjaTrials Logo
Buenas,
Hoy os mostramos el logotipo de Ninja Trials...
... y también algunas de sus versiones anteriores.
Saludos.
Hoy os mostramos el logotipo de Ninja Trials...
... y también algunas de sus versiones anteriores.
Saludos.
sábado, 12 de abril de 2014
Ninja Music
Hi!
This week we are going to write about the music of Ninja Trials, specifically about the music study that is working on it, Estudio Evergreen (Evergreen Studio).
Estudio Evergreen components are Samuel Foeger and Daniel Pellicer, two friends who like video games and composing music that one day three years ago decided that mixing these two hobbies would be funny.
Here you can listen to some of their creations:
https://soundcloud.com/estudioevergreen/temple-preview
https://soundcloud.com/estudioevergreen/math-maze-ost
https://soundcloud.com/estudioevergreen/sky-knight-5-the-blade-that
We were overjoyed when they told us that they would make the music of the game, and not just that, Daniel Pellicer also became part of Mad Gear Games, working in many other things apart from music and sound, such as programming the game itself.
Here's what's done so far in the soundtrack of Ninja Trials:
https://soundcloud.com/estudioevergreen/sets/ninja-trials-ost-on-going
Estudio Evergreen links:
Web: http://estudioevergreen.wordpress.com
SoundCloud: https://soundcloud.com/estudioevergreen
Greetings!
This week we are going to write about the music of Ninja Trials, specifically about the music study that is working on it, Estudio Evergreen (Evergreen Studio).
![]() |
| Estudio Evergreen's Logo |
Estudio Evergreen components are Samuel Foeger and Daniel Pellicer, two friends who like video games and composing music that one day three years ago decided that mixing these two hobbies would be funny.
Here you can listen to some of their creations:
https://soundcloud.com/estudioevergreen/temple-preview
https://soundcloud.com/estudioevergreen/math-maze-ost
https://soundcloud.com/estudioevergreen/sky-knight-5-the-blade-that
We were overjoyed when they told us that they would make the music of the game, and not just that, Daniel Pellicer also became part of Mad Gear Games, working in many other things apart from music and sound, such as programming the game itself.
Here's what's done so far in the soundtrack of Ninja Trials:
https://soundcloud.com/estudioevergreen/sets/ninja-trials-ost-on-going
Estudio Evergreen links:
Web: http://estudioevergreen.wordpress.com
SoundCloud: https://soundcloud.com/estudioevergreen
Greetings!
¡Hola!
Esta semana nos gustaría hablaros de la música de Ninja Trials, concretamente del estudio que se está encargando de realizarla, el Estudio Evergreen.
"Estudio Evergreen" lo componen Daniel Pellicer y Samuel Foeger, dos amigos a los que les gustan los videojuegos y componer, y que un buen día hace ya tres años decidieron que mezclar ambas cosas sería divertido.
Aquí podéis escuchar algunas de sus creaciones:
https://soundcloud.com/estudioevergreen/temple-preview
https://soundcloud.com/estudioevergreen/math-maze-ost
https://soundcloud.com/estudioevergreen/sky-knight-5-the-blade-that
Nos alegró muchísimo cuando nos dijeron que se encargarían de las músicas, y por si eso fuera poco, Daniel Pellicer también entró a formar parte de Mad Gear Games, trabajando aparte de en la música y sonido, en muchas otras cosas, como la propia programación del juego.
Aquí tenéis lo que hay hecho por ahora de la banda sonora de Ninja Trials:
https://soundcloud.com/estudioevergreen/sets/ninja-trials-ost-on-going
Enlaces del Estudio Evergreen:
Web: http://estudioevergreen.wordpress.com
SoundCloud: https://soundcloud.com/estudioevergreen
¡Saludos!
Esta semana nos gustaría hablaros de la música de Ninja Trials, concretamente del estudio que se está encargando de realizarla, el Estudio Evergreen.
![]() |
| Logo del Estudio Evergreen |
"Estudio Evergreen" lo componen Daniel Pellicer y Samuel Foeger, dos amigos a los que les gustan los videojuegos y componer, y que un buen día hace ya tres años decidieron que mezclar ambas cosas sería divertido.
Aquí podéis escuchar algunas de sus creaciones:
https://soundcloud.com/estudioevergreen/temple-preview
https://soundcloud.com/estudioevergreen/math-maze-ost
https://soundcloud.com/estudioevergreen/sky-knight-5-the-blade-that
Nos alegró muchísimo cuando nos dijeron que se encargarían de las músicas, y por si eso fuera poco, Daniel Pellicer también entró a formar parte de Mad Gear Games, trabajando aparte de en la música y sonido, en muchas otras cosas, como la propia programación del juego.
Aquí tenéis lo que hay hecho por ahora de la banda sonora de Ninja Trials:
https://soundcloud.com/estudioevergreen/sets/ninja-trials-ost-on-going
Enlaces del Estudio Evergreen:
Web: http://estudioevergreen.wordpress.com
SoundCloud: https://soundcloud.com/estudioevergreen
¡Saludos!
viernes, 4 de abril de 2014
Ninja Trials - Character Sheet (2) - Sho
Hi! Today we are introducing Ninja Trials' male main character.
His name is Shoichi (正一), but they call him Sho. It means "Correct / righteous [first son]"
See you!
His name is Shoichi (正一), but they call him Sho. It means "Correct / righteous [first son]"
See you!
jueves, 27 de marzo de 2014
AnimationNinja - Frames with individual frame durations
Last week when we were going to code some animations for Ninja Trials, we realized that the 'Animation' class from libGDX would't let us making animations with different durations for each frame, which we need for almost every animation in the game.
For example, if we want to make a face whith eyes that blink, we'd like to get something like this:
(eyes blink for 0.1 sec)
But if every frame's duration needs to be the same, we'll get something like this:
(unless we insert several duplicated frames, and that doesn't seem to be efficient)
As you can see we needed more control over animation's time. We didn't mean to reinvent the wheel, so we searched again and again but found nothing, then DanPelGar started to modify the 'Animation' class. Now we are using the 'AnimationNinja' class.
These are the additions to the original class:
Code's license is the same that libGDX uses, the Apache 2.0 (you can use it free of charge, in commercial and non-commercial projects).
Greetings!
For example, if we want to make a face whith eyes that blink, we'd like to get something like this:
(eyes blink for 0.1 sec)
But if every frame's duration needs to be the same, we'll get something like this:
(unless we insert several duplicated frames, and that doesn't seem to be efficient)
As you can see we needed more control over animation's time. We didn't mean to reinvent the wheel, so we searched again and again but found nothing, then DanPelGar started to modify the 'Animation' class. Now we are using the 'AnimationNinja' class.
These are the additions to the original class:
/** Constructor, storing the frame duration, key frames and play type.
*
* @param frameDuration the time between frames in seconds. An array is given with the different times.
* @param keyFrames the {@link TextureRegion}s representing the frames.
* @param playType the type of animation play (NORMAL, REVERSED, LOOP, LOOP_REVERSED, LOOP_PINGPONG, LOOP_RANDOM) */
public AnimationNinja (float[] frameDuration, Array keyFrames, int playType) {
this.constructorArray = true;
this.frameDuration = frameDurationArray[0];
this.animationDuration = 0;
this.frameDurationArray = new float[frameDuration.length];
for (int i = 0; i < frameDuration.length; i++) {
this.animationDuration += frameDuration[i];
this.frameDurationArray[i] = frameDuration[i];
}
this.keyFrames = new TextureRegion[keyFrames.size];
for (int i = 0, n = keyFrames.size; i < n; i++) {
this.keyFrames[i] = keyFrames.get(i);
}
this.playMode = playType;
}
//A different method is used if an array of frames was set
/** Returns the current frame number.
* @param stateTime
* @return current frame number */
public int getKeyFrameIndexIfArray (float stateTime) {
if(keyFrames.length == 1)
return 0;
//With the difference between the actual time and the animation duration we will know the exact frame
float frameNumberFloat = (stateTime % animationDuration);
float frameTime[] = new float[keyFrames.length];
//the float framePosition is the sum of the duration of the actual frame plus all the previous one -> Accumulated duration
float framePosition[] = new float[keyFrames.length];
for (int i = 0; i < framePosition.length; i++) {
if (i == 0) {
framePosition[i] = frameDurationArray[i];
continue;
}
framePosition[i] = frameDurationArray[i] + framePosition[i - 1];
}
//With the framePosition and the actual time we can know which frame Number is the actual one
int frameNumber = 0;
if (frameNumberFloat < framePosition[0])
frameNumber = 0;
if (frameNumberFloat > framePosition[frameDurationArray.length - 1])
frameNumber = frameDurationArray.length - 1;
for (int i = 0; i < frameTime.length - 1; i++) {
if (frameNumberFloat < framePosition[i + 1] && frameNumberFloat >= framePosition[i])
frameNumber = i + 1;
}
//the rest of the method stays the same
switch (playMode) {
case NORMAL:
frameNumber = Math.min(keyFrames.length - 1, frameNumber);
break;
case LOOP:
frameNumber = frameNumber % keyFrames.length;
break;
case LOOP_PINGPONG:
frameNumber = frameNumber % ((keyFrames.length * 2) - 2);
if (frameNumber >= keyFrames.length)
frameNumber = keyFrames.length - 2 - (frameNumber - keyFrames.length);
break;
case LOOP_RANDOM:
frameNumber = MathUtils.random(keyFrames.length - 1);
break;
case REVERSED:
frameNumber = Math.max(keyFrames.length - frameNumber - 1, 0);
break;
case LOOP_REVERSED:
frameNumber = frameNumber % keyFrames.length;
frameNumber = keyFrames.length - frameNumber - 1;
break;
default:
// play normal otherwise
frameNumber = Math.min(keyFrames.length - 1, frameNumber);
break;
}
return frameNumber;
}
If you are starting using libGDX there are high chances that you are in the same situation as we were, so we thought that putting here the solution we got would be a good idea. Here is the class AnimationNinja.javaCode's license is the same that libGDX uses, the Apache 2.0 (you can use it free of charge, in commercial and non-commercial projects).
Greetings!
La semana pasada cuando íbamos a hacer algunas animaciones del Ninja Trials, nos dimos cuenta de que la clase "Animation" de libGDX no nos permitía hacer animaciones con duraciones diferentes para cada fotograma, cosa que necesitamos para casi todas las animaciones del juego.
Por ejemplo, si queremos hacer una cara que parpadee, lo normal es que busquemos algo así:

(cierra los ojos durante 0.1 seg)
Pero si todos los fotogramas tienen que durar el mismo tiempo, obtendremos esto:

(a no ser que metiésemos muchos fotogramas repetidos, cosa que no parece muy eficiente)
Como veis, necesitábamos más control sobre las animaciones. Para intentar no reinventar la rueda, abrimos un navegador, buscamos y buscamos pero nada hallamos, por lo que DanPelGar se puso manos a la obra para modificar la clase "Animation". Ahora usamos la clase "AnimationNinja".
Estos son los añadidos a la clase original:
Como es muy posible que si estáis empezando a usar libGDX os encontréis en nuestra misma situación, pensamos que sería una buena idea poner aquí la solución que usamos nosotros. Aquí tenéis la clase AnimationNinja.java
La licencia del código es la misma de libGDX, la Apache 2.0 (la podéis usar sin coste alguno, tanto en proyectos comerciales como no comerciales).
¡Saludos!
Por ejemplo, si queremos hacer una cara que parpadee, lo normal es que busquemos algo así:

(cierra los ojos durante 0.1 seg)
Pero si todos los fotogramas tienen que durar el mismo tiempo, obtendremos esto:

(a no ser que metiésemos muchos fotogramas repetidos, cosa que no parece muy eficiente)
Como veis, necesitábamos más control sobre las animaciones. Para intentar no reinventar la rueda, abrimos un navegador, buscamos y buscamos pero nada hallamos, por lo que DanPelGar se puso manos a la obra para modificar la clase "Animation". Ahora usamos la clase "AnimationNinja".
Estos son los añadidos a la clase original:
/** Constructor, storing the frame duration, key frames and play type.
*
* @param frameDuration the time between frames in seconds. An array is given with the different times.
* @param keyFrames the {@link TextureRegion}s representing the frames.
* @param playType the type of animation play (NORMAL, REVERSED, LOOP, LOOP_REVERSED, LOOP_PINGPONG, LOOP_RANDOM) */
public AnimationNinja (float[] frameDuration, Array keyFrames, int playType) {
this.constructorArray = true;
this.frameDuration = frameDurationArray[0];
this.animationDuration = 0;
this.frameDurationArray = new float[frameDuration.length];
for (int i = 0; i < frameDuration.length; i++) {
this.animationDuration += frameDuration[i];
this.frameDurationArray[i] = frameDuration[i];
}
this.keyFrames = new TextureRegion[keyFrames.size];
for (int i = 0, n = keyFrames.size; i < n; i++) {
this.keyFrames[i] = keyFrames.get(i);
}
this.playMode = playType;
}
//A different method is used if an array of frames was set
/** Returns the current frame number.
* @param stateTime
* @return current frame number */
public int getKeyFrameIndexIfArray (float stateTime) {
if(keyFrames.length == 1)
return 0;
//With the difference between the actual time and the animation duration we will know the exact frame
float frameNumberFloat = (stateTime % animationDuration);
float frameTime[] = new float[keyFrames.length];
//the float framePosition is the sum of the duration of the actual frame plus all the previous one -> Accumulated duration
float framePosition[] = new float[keyFrames.length];
for (int i = 0; i < framePosition.length; i++) {
if (i == 0) {
framePosition[i] = frameDurationArray[i];
continue;
}
framePosition[i] = frameDurationArray[i] + framePosition[i - 1];
}
//With the framePosition and the actual time we can know which frame Number is the actual one
int frameNumber = 0;
if (frameNumberFloat < framePosition[0])
frameNumber = 0;
if (frameNumberFloat > framePosition[frameDurationArray.length - 1])
frameNumber = frameDurationArray.length - 1;
for (int i = 0; i < frameTime.length - 1; i++) {
if (frameNumberFloat < framePosition[i + 1] && frameNumberFloat >= framePosition[i])
frameNumber = i + 1;
}
//the rest of the method stays the same
switch (playMode) {
case NORMAL:
frameNumber = Math.min(keyFrames.length - 1, frameNumber);
break;
case LOOP:
frameNumber = frameNumber % keyFrames.length;
break;
case LOOP_PINGPONG:
frameNumber = frameNumber % ((keyFrames.length * 2) - 2);
if (frameNumber >= keyFrames.length)
frameNumber = keyFrames.length - 2 - (frameNumber - keyFrames.length);
break;
case LOOP_RANDOM:
frameNumber = MathUtils.random(keyFrames.length - 1);
break;
case REVERSED:
frameNumber = Math.max(keyFrames.length - frameNumber - 1, 0);
break;
case LOOP_REVERSED:
frameNumber = frameNumber % keyFrames.length;
frameNumber = keyFrames.length - frameNumber - 1;
break;
default:
// play normal otherwise
frameNumber = Math.min(keyFrames.length - 1, frameNumber);
break;
}
return frameNumber;
}
Como es muy posible que si estáis empezando a usar libGDX os encontréis en nuestra misma situación, pensamos que sería una buena idea poner aquí la solución que usamos nosotros. Aquí tenéis la clase AnimationNinja.java
La licencia del código es la misma de libGDX, la Apache 2.0 (la podéis usar sin coste alguno, tanto en proyectos comerciales como no comerciales).
¡Saludos!
jueves, 20 de marzo de 2014
Ninja Trials - Character Sheet (1) - Ryoko
lunes, 10 de marzo de 2014
Ninja Trials
Hello again! :)
We'll try to update the blog about once a week to tell you about progress we are making, but before that I'll tell you a little about the first game we're developing now, Ninja Trials.
We started developing it in 2013, at first it was going to be a very simple game (like Track'n'Field), because we were still gathering the team, and we primarily wanted to test the engine AndEngine for Ouya (originally it was going to be an Ouya exclusive game, and maybe also for Android smartphones ), but gradually the ideas emerged and we saw that the game had lots of possibilities, so we added several things: new game modes, achievements, history...
These are the first sketches of the game:
We have been learning and improving, and when December 2013 arrived, we took a major decision, we left AndEngine in favor of libGDX. There were many advantages and disadvantages that we had in mind to decide, but mainly we took that decision because that way we could also distribute the game on PC (Windows, Linux and Mac), and even iOS thank to RoboVM.
Right now we are finishing the rebuilding of the "skeleton" of the game, so we hope to have a Beta version running soon.
We'll continue reporting! ;)
We'll try to update the blog about once a week to tell you about progress we are making, but before that I'll tell you a little about the first game we're developing now, Ninja Trials.
We started developing it in 2013, at first it was going to be a very simple game (like Track'n'Field), because we were still gathering the team, and we primarily wanted to test the engine AndEngine for Ouya (originally it was going to be an Ouya exclusive game, and maybe also for Android smartphones ), but gradually the ideas emerged and we saw that the game had lots of possibilities, so we added several things: new game modes, achievements, history...
These are the first sketches of the game:
We have been learning and improving, and when December 2013 arrived, we took a major decision, we left AndEngine in favor of libGDX. There were many advantages and disadvantages that we had in mind to decide, but mainly we took that decision because that way we could also distribute the game on PC (Windows, Linux and Mac), and even iOS thank to RoboVM.
Right now we are finishing the rebuilding of the "skeleton" of the game, so we hope to have a Beta version running soon.
We'll continue reporting! ;)
¡Hola de nuevo! :)
Vamos a intentar actualizar el blog más o menos una vez por semana para iros contando los progresos que vayamos haciendo, pero antes de nada os contaremos un poco sobre el primero juego que estamos creando, el Ninja Trials.
Empezamos a hacerlo en 2013, al principio iba a ser un juego del tipo de Track'n'Field muy sencillo, pues estábamos todavía reuniendo el equipo, y lo que queríamos principalmente era probar el motor AndEngine en la Ouya (iba a ser un juego exclusivo de Ouya, y quizás también para smartphones Android), pero poco a poco surgieron las ideas y acabamos viendo que el juego podía tener mucho jugo, con lo que fuimos añadiéndole varias cosas: modos de juego nuevos, logros, historia...
Estos son los primeros bocetos del juego:
Hemos ido aprendiendo y mejorando, y al llegar diciembre de 2013 tomamos una decisión importante, dejar AndEngine en favor de libGDX. Fueron muchas las ventajas y desventajas que tuvimos en cuenta para decidirnos, pero principalmente nos decidimos debido a que así podríamos distribuir el juego también en PC (tanto en Windows como en Linux y Mac), e incluso en iOS gracias a RoboVM.
Ahora mismo estamos terminando de reconstruir el "esqueleto" del juego, con lo que en breve esperamos tener una versión Beta funcionando.
¡Seguimos informando! ;)
Vamos a intentar actualizar el blog más o menos una vez por semana para iros contando los progresos que vayamos haciendo, pero antes de nada os contaremos un poco sobre el primero juego que estamos creando, el Ninja Trials.
Empezamos a hacerlo en 2013, al principio iba a ser un juego del tipo de Track'n'Field muy sencillo, pues estábamos todavía reuniendo el equipo, y lo que queríamos principalmente era probar el motor AndEngine en la Ouya (iba a ser un juego exclusivo de Ouya, y quizás también para smartphones Android), pero poco a poco surgieron las ideas y acabamos viendo que el juego podía tener mucho jugo, con lo que fuimos añadiéndole varias cosas: modos de juego nuevos, logros, historia...
Estos son los primeros bocetos del juego:
Hemos ido aprendiendo y mejorando, y al llegar diciembre de 2013 tomamos una decisión importante, dejar AndEngine en favor de libGDX. Fueron muchas las ventajas y desventajas que tuvimos en cuenta para decidirnos, pero principalmente nos decidimos debido a que así podríamos distribuir el juego también en PC (tanto en Windows como en Linux y Mac), e incluso en iOS gracias a RoboVM.
Ahora mismo estamos terminando de reconstruir el "esqueleto" del juego, con lo que en breve esperamos tener una versión Beta funcionando.
¡Seguimos informando! ;)
Suscribirse a:
Entradas (Atom)










