Skip to content

Instantly share code, notes, and snippets.

@iGitScor
Created February 14, 2018 16:45
Show Gist options
  • Save iGitScor/e23ef9ef267db94c625acc518a184a19 to your computer and use it in GitHub Desktop.
Save iGitScor/e23ef9ef267db94c625acc518a184a19 to your computer and use it in GitHub Desktop.
Doodle jump Santa Claus
(function (window, document, XMLHttpRequest) {
window.onload = function () {
// RequestAnimFrame: a browser API for getting smooth animations
window.requestAnimFrame = (function() {
return window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame ||
function(callback) {
window.setTimeout(callback, 1000 / 60);
};
})();
var canvas = document.getElementById('canvas'), ctx = canvas.getContext('2d');
var width = 422,
height = 552;
canvas.width = width;
canvas.height = height;
//Variables for game
var platforms = [],
image = document.getElementById('sprite'),
player, platformCount = 10,
position = 0,
gravity = 0.2,
animloop,
flag = 0, broken = 0,
menuloop,
dir, score = 0, firstRun = true;
//Base object
var Base = function() {
this.height = 5;
this.width = width;
//Sprite clipping
this.cx = 0;
this.cy = 614;
this.cwidth = 100;
this.cheight = 5;
this.moved = 0;
this.x = 0;
this.y = height - this.height;
this.draw = function() {
try {
ctx.drawImage(image, this.cx, this.cy, this.cwidth, this.cheight, this.x, this.y, this.width, this.height);
} catch (e) {}
};
};
var base = new Base();
//Player object
var Player = function() {
this.vy = 11;
this.vx = 0;
this.isMovingLeft = false;
this.isMovingRight = false;
this.isDead = false;
this.width = 55;
this.height = 40;
//Sprite clipping
this.cx = 0;
this.cy = 0;
this.cwidth = 110;
this.cheight = 80;
this.dir = 'left';
this.x = width / 2 - this.width / 2;
this.y = height;
//Function to draw it
this.draw = function() {
try {
if (this.dir == 'right') this.cy = 121;
else if (this.dir == 'left') this.cy = 201;
else if (this.dir == 'right_land') { /* Super jump */ this.cy = (this.vy < -11) ? 289 : 121; }
else if (this.dir == 'left_land') { /* Super jump */ this.cy = (this.vy < -11) ? 371 : 201; }
ctx.drawImage(image, this.cx, this.cy, this.cwidth, this.cheight, this.x, this.y, this.width, this.height);
} catch (e) {}
};
this.jump = function() {
this.vy = -8;
};
this.jumpHigh = function() {
this.vy = -16;
};
};
player = new Player();
//Platform class
function Platform() {
this.width = 70;
this.height = 17;
this.x = Math.random() * (width - this.width);
this.y = position;
position += (height / platformCount);
this.flag = 0;
this.state = 0;
//Sprite clipping
this.cx = 0;
this.cy = 0;
this.cwidth = 105;
this.cheight = 31;
//Function to draw it
this.draw = function() {
try {
if (this.type == 1) this.cy = 0;
else if (this.type == 2) this.cy = 61;
else if (this.type == 3 && this.flag === 0) this.cy = 31;
else if (this.type == 3 && this.flag == 1) this.cy = 1000;
else if (this.type == 4 && this.state === 0) { this.cy = 600; this.cx = 30; this.cwidth = 50; }
else if (this.type == 4 && this.state == 1) this.cy = 1000;
ctx.drawImage(image, this.cx, this.cy, this.cwidth, this.cheight, this.x, this.y, this.width, this.height);
} catch (e) {}
};
//Platform types
//1: Normal
//2: Moving
//3: Breakable
//Setting the probability of which type of platforms should be shown at what score
if (score >= 5000) this.types = [2, 2, 3, 3, 4];
else if (score >= 2000 && score < 5000) this.types = [2, 2, 2, 2, 2, 2, 2, 1, 1, 3, 3, 3, 4];
else if (score >= 1000 && score < 2000) this.types = [2, 2, 2, 2, 2, 1, 1, 1, 3, 3, 4, 4, 4];
else if (score >= 500 && score < 1000) this.types = [1, 1, 1, 1, 2, 2, 2, 2, 3, 4, 4];
else if (score >= 100 && score < 500) this.types = [1, 1, 2, 4];
else this.types = [1, 4];
this.type = this.types[Math.floor(Math.random() * this.types.length)];
//We can't have two consecutive breakable platforms otherwise it will be impossible to reach another platform sometimes!
if (this.type == 3 && broken < 1) {
broken++;
} else if (this.type == 3 && broken >= 1) {
this.type = 1;
broken = 0;
}
this.moved = 0;
this.vx = 1;
}
for (var i = 0; i < platformCount; i++) {
platforms.push(new Platform());
}
//Broken platform object
var Platform_broken_substitute = function() {
this.height = 30;
this.width = 70;
this.x = 0;
this.y = 0;
//Sprite clipping
this.cx = 0;
this.cy = 554;
this.cwidth = 105;
this.cheight = 60;
this.appearance = false;
this.draw = function() {
try {
if (this.appearance === true) ctx.drawImage(image, this.cx, this.cy, this.cwidth, this.cheight, this.x, this.y, this.width, this.height);
else return;
} catch (e) {}
};
};
var platform_broken_substitute = new Platform_broken_substitute();
//Spring Class
var spring = function() {
this.x = 0;
this.y = 0;
this.width = 26;
this.height = 30;
//Sprite clipping
this.cx = 0;
this.cy = 0;
this.cwidth = 45;
this.cheight = 53;
this.state = 0;
this.draw = function() {
try {
if (this.state === 0) this.cy = 445;
else if (this.state == 1) this.cy = 501;
ctx.drawImage(image, this.cx, this.cy, this.cwidth, this.cheight, this.x, this.y, this.width, this.height);
} catch (e) {}
};
};
var Spring = new spring();
function init() {
//Variables for the game
var dir = 'left',
jumpCount = 0;
firstRun = false;
//Function for clearing canvas in each consecutive frame
function paintCanvas() {
ctx.clearRect(0, 0, width, height);
}
//Player related calculations and functions
function playerCalc() {
if (dir == 'left') {
player.dir = 'left';
if (player.vy < -7 && player.vy > -15) player.dir = 'left_land';
} else if (dir == 'right') {
player.dir = 'right';
if (player.vy < -7 && player.vy > -15) player.dir = 'right_land';
}
//Adding keyboard controls
document.onkeydown = function(e) {
var key = e.keyCode;
if (key == 37) {
dir = 'left';
player.isMovingLeft = true;
} else if (key == 39) {
dir = 'right';
player.isMovingRight = true;
}
if(key == 32) {
if(firstRun === true)
init();
else
reset();
}
};
document.onkeyup = function(e) {
var key = e.keyCode;
if (key == 37) {
dir = 'left';
player.isMovingLeft = false;
} else if (key == 39) {
dir = 'right';
player.isMovingRight = false;
}
};
//Accelerations produces when the user hold the keys
if (player.isMovingLeft === true) {
player.x += player.vx;
player.vx -= 0.15;
} else {
player.x += player.vx;
if (player.vx < 0) player.vx += 0.1;
}
if (player.isMovingRight === true) {
player.x += player.vx;
player.vx += 0.15;
} else {
player.x += player.vx;
if (player.vx > 0) player.vx -= 0.1;
}
// Speed limits!
if(player.vx > 3.5)
player.vx = 3.5;
else if(player.vx < -3.5)
player.vx = -3.5;
//console.log(player.vx);
//Jump the player when it hits the base
if ((player.y + player.height) > base.y && base.y < height) player.jump();
//Gameover if it hits the bottom
if (base.y > height && (player.y + player.height) > height && player.isDead != 'lol') player.isDead = true;
//Make the player move through walls
if (player.x > width) player.x = 0 - player.width;
else if (player.x < 0 - player.width) player.x = width;
//Movement of player affected by gravity
if (player.y >= (height / 2) - (player.height / 2)) {
player.y += player.vy;
player.vy += gravity;
}
//When the player reaches half height, move the platforms to create the illusion of scrolling and recreate the platforms that are out of viewport...
else {
platforms.forEach(function(p, i) {
if (player.vy < 0) {
p.y -= player.vy;
}
if (p.y > height) {
platforms[i] = new Platform();
platforms[i].y = p.y - height;
}
});
base.y -= player.vy;
player.vy += gravity;
if (player.vy >= 0) {
player.y += player.vy;
player.vy += gravity;
}
score++;
}
//Make the player jump when it collides with platforms
collides();
if (player.isDead === true) gameOver();
}
//Spring algorithms
function springCalc() {
var s = Spring;
var p = platforms[0];
if (p.type == 1 || p.type == 2) {
s.x = p.x + p.width / 2 - s.width / 2;
s.y = p.y - p.height - 10;
if (s.y > height / 1.1) s.state = 0;
s.draw();
} else {
s.x = 0 - s.width;
s.y = 0 - s.height;
}
}
//Platform's horizontal movement (and falling) algo
function platformCalc() {
var subs = platform_broken_substitute;
platforms.forEach(function(p, i) {
if (p.type == 2) {
if (p.x < 0 || p.x + p.width > width) p.vx *= -1;
p.x += p.vx;
}
if (p.flag == 1 && subs.appearance === false && jumpCount === 0) {
subs.x = p.x;
subs.y = p.y;
subs.appearance = true;
jumpCount++;
}
p.draw();
});
if (subs.appearance === true) {
subs.draw();
subs.y += 8;
}
if (subs.y > height) subs.appearance = false;
}
function collides() {
//Platforms
platforms.forEach(function(p, i) {
if (player.vy > 0 && p.state === 0 && (player.x + 15 < p.x + p.width) && (player.x + player.width - 15 > p.x) && (player.y + player.height > p.y) && (player.y + player.height < p.y + p.height)) {
if (p.type == 3 && p.flag === 0) {
p.flag = 1;
jumpCount = 0;
return;
} else if (p.type == 4 && p.state === 0) {
score = score + 100;
player.jump();
p.state = 1;
} else if (p.flag == 1) return;
else {
player.jump();
}
}
});
//Springs
var s = Spring;
if (player.vy > 0 && (s.state === 0) && (player.x + 15 < s.x + s.width) && (player.x + player.width - 15 > s.x) && (player.y + player.height > s.y) && (player.y + player.height < s.y + s.height)) {
s.state = 1;
player.jumpHigh();
}
}
function updateScore() {
var scoreText = document.getElementById('score');
scoreText.innerHTML = score;
}
function gameOver() {
platforms.forEach(function(p, i) {
p.y -= 12;
});
if(player.y > height/2 && flag === 0) {
player.y -= 8;
player.vy = 0;
}
else if(player.y < height / 2) flag = 1;
else if(player.y + player.height > height) {
showGoMenu();
hideScore();
player.isDead = 'lol';
var tweet = document.getElementById('tweetBtn');
tweet.href='http://twitter.com/share?url=questionnaire.1001pharmacies.com/calendrier-avent/&text=Je viens de faire ' +score+ ' points sur le jeu du calendrier de l\'Avent 1001pharmacies du jour! %231001PharmaPereNoel&via=1001pharma';
var facebook = document.getElementById('fbBtn');
facebook.href='http://facebook.com/sharer/sharer.php?sdk=joey&u=questionnaire.1001pharmacies.com/calendrier-avent/&display=popup&ref=plugin&src=share_button';
}
}
//Function to update everything
function update() {
paintCanvas();
platformCalc();
springCalc();
playerCalc();
player.draw();
base.draw();
updateScore();
}
menuLoop = function(){return;};
animloop = function() {
update();
requestAnimFrame(animloop);
};
animloop();
hideMenu();
showScore();
}
function reset() {
hideGoMenu();
showScore();
player.isDead = false;
flag = 0;
position = 0;
score = 0;
base = new Base();
player = new Player();
Spring = new spring();
platform_broken_substitute = new Platform_broken_substitute();
platforms = [];
for (var i = 0; i < platformCount; i++) {
platforms.push(new Platform());
}
}
//Hides the menu
function hideMenu() {
var menu = document.getElementById('mainMenu');
menu.style.zIndex = -1;
}
//Shows the game over menu
function showGoMenu() {
document.querySelector('.modal-jpn .gain img').src = '';
document.querySelector('.modal-jpn .gain img').alt = '';
document.querySelector('.modal-jpn .gain span').innerHTML = '';
var menu = document.getElementById('gameOverMenu');
menu.style.zIndex = 1;
menu.style.visibility = 'visible';
var request = new XMLHttpRequest();
request.open('GET', 'http://avent.1001pharmacies.com/app.php/play/jump/' + score, true);
request.withCredentials = true;
request.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
request.onreadystatechange = function () {
if (request.readyState === 4 && request.status === 200) {
var responseText = JSON.parse(request.responseText);
if (responseText.win) {
if (responseText.gain && responseText.gain.img === undefined) {
document.querySelector('.modal-jpn .gain span').innerHTML = responseText.gain.text;
if (responseText.gain && responseText.gain.url) {
document.querySelector('.modal-jpn .gain a').href = responseText.gain.url;
} else {
document.querySelector('.modal-jpn .gain a').remove();
}
} else {
if (responseText.gain && responseText.gain.img !== undefined) {
document.querySelector('.modal-jpn .gain img').src = responseText.gain.img;
}
if (responseText.gain && responseText.gain.text) {
document.querySelector('.modal-jpn .gain img').alt = responseText.gain.text;
}
if (responseText.gain && responseText.gain.url) {
document.querySelector('.modal-jpn .gain a').href = responseText.gain.url;
} else {
document.querySelector('.modal-jpn .gain a').remove();
}
}
var className = 'hide';
var gain = document.querySelectorAll('#gameOverMenu .gain')[0];
if (gain.classList) {
gain.classList.remove(className);
} else {
gain.className = gain
.className
.replace(new RegExp('(^|\\b)' + className.split(' ').join('|') + '(\\b|$)', 'gi'), ' ');
}
}
var index;
document.getElementById('gameScoreTable').innerHTML = '';
for (index = 0; index < responseText.bestScores.length; ++index) {
var tr = document.createElement("tr");
var td = document.createElement('td');
var node = document.createTextNode(responseText.bestScores[index]);
td.appendChild(node);
tr.appendChild(td);
document.getElementById('gameScoreTable').appendChild(tr);
}
}
};
request.send();
document
.getElementById('gameScore')
.innerHTML = 'Vous avez obtenu ' + score + ' points !';
var topScore = 20 * (new Date()).getDate();
if (score < topScore) {
document
.getElementById('gameScoreDiff')
.innerHTML = 'Avec <strong>' + (topScore - score) + ' points</strong> de plus, vous débloquez <strong>la surprise du jour</strong> :-)';
} else {
document
.getElementById('gameScoreDiff')
.innerHTML = '';
}
}
//Hides the game over menu
function hideGoMenu() {
var menu = document.getElementById('gameOverMenu');
menu.style.zIndex = -1;
menu.style.visibility = 'hidden';
}
//Show ScoreBoard
function showScore() {
var menu = document.getElementById('scoreBoard');
menu.style.zIndex = 1;
}
//Hide ScoreBoard
function hideScore() {
var menu = document.getElementById('scoreBoard');
menu.style.zIndex = -1;
}
function playerJump() {
player.y += player.vy;
player.vy += gravity;
if (player.vy > 0 &&
(player.x + 15 < 260) &&
(player.x + player.width - 15 > 155) &&
(player.y + player.height > 475) &&
(player.y + player.height < 500))
player.jump();
if (dir == 'left') {
player.dir = 'left';
if (player.vy < -7 && player.vy > -15) player.dir = 'left_land';
} else if (dir == 'right') {
player.dir = 'right';
if (player.vy < -7 && player.vy > -15) player.dir = 'right_land';
}
if ('ontouchstart' in document.documentElement) {
document.getElementById('controlLeft').addEventListener('touchstart', function () {
dir = 'left';
player.isMovingLeft = true;
}, false);
var endLeft = function () {
dir = 'left';
player.isMovingLeft = false;
};
document.getElementById('controlLeft').addEventListener('touchend', endLeft, false);
document.getElementById('controlLeft').addEventListener('touchleave', endLeft, false);
document.getElementById('controlRight').addEventListener('touchstart', function () {
dir = 'right';
player.isMovingRight = true;
}, false);
var endRight = function () {
dir = 'right';
player.isMovingRight = false;
};
document.getElementById('controlRight').addEventListener('touchend', endRight, false);
document.getElementById('controlRight').addEventListener('touchleave', endRight, false);
} else {
if (document.getElementsByClassName('gameControls')[0])
document.getElementsByClassName('gameControls')[0].remove();
}
//Adding keyboard controls
document.onkeydown = function(e) {
var key = e.keyCode;
if (key == 37) {
dir = 'left';
player.isMovingLeft = true;
} else if (key == 39) {
dir = 'right';
player.isMovingRight = true;
}
if(key == 32) {
if(firstRun === true) {
init();
firstRun = false;
}
else
reset();
}
};
document.onkeyup = function(e) {
var key = e.keyCode;
if (key == 37) {
dir = 'left';
player.isMovingLeft = false;
} else if (key == 39) {
dir = 'right';
player.isMovingRight = false;
}
};
//Accelerations produces when the user hold the keys
if (player.isMovingLeft === true) {
player.x += player.vx;
player.vx -= 0.15;
} else {
player.x += player.vx;
if (player.vx < 0) player.vx += 0.1;
}
if (player.isMovingRight === true) {
player.x += player.vx;
player.vx += 0.15;
} else {
player.x += player.vx;
if (player.vx > 0) player.vx -= 0.1;
}
//Jump the player when it hits the base
if ((player.y + player.height) > base.y && base.y < height) player.jump();
//Make the player move through walls
if (player.x > width) player.x = 0 - player.width;
else if (player.x < 0 - player.width) player.x = width;
player.draw();
}
function update() {
ctx.clearRect(0, 0, width, height);
playerJump();
}
menuLoop = function() {
update();
requestAnimFrame(menuLoop);
};
document.getElementById('initGame').addEventListener('click', init);
document.getElementById('resetGame').addEventListener('click', reset);
menuLoop();
};
}(window, document, XMLHttpRequest));
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment