// # Quintus platformer example // // [Run the example](../examples/platformer/index.html) // WARNING: this game must be run from a non-file:// url // as it loads a level json file. // // This is the example from the website homepage, it consists // a simple, non-animated platformer with some enemies and a // target for the player. window.addEventListener("load",function() { // Set up an instance of the Quintus engine and include // the Sprites, Scenes, Input and 2D module. The 2D module // includes the `TileLayer` class as well as the `2d` componet. var Q = window.Q = Quintus() .include("Sprites, Scenes, Input, 2D") // Maximize this game to whatever the size of the browser is .setup({ width: 630, height: 350}) // And turn on default input controls .controls(); // ## Player Sprite // The very basic player sprite, this is just a normal sprite // using the player sprite sheet with default controls added to it. Q.Sprite.extend("Player",{ // the init constructor is called on creation init: function(p) { // You can call the parent's constructor with this._super(..) this._super(p, { sheet: "player", // Setting a sprite sheet sets sprite width and height x: 390, // You can also set additional properties that can y: 90, // be overridden on object creation }); // Add in pre-made components to get up and running quickly // The `2d` component adds in default 2d collision detection // and kinetics (velocity, gravity) // The `platformerControls` makes the player controllable by the // default input actions (left, right to move, up or action to jump) // It also checks to make sure the player is on a horizontal surface before // letting them jump. this.add('2d, platformerControls'); // Write event handlers to respond hook into behaviors. // hit.sprite is called everytime the player collides with a sprite this.on("hit.sprite",function(collision) { // Check the collision, if it's the Tower, you win! if(collision.obj.isA("Tower")) { alert("You Win!"); Q.stageScene("level1"); } }); } }); // ## Tower Sprite // Sprites can be simple, the Tower sprite just sets a custom sprite sheet Q.Sprite.extend("Tower", { init: function(p) { this._super(p, { sheet: 'tower' }); } }); // ## Enemy Sprite // Create the Enemy class to add in some baddies Q.Sprite.extend("Enemy",{ init: function(p) { this._super(p, { sheet: 'enemy', vx: 100 }); // Enemies use the Bounce AI to change direction // whenver they run into something. this.add('2d, aiBounce'); // Listen for a sprite collision, if it's the player, // restart the level this.on("hit.sprite",function(collision) { if(collision.obj.isA("Player")) { Q.stageScene("level1"); } }); } }); // ## Level1 scene // Create a new scene called level 1 Q.scene("level1",function(stage) { // Add in a tile layer, and make it the collision layer stage.collisionLayer(new Q.TileLayer({ dataAsset: 'level.json', sheet: 'tiles' })); // Create the player and add them to the stage var player = stage.insert(new Q.Player()); // Give the stage a moveable viewport and tell it // to follow the player. stage.add("viewport").follow(player); // Add in a couple of enemies stage.insert(new Q.Enemy({ x: 700, y: 0 })); stage.insert(new Q.Enemy({ x: 800, y: 00 })); // Finally add in the tower goal stage.insert(new Q.Tower({ x: 180, y: 35 })); }); // ## Asset Loading and Game Launch // Q.load can be called at any time to load additional assets // assets that are already loaded will be skipped // The callback will be triggered when everything is loaded Q.load("sprites.png, sprites.json, level.json, tiles.png", function() { // Sprites sheets can be created manually Q.sheet("tiles","tiles.png", { tilew: 32, tileh: 32 }); // Or from a .json asset that defines sprite locations Q.compileSheets("sprites.png","sprites.json"); // Finally, call stageScene to run the game Q.stageScene("level1"); }); // ## Possible Experimentations: // // The are lots of things to try out here. // // 1. Make the player able to squash the enemies by adding in listener to bump.bottom. // The following code in the player's init method should do the trick: // // this.on("bump.bottom",function(collision) { // if(collision.obj.isA("Enemy")) { // this.p.vy = -300; // collision.obj.destroy(); // } // }); // // 2. Modify level.json to change the level around and add in some more enemies. // 3. Add in a second level by creating a level2.json and a level2 scene that gets // loaded after level 1 is complete. // 4. Add in a title screen // 5. Add in points for jumping on enemies. // 6. Add in a `Repeater` behind the TileLayer to create a paralax scrolling effect. });