Creating multiple Levels

Making multiple levels requires you to define multiple level specifications. For Example:

var myLevel = {
    //specification
};
var anotherLevel = {
    //specification
};

You will then need to call storeLevels multiple times with each level:

manager.storeLevels(myLevel);
manager.storeLevels(anotherLevel);

Or once with an array of levels:

manager.storeLevels([myLevel, anotherLevel]);

When manager.init() is called the first level stored will be loaded. Now we just need a way of going from one level to another. This is achieved with a door.

Create a door

Gamma provides a gma.door entity that you can place in a level. When touched by the character, it will ask the manager to load another level for you.

To add a door to your level specification you will need to add gma/entities/door to the dependency list. Then specify a gma.door with dimensions and a level to load when the character collides with it. The door should be added to the list of entities in myLevel:

entities : [
    gma.door({
        bottom:0, left:5, width:3, height:3,
        level:1
    })
]

Note

The number accepted by the level attribute determines which level to load. Note that because arrays in JavaScript are zero-indexed the first level is at index 0, the second at index 1, etc. Levels are indexed in the order they are added:

manager.storeLevels([myLevel, anotherLevel]);
manager.storeLevels(hardLevel);
// level:0 loads myLevel, stored at index 0
// level:1 loads anotherLevel, stored at index 1
// level:2 loads hardLevel, stored at index 2

Create another level

Now create a second level with a platform supporting a door that leads back to the first level:

var otherLevel = {
    spawn : {
        main : [0, 0]
    },
    camera : {
        attached : ['character', 0, 6, 60]
    },
    light : {
        myLight : {
             type : GLGE.L_POINT,
             rotY : 1.54,
             color    : "#fff",
             attached : ['character', 0,5,20]
        }
     },
    entities : [
        gma.door({bottom:0, left:25, width:0.5, height:9, level:0}),
        {template:'brickscube', top:0, left:0, width:30, height:3}
    ]
};

Store otherLevel in the manager (after storing myLevel):

manager.storeLevels(myLevel);    // Level:0
manager.storeLevels(otherLevel); // Level:1

End Result

The end result is 2 levels which can be travelled between via doors:

require([
    'gma/base',
    'gma/manager',
    'gma/entities/character',
    'gma/events',
    'gma/entities/enemy',
    'gma/entities/door'
],
    function(gma) {
        var manager = gma.manager({
            width : 600,
            height : 500
        });
        manager.character = gma.character({
            left     : 0,
            bottom   : 0,
            width    : 3,
            height   : 6,
            depth    : 3,
            template : 'gorilla'
        });
        manager.addCustomDefinitions({
            templates : {
                greencube : ['meshTemplate', {
                    mesh : gma.unitCubeInfo.mesh,
                    material : {color : "#090"}
                }],
                gorilla : ['colladaTemplate',
                {
                    collada : {
                        document : 'gorilla.dae'
                    },
                    yRot : 1.57,
                    yOffset : -0.5,
                    yScale:0.7
                }],
                brickscube : ['meshTemplate', {
                    mesh : gma.unitCubeInfo.mesh,
                    texture : {
                        src:'bricks.jpg',
                        repeatX:0.5,
                        repeatY:0.5
                    }
                }]
            },

            types : {
                jumpingJack: ['jumpingEnemy', {
                    width    : 1,
                    height   : 2,
                    template : 'greencube'
                }]
            }
        });

        var myLevel = {
            spawn : {
                main : [15, 24]
            },
            camera : {
                attached : ['character', 0, 6, 60]
            },
            light : {
                myLight : {
                     type : GLGE.L_POINT,
                     rotY : 1.54,
                     color    : "#fff",
                     attached : ['character', 0,5,20]
                }
             },
            entities : [
                gma.door({bottom:0, left:55, width:0.5, height:9, level:1}),
                {template:'brickscube', top:0, left:0, width:30, height:3},
                {template:'brickscube', top:0, left:39, width:30, height:3},
                gma.platformEnemy({bottom:0, left:45, width:3, height:6}),
                gma.patrolEnemy({bottom:0, left:6, width:3, height:6, limitLeft: 3, limitRight:12}),
                {type:'jumpingJack', bottom:0, left:21},
                {type:'jumpingJack', bottom:3, left:24},
                {type:'jumpingJack', bottom:6, left:27}
            ]
        };

        var otherLevel = {
            spawn : {
                main : [0, 0]
            },
            camera : {
                attached : ['character', 0, 6, 60]
            },
            light : {
                myLight : {
                     type : GLGE.L_POINT,
                     rotY : 1.54,
                     color    : "#fff",
                     attached : ['character', 0,5,20]
                }
             },
            entities : [
                gma.door({bottom:0, left:25, width:0.5, height:9, level:0}),
                {template:'brickscube', top:0, left:0, width:30, height:3}
            ]
        };

        manager.storeLevels(myLevel);
        manager.storeLevels(otherLevel);

        gma.keyHandler.register(37, manager.character.move.curry(gma.constants.LEFT));
        gma.keyHandler.register(39, manager.character.move.curry(gma.constants.RIGHT));
        gma.keyHandler.register(32, manager.character.jump);
        manager.init();
    }
);

What's next?

In the next section we will learn how to give out game a heads up display.

Fork me on GitHub