lunes, 8 de diciembre de 2014

RetroSevilla 2014


The next weekend MadGearGames will be in Retro Sevilla

Throughout all day of December 13, anyone passing by our booth will be able to play "A Hole New World", and also participate in our little *only suitable for hardcore gamers* challenge .

We'll give a copy of the game to anyone able to complete the game right there (using all time and continuations necessary), will somebody be able to get it? :)

This is the screen that those who get to complete the game and win our challenge will see :)
Good luck for every participant! There will be copies to all the winners! ;)

AHNW: New release (V0.40)


We just made a new release of A Hole New World.

-Added a whole new third stage. At least 2 different ways to advance.
-Added 5 new enemies for 3rd stage.
-Added a new final boss for 3rd stage.
-Added 4 New songs.
-Added 2 new cutscenes.
-Added 2 new stage elements that affect gameplay.
-Added a changeable boss room.
-Added a whole new bunch of sounds for the new stage.

If you want to support it's development, you can buy it here: 

domingo, 2 de noviembre de 2014

Ludum Dare October Challenge: A Hole New World

Original post here:

October ended, but luckily we managed to publish the game in time! We are really happy!! :D
We worked on the game we developed for the past 30 Ludum Dare entry
People encouraged us so much that we decided to give it a try and try to finish the game for selling as the october challenge suggested :)
Game intro
Game intro
A bit of gameplay
A bit of gameplay :)
As it was too much work for only a month, we decided that the best option we had was to finish a pair of stages and then upload the game. We also told the possible buyers that the game is in expansion (we plan to develop three more stages), and that while it's unfinished they can buy the game on sale (i.e. 1$ instead of its final price, that will be 5$).
Desktop version (Windows/Linux/Mac) in
Desktop version (Windows/Linux/Mac) in
I'm very happy to say that there are already several buyers (I didn't expect people to buy the game before we did a bit of promo at least ^^), and if everything's going ok we'll try to allocate the game in some more stores, like OUYA store and Steam :)
Thank you for the jump-start, Ludum Dare friends! And good luck for all of you too! ^o^

lunes, 25 de agosto de 2014

Yay! We did it! :D

Original post here:

We get to finish in time! :D :D :D
It was a crazy weekend! XD
We all 5 in team worked really hard, sleeping the least and nonstop programming, drawing, making music & sounds (and fighting some almost indestructible bugs XD) but we had a really great time! :D
For most of us it was the first Ludum Dare, and although we would have loved having more time to polish the game, we are very satisfied: D
We wanted to pay homage to the NES. So both the music (made with FamiTracker) and graphics (sprites with a maximum of 6 colors, 3 color tiles, etc.) and the kind of game tries to imitate the games of that great console.
You should listen this music while watching the world go round XD
We had a really good time , we are exhausted but very happy ^^
I hope all of you had as much fun as we did! :D See you in the next Ludum Dare! :D
Our previous post:
Our game:

viernes, 22 de agosto de 2014

Ludum Dare 30 - We are in! :D

We have just joined the LD30 Jam! :D

There is what we posted on the Ludum Dare Blog:
Hi all!
We are joining the Ludum Dare Jam! Our team:
Team Sprites
- DanPelGar -> Programmer, Musician & Sound editor
- Virako -> Programmer & Analyst
- Otaruk -> Pixel artist & Graphic Designer
- Xanday -> Pixel Artist & Programmer
- JJHaggar -> Pixel Artist & Programmer
Most of us are new to this event, and we are really excited about it! ^^ Hope we got something playable in time! XD
Code/Text editors:
- Vim
- Eclipse
- Notepad++
Language & Framework:
- Java
- LibGDX
Image/Maps editing:
- GraphicsGale (pixel art / sprite animation)
- Tiled (tile map editor)
- TexturePacker (texture packer XD)
- Gimp
- Photoshop
Music & sounds:
- FamiTracker
- Audacity
Distance Teamwork (some of us are on different countries):
- GitHub
- Google Hangout / Skype
- Trello
- Google Docs
- Email
Good luck to everyone, and have lots of fun!! ;D

miércoles, 11 de junio de 2014

Ninja Trials - Character Sheet (3) - Master

Hi! Long time no see!

Today we are introducing the master of Ryoko and Sho.

His name is Ryuto (竜大), but nobody dares to address him without calling him Master Ryuto. About the characters that compound his name, 竜 means "dragon", and 大 means "major", "large".

See you soon!

martes, 6 de mayo de 2014

NinjaTrials Logo


Today we are showing you Ninja Trials' logo...

... and some of its previous versions.


sábado, 12 de abril de 2014

Ninja Music


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:

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:

Estudio Evergreen links:


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!

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:
/** 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];
            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);
        case LOOP:
            frameNumber = frameNumber % keyFrames.length;
        case LOOP_PINGPONG:
            frameNumber = frameNumber % ((keyFrames.length * 2) - 2);
         if (frameNumber >= keyFrames.length)
            frameNumber = keyFrames.length - 2 - (frameNumber - keyFrames.length);
        case LOOP_RANDOM:
            frameNumber = MathUtils.random(keyFrames.length - 1);
        case REVERSED:
            frameNumber = Math.max(keyFrames.length - frameNumber - 1, 0);
        case LOOP_REVERSED:
            frameNumber = frameNumber % keyFrames.length;
            frameNumber = keyFrames.length - frameNumber - 1;

            // play normal otherwise
            frameNumber = Math.min(keyFrames.length - 1, frameNumber);

        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

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


jueves, 20 de marzo de 2014

Ninja Trials - Character Sheet (1) - Ryoko

Hi! Today we are introducing the Ninja Trials female main character.

Her name is Ryoko (涼子) and it means "refreshing girl".


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! ;)

domingo, 2 de marzo de 2014

Hello World!

We got a new Blog and Website! :D

We are starting as game development team, but have great expectations and ideas.

Our first project is Ninja Trials, we have been developing it for a while, learning a lot at the same time.

We started making the game using AndEngine (for Ouya and Android, but recently decided to move to libGDX, mostly because of multiplatform support.

We'll be reporting on progress :)