HTML5 Game Interactive Object Test
The game now includes an object the character can interact with. Can you find it?
Images
The background image for the scene is:
The item images for the scene are:
The character's sprites are:
Code
I am using BlocksJS to simplify the implementation.
<article id="walk1" class="BlocksGame"></article> <script src="js/blocksjs-0.3.7.min.js"></script>
(function () { var game, bg, character, bucket, ladder, ladderCover, leftBounds = 62, rightBounds = 30, margin = 100, prevScrollXIndex, prevScrollYIndex, interactionOff, underground = false, undergroundRightBounds = 155, spec = { width: 500, height: 388, bg: { slices: [{ name: "walkLeft", src: "images/background.jpg" }] }, character: { slices: [{ name: "walkRight", src: "images/walk-right.png", offsetX: -19, numberOfFrames: 12, frameDelay: 1, loop: true }, { name: "walkLeft", src: "images/walk-left.png", offsetX: -19, numberOfFrames: 12, frameDelay: 1, loop: true }, { name: "standRight", src: "images/stand-right.png", offsetX: -19 }, { name: "standLeft", src: "images/stand-left.png", offsetX: -19 }, { name: "climbDown", src: "images/climb-down.png", offsetX: -19, numberOfFrames: 16, frameDelay: 2, loop: true }, { name: "climbUp", src: "images/climb-up.png", offsetX: -19, numberOfFrames: 16, frameDelay: 2, loop: true }] }, bucket: { x: 95, y: 301, slices: [{ name: "initial", src: "images/bucket.png" }, { name: "highlight", src: "images/bucket-highlight.png", offsetX: -2, offsetY: -2 }, { name: "dumped", src: "images/bucket-dumped.png", offsetX: 34, offsetY: 0 }] }, ladder: { x: 100, y: 311, slices: [{ name: "initial", src: "images/ladder.png" }, { name: "highlight", src: "images/ladder-highlight.png" }] }, ladderCover: { x: 89, y: 314, slices: [{ src: "images/ladder-cover.png" }] } }, walk = function (xDel, callback) { var x, callbackFunc; x = character.x + xDel; // Stop any previous movement character.stopMotors(); // Face the character left or right if (x > character.x) { character.setSlice("walkRight"); callbackFunc = callback || function () { character.setSlice("standRight"); }; } else { character.setSlice("walkLeft"); callbackFunc = callback || function () { character.setSlice("standLeft"); }; } // Start walking game.addMotor("move", { object: character, x: x - character.x, speed: 2, callback: callbackFunc }); }; // Create a game game = BLOCKS.game(spec); game.addEventListener("loaded", function () { // Create the background bg = BLOCKS.block({ layer: game.addLayer("bg"), spec: spec.bg }); // Create the bucket block bucket = BLOCKS.block({ layer: game.addLayer("bucket"), spec: spec.bucket }); bucket.posX = bucket.x; bucket.posY = bucket.y; // Create the ladder block ladder = BLOCKS.block({ layer: game.addLayer("ladder"), spec: spec.ladder }); ladder.posX = ladder.x; ladder.posY = ladder.y; // Create the character block character = BLOCKS.block({ layer: game.addLayer("character"), spec: spec.character }); // Create the ladderCover block ladderCover = BLOCKS.block({ layer: game.addLayer("ladderCover"), spec: spec.ladderCover }); ladderCover.posX = ladderCover.x; ladderCover.posY = ladderCover.y; ladderCover.hide(); bg.x = -580; character.y = 275; // Walk the character around initially walk(500, function () { walk(-500, function () { walk(330); }); }); // Notify the slice of game loop game.update = function() { var newCharX; if (character.x > game.width - margin) { bg.x -= character.x - (game.width - margin); bg.dirty = true; newCharX = game.width - margin; character.dirty = true; } else if (character.x < margin) { bg.x += margin - character.x; bg.dirty = true; newCharX = margin; character.dirty = true; } if (bg.x < -(bg.width - game.width)) { bg.x = -(bg.width - game.width); bg.dirty = true; } else if (bg.x > 0) { bg.x = 0; bg.dirty = true; } else if (newCharX !== undefined) { character.x = newCharX; character.dirty = true; } if (underground && character.x > game.width - undergroundRightBounds) { character.x = game.width - undergroundRightBounds; character.dirty = true; } else if (character.x < leftBounds) { character.x = leftBounds; character.dirty = true; } else if (character.x > game.width - rightBounds) { character.x = game.width - rightBounds; character.dirty = true; } if (prevScrollXIndex !== bg.x) { bucket.x = bucket.posX + bg.x; bucket.dirty = true; ladder.x = ladder.posX + bg.x; ladder.dirty = true; ladderCover.x = ladderCover.posX + bg.x; ladderCover.dirty = true; } if (prevScrollYIndex !== undefined && prevScrollYIndex !== bg.y) { bucket.y = bucket.posY + bg.y; bucket.dirty = true; ladder.y = ladder.posY + bg.y; ladder.dirty = true; ladderCover.y = ladderCover.posY + bg.y; ladderCover.dirty = true; character.y -= prevScrollYIndex - bg.y; character.dirty = true; } character.update(); bg.update(); bucket.update(); ladder.update(); ladderCover.update(); prevScrollXIndex = bg.x; prevScrollYIndex = bg.y; }; game.render = function() { bg.render(); if (bucket.dirty) { game.getLayer("bucket").clear(); } bucket.render(); if (ladder.dirty) { game.getLayer("ladder").clear(); } ladder.render(); if (ladderCover.dirty) { game.getLayer("ladderCover").clear(); } ladderCover.render(); if (character.dirty) { game.getLayer("character").clear(); } character.render(); }; // Move the character toward tap game.tap = function (pos) { var callback; if (!interactionOff) { if (bucket.getSlice().name !== "dumped") { bucket.setSlice("initial"); } if (bucket.getSlice().name !== "initial") { ladder.setSlice("initial"); } if (underground) { if (ladder.isPointInside(pos)) { ladder.setSlice("highlight"); callback = function () { // If we get to the ladder interactionOff = true; ladder.setSlice("initial"); // Make sure character is in the center of the ladder character.x = ladder.x + ladder.width / 2; ladderCover.show(); character.setSlice("climbUp"); character.stopMotors(); game.addMotor("move", { object: character, speed: 1, y: -182, callback: function () { ladderCover.hide(); character.setSlice("standRight"); interactionOff = false; underground = false; } }); bg.stopMotors(); game.addMotor("move", { object: bg, speed: 1, y: -bg.y }); }; } } else { if (bucket.isPointInside(pos) || (bucket.getSlice().name === "dumped" && ladder.isPointInside(pos))) { if (bucket.getSlice().name !== "dumped") { bucket.setSlice("highlight"); } else { ladder.setSlice("highlight"); } callback = function () { interactionOff = true; // Go to the left of the bucket walk(bucket.x - character.x, function () { // Go to the center of the bucket walk(bucket.x - character.x + bucket.width / 2, function () { // Dump the bucket if (bucket.getSlice().name !== "dumped") { bucket.setSlice("dumped"); } ladder.setSlice("initial"); ladderCover.show(); character.setSlice("climbDown"); character.stopMotors(); game.addMotor("move", { object: character, speed: 1, y: 182, callback: function () { ladderCover.hide(); character.setSlice("standRight"); interactionOff = false; underground = true; } }); bg.stopMotors(); game.addMotor("move", { object: bg, speed: 1, y: bg.y - bg.height / 2 }); }); }); }; } } walk(pos.x - character.x, callback); } }; }); game.load(); }());