I made this game in less than 24 working hours, it's to celebrate 10 days making daily pens.
I used sketch.js to work with canvas.
A Pen by Eduardo Lopes on CodePen.
I made this game in less than 24 working hours, it's to celebrate 10 days making daily pens.
I used sketch.js to work with canvas.
A Pen by Eduardo Lopes on CodePen.
| <div id="container"> | |
| </div> | |
| <div class="controlls"> | |
| <p>Jump: <b>CLICK</b> or <b>SPACE</b> or <b>UP</b> or <b>W</b> (Hold to jump higher)</p> | |
| <p>(<b>TOUCH</b> works as well, but the game it's not responsive).</p> | |
| <p></p> | |
| </div> |
| /** | |
| https://codepen.io/EduardoLopes/pen/IJnAr/license | |
| **/ | |
| //dirty code made in less the 24 working hours | |
| var i = 0; | |
| function random( min, max ) { | |
| return Math.round( min + ( Math.random() * ( max - min ) ) ); | |
| } | |
| function randomChoice(array){ | |
| return array[ Math.round( random( 0, array.length - 1 ) ) ]; | |
| } | |
| var InfiniteRunner = Sketch.create({ | |
| fullscreen: false, | |
| width: 640, | |
| height: 360, | |
| container: document.getElementById('container') | |
| }); | |
| /*******************/ | |
| /*****VECTOR2*******/ | |
| /******************/ | |
| function Vector2(x, y, width, height){ | |
| this.x = x; | |
| this.y = y; | |
| this.width = width; | |
| this.height = height; | |
| this.previousX = 0; | |
| this.previousY = 0; | |
| }; | |
| Vector2.prototype.setPosition = function(x, y) { | |
| this.previousX = this.x; | |
| this.previousY = this.y; | |
| this.x = x; | |
| this.y = y; | |
| }; | |
| Vector2.prototype.setX = function(x) { | |
| this.previousX = this.x; | |
| this.x = x; | |
| }; | |
| Vector2.prototype.setY = function(y) { | |
| this.previousY = this.y; | |
| this.y = y; | |
| }; | |
| Vector2.prototype.insercects = function(obj){ | |
| if(obj.x < this.x + this.width && obj.y < this.y + this.height && | |
| obj.x + obj.width > this.x && obj.y + obj.height > this.y ){ | |
| return true; | |
| } | |
| return false; | |
| }; | |
| Vector2.prototype.insercectsLeft = function(obj){ | |
| if(obj.x < this.x + this.width && obj.y < this.y + this.height ){ | |
| return true; | |
| } | |
| return false; | |
| }; | |
| /****************/ | |
| /*****PLAYER****/ | |
| /**************/ | |
| function Player(options){ | |
| this.setPosition(options.x, options.y); | |
| this.width = options.width; | |
| this.height = options.height; | |
| this.velocityX = 0; | |
| this.velocityY = 0; | |
| this.jumpSize = -13; | |
| this.color = '#181818'; | |
| } | |
| Player.prototype = new Vector2; | |
| Player.prototype.update = function() { | |
| this.velocityY += 1; | |
| this.setPosition(this.x + this.velocityX, this.y + this.velocityY); | |
| if(this.y > InfiniteRunner.height || this.x + this.width < 0){ | |
| this.x = 150; | |
| this.y = 50; | |
| this.velocityX = 0; | |
| this.velocityY = 0; | |
| InfiniteRunner.jumpCount = 0; | |
| InfiniteRunner.aceleration = 0; | |
| InfiniteRunner.acelerationTweening = 0; | |
| InfiniteRunner.scoreColor = '#181818'; | |
| InfiniteRunner.platformManager.maxDistanceBetween = 350; | |
| InfiniteRunner.platformManager.updateWhenLose(); | |
| } | |
| if((InfiniteRunner.keys.UP || InfiniteRunner.keys.SPACE || InfiniteRunner.keys.W || InfiniteRunner.dragging) && this.velocityY < -8){ | |
| this.velocityY += -0.75; | |
| } | |
| }; | |
| Player.prototype.draw = function() { | |
| InfiniteRunner.fillStyle = this.color; | |
| InfiniteRunner.fillRect(this.x, this.y, this.width, this.height); | |
| }; | |
| /*******************/ | |
| /*****platform****/ | |
| /******************/ | |
| function Platform(options){ | |
| this.x = options.x; | |
| this.y = options.y; | |
| this.width = options.width; | |
| this.height = options.height; | |
| this.previousX = 0; | |
| this.previousY = 0; | |
| this.color = options.color; | |
| } | |
| Platform.prototype = new Vector2; | |
| Platform.prototype.draw = function() { | |
| InfiniteRunner.fillStyle = this.color; | |
| InfiniteRunner.fillRect(this.x, this.y, this.width, this.height); | |
| }; | |
| /*******************PLATFORM MANAGER*************/ | |
| function PlatformManager(){ | |
| this.maxDistanceBetween = 300; | |
| this.colors = ['#2ca8c2', '#98cb4a', '#f76d3c', '#f15f74','#5481e6']; | |
| this.first = new Platform({x: 300, y: InfiniteRunner.width / 2, width: 400, height: 70}) | |
| this.second = new Platform({x: (this.first.x + this.first.width) + random(this.maxDistanceBetween - 150, this.maxDistanceBetween), y: random(this.first.y - 128, InfiniteRunner.height - 80), width: 400, height: 70}) | |
| this.third = new Platform({x: (this.second.x + this.second.width) + random(this.maxDistanceBetween - 150, this.maxDistanceBetween), y: random(this.second.y - 128, InfiniteRunner.height - 80), width: 400, height: 70}) | |
| this.first.height = this.first.y + InfiniteRunner.height; | |
| this.second.height = this.second.y + InfiniteRunner.height; | |
| this.third.height = this.third.y + InfiniteRunner.height; | |
| this.first.color = randomChoice(this.colors); | |
| this.second.color = randomChoice(this.colors); | |
| this.third.color = randomChoice(this.colors); | |
| this.colliding = false; | |
| this.platforms = [this.first, this.second, this.third]; | |
| } | |
| PlatformManager.prototype.update = function() { | |
| this.first.x -= 3 + InfiniteRunner.aceleration; | |
| if(this.first.x + this.first.width < 0 ){ | |
| this.first.width = random(450, InfiniteRunner.width + 200); | |
| this.first.x = (this.third.x + this.third.width) + random(this.maxDistanceBetween - 150, this.maxDistanceBetween); | |
| this.first.y = random(this.third.y - 32, InfiniteRunner.height - 80); | |
| this.first.height = this.first.y + InfiniteRunner.height + 10; | |
| this.first.color = randomChoice(this.colors); | |
| } | |
| this.second.x -= 3 + InfiniteRunner.aceleration; | |
| if(this.second.x + this.second.width < 0 ){ | |
| this.second.width = random(450, InfiniteRunner.width + 200); | |
| this.second.x = (this.first.x + this.first.width) + random(this.maxDistanceBetween - 150, this.maxDistanceBetween); | |
| this.second.y = random(this.first.y - 32, InfiniteRunner.height - 80); | |
| this.second.height = this.second.y + InfiniteRunner.height + 10; | |
| this.second.color = randomChoice(this.colors); | |
| } | |
| this.third.x -= 3 + InfiniteRunner.aceleration; | |
| if(this.third.x + this.third.width < 0 ){ | |
| this.third.width = random(450, InfiniteRunner.width + 200); | |
| this.third.x = (this.second.x + this.second.width) + random(this.maxDistanceBetween - 150, this.maxDistanceBetween); | |
| this.third.y = random(this.second.y - 32, InfiniteRunner.height - 80); | |
| this.third.height = this.third.y + InfiniteRunner.height + 10; | |
| this.third.color = randomChoice(this.colors); | |
| } | |
| }; | |
| PlatformManager.prototype.updateWhenLose = function() { | |
| this.first.x = 300; | |
| this.first.color = randomChoice(this.colors); | |
| this.first.y = InfiniteRunner.width / random(2,3); | |
| this.second.x = (this.first.x + this.first.width) + random(this.maxDistanceBetween - 150, this.maxDistanceBetween); | |
| this.third.x = (this.second.x + this.second.width) + random(this.maxDistanceBetween - 150, this.maxDistanceBetween); | |
| }; | |
| /*******************PARTICLE SYSTEM*************/ | |
| function Particle(options){ | |
| this.x = options.x; | |
| this.y = options.y; | |
| this.size = 10; | |
| this.velocityX = options.velocityX || random(-(InfiniteRunner.aceleration * 3) + -8,-(InfiniteRunner.aceleration * 3)); | |
| this.velocityY = options.velocityY || random(-(InfiniteRunner.aceleration * 3) + -8,-(InfiniteRunner.aceleration * 3)); | |
| this.color = options.color; | |
| } | |
| Particle.prototype.update = function() { | |
| this.x += this.velocityX; | |
| this.y += this.velocityY; | |
| this.size *= 0.89; | |
| }; | |
| Particle.prototype.draw = function() { | |
| InfiniteRunner.fillStyle = this.color; | |
| InfiniteRunner.fillRect(this.x, this.y, this.size, this.size); | |
| }; | |
| /************************************************/ | |
| InfiniteRunner.setup = function () { | |
| this.jumpCount = 0; | |
| this.aceleration = 0; | |
| this.acelerationTweening = 0; | |
| this.player = new Player({x: 150, y: 30, width: 32, height: 32}); | |
| this.platformManager = new PlatformManager(); | |
| this.particles = []; | |
| this.particlesIndex = 0; | |
| this.particlesMax = 20; | |
| this.collidedPlatform = null; | |
| this.scoreColor = '#181818'; | |
| this.jumpCountRecord = 0; | |
| }; | |
| InfiniteRunner.update = function() { | |
| this.player.update(); | |
| switch(this.jumpCount){ | |
| case 10: | |
| this.acelerationTweening = 1; | |
| this.platformManager.maxDistanceBetween = 430; | |
| this.scoreColor = '#076C00'; | |
| break; | |
| case 25: | |
| this.acelerationTweening = 2; | |
| this.platformManager.maxDistanceBetween = 530; | |
| this.scoreColor = '#0300A9'; | |
| break; | |
| case 40: | |
| this.acelerationTweening = 3; | |
| this.platformManager.maxDistanceBetween = 580; | |
| this.scoreColor = '#9F8F00'; | |
| break; | |
| } | |
| this.aceleration += (this.acelerationTweening - this.aceleration) * 0.01; | |
| for (i = 0; i < this.platformManager.platforms.length; i++) { | |
| if(this.player.insercects(this.platformManager.platforms[i])){ | |
| this.collidedPlatform = this.platformManager.platforms[i]; | |
| if (this.player.y < this.platformManager.platforms[i].y) { | |
| this.player.y = this.platformManager.platforms[i].y; | |
| this.player.velocityY = 0; | |
| } | |
| this.player.x = this.player.previousX; | |
| this.player.y = this.player.previousY; | |
| this.particles[(this.particlesIndex++)%this.particlesMax] = new Particle({ | |
| x: this.player.x, | |
| y: this.player.y + this.player.height, | |
| color: this.collidedPlatform.color | |
| }); | |
| if(this.player.insercectsLeft(this.platformManager.platforms[i])){ | |
| this.player.x = this.collidedPlatform.x - 64; | |
| for (i = 0; i < 10; i++) { | |
| this.particles[(this.particlesIndex++)%this.particlesMax] = new Particle({ | |
| x: this.player.x + this.player.width, | |
| y: random(this.player.y, this.player.y + this.player.height), | |
| velocityY: random(-30,30), | |
| color: randomChoice(['#181818','#181818', this.collidedPlatform.color]) | |
| }); | |
| }; | |
| this.player.velocityY = -10 + -(this.aceleration * 4); | |
| this.player.velocityX = -20 + -(this.aceleration * 4); | |
| // this.jumpCount = 0; | |
| // this.aceleration = 0; | |
| // this.acelerationTweening = 0; | |
| // this.scoreColor = '#181818'; | |
| // this.platformManager.maxDistanceBetween = 350; | |
| // this.platformManager.updateWhenLose(); | |
| } else { | |
| if(this.dragging || this.keys.SPACE || this.keys.UP || this.keys.W){ | |
| this.player.velocityY = this.player.jumpSize; | |
| this.jumpCount++; | |
| if(this.jumpCount > this.jumpCountRecord){ | |
| this.jumpCountRecord = this.jumpCount; | |
| } | |
| } | |
| } | |
| } | |
| }; | |
| for (i = 0; i < this.platformManager.platforms.length; i++) { | |
| this.platformManager.update(); | |
| }; | |
| for (i = 0; i < this.particles.length; i++) { | |
| this.particles[i].update(); | |
| }; | |
| }; | |
| InfiniteRunner.draw = function(){ | |
| this.player.draw(); | |
| for (i = 0; i < this.platformManager.platforms.length; i++) { | |
| this.platformManager.platforms[i].draw(); | |
| }; | |
| for (i = 0; i < this.particles.length; i++) { | |
| this.particles[i].draw(); | |
| }; | |
| this.font = '12pt Arial'; | |
| this.fillStyle = '#181818'; | |
| this.fillText('RECORD: '+this.jumpCountRecord, this.width - (150 + (this.aceleration * 4)), 33 - (this.aceleration * 4)); | |
| this.fillStyle = this.scoreColor; | |
| this.font = (12 + (this.aceleration * 3))+'pt Arial'; | |
| this.fillText('JUMPS: '+this.jumpCount, this.width - (150 + (this.aceleration * 4)), 50); | |
| }; | |
| InfiniteRunner.resize = function() { | |
| }; |
| <script src="https://cdnjs.cloudflare.com/ajax/libs/sketch.js/1.0.0/sketch.min.js"></script> |
| body{ | |
| background: #e3e3e3; | |
| overflow: hidden; | |
| margin: 0; | |
| padding: 0; | |
| text-align: center; | |
| } | |
| #container{ | |
| margin-top: 10%; | |
| display: inline-block; | |
| } | |
| canvas{ | |
| background: #cecece; | |
| border: 1px solid #181818; | |
| } |