now need to make these entities to trying to jump on platforms and shot into player’s square. so, the entity going from right to left side and trying to jump on platforms on the way, if it failed to jump it just swithing to next platform at left side, until entity disappears by reaching left side of canvas. need to apply the same physics for entities as player has, because player physics in general is just perfect and the entities need to use this exact physics model to be able to properly collide with platforms.: class Platform{constructor(x,y,w,h){this.x=x;this.y=y;this.w=w;this.h=h}collidesWith(obj){if(obj.y+obj.h<=this.y)return false;if(obj.y>=this.y+this.h)return false;if(obj.x+obj.w<=this.x)return false;if(obj.x>=this.x+this.w)return false;const objAbove=obj.y+obj.h-obj.vy<=this.y;const objBelow=obj.y-obj.vy>=this.y+this.h;const objLeft=obj.x+obj.w-obj.vx<=this.x;const objRight=obj.x-obj.vx>=this.x+this.w;if(obj.vy>0&&objAbove&&!objBelow){obj.y=this.y-obj.h;obj.vy=0;obj.jumping=false;return true}if(obj.vy<0&&!objAbove&&objBelow){obj.y=this.y+this.h;obj.vy=0;return true}if(obj.vx<0&&objRight){obj.x=this.x+this.w;obj.vx=0;return true}if(obj.vx>0&&objLeft){obj.x=this.x-obj.w;obj.vx=0;return true}return false}}class Player{constructor(x,y,w,h){this.x=x;this.y=y;this.w=w;this.h=h;this.vx=0;this.vy=0;this.jumping=false}move(keys){const friction=.9;const gravity=1;if(keys[87]&&!this.jumping){this.vy-=20;this.jumping=true}if(keys[68]){this.vx+=5}if(keys[65]){this.vx-=5}this.vx*=friction;this.vy+=gravity;this.x+=this.vx;this.y+=this.vy;if(this.x<0){this.x=0}if(this.y<0){this.y=0}if(this.x+this.w>canvas.width){this.x=canvas.width-this.w;this.vx=0}if(this.y+this.h>canvas.height){this.y=canvas.height-this.h;this.vy=0;this.jumping=false}}}class Projectile{constructor(x,y,vx,vy){this.x=x;this.y=y;this.vx=vx;this.vy=vy;this.radius=10;this.color=“red”}update(){this.x+=this.vx;this.y+=this.vy}draw(ctx){ctx.beginPath();ctx.arc(this.x,this.y,this.radius,0,2*Math.PI);ctx.fillStyle=this.color;ctx.fill()}}class Entity{constructor(){this.x=canvas.width;this.y=Math.random()*canvas.height;this.vx=-1-Math.random()*3;this.vy=-2+Math.random()*4;this.projectiles=[];this.color=“blue”}update(){this.x+=this.vx;this.y+=this.vy;if(Math.random()<.01){this.projectiles.push(new Projectile(this.x,this.y,-2-Math.random()*6,-2+Math.random()*8))}for(let i=0;i<this.projectiles.length;i++){this.projectiles[i].update();if(this.projectiles[i].x<0||this.projectiles[i].y<0||this.projectiles[i].x>canvas.width||this.projectiles[i].y>canvas.height){this.projectiles.splice(i,1);i}}}draw(ctx){ctx.fillStyle=this.color;ctx.fillRect(this.x,this.y,20,20);for(let i=0;i<this.projectiles.length;i++){this.projectiles[i].draw(ctx)}}}class Game{constructor(canvas){this.canvas=canvas;this.ctx=canvas.getContext(“2d”);this.platforms=[];this.player=new Player(100,100,50,50);this.scrollSpeed=1;this.entities=[];this.entitySpawnRate=.1;this.entitySpawnTimer=1;this.entityIncreaseFactor=.1;this.keys={};this.platforms.push(new Platform(0,canvas.height-50,50,10));for(let i=0;i<10;i++){this.createRandomPlatform()}document.addEventListener(“keydown”,evt=>{this.keys[evt.keyCode]=true});document.addEventListener(“keyup”,evt=>{delete this.keys[evt.keyCode]});requestAnimationFrame(this.update.bind(this))}createRandomPlatform(){const x=this.canvas.width;const y=Math.random()*this.canvas.height;const w=50+Math.random()150;const h=10;this.platforms.push(new Platform(x,y,w,h))}update(){this.player.move(this.keys);for(let i=0;i<this.platforms.length;i++){this.platforms[i].collidesWith(this.player);this.platforms[i].x-=this.scrollSpeed}for(let i=0;i<this.entities.length;i++){if(this.entities[i]){this.entities[i].update();if(this.entities[i].x<0){this.entities.splice(i,1);i;for(let j=0;j<this.entityIncreaseFactor;j++){this.entities.push(new Entity)}}else{for(let j=0;j<this.entities[i].projectiles.length;j++){if(this.entities[i].projectiles[j].x>this.player.x&&this.entities[i].projectiles[j].x<this.player.x+this.player.w&&this.entities[i].projectiles[j].y>this.player.y&&this.entities[i].projectiles[j].y<this.player.y+this.player.h){this.player.vy-=20;this.player.jumping=true;this.entities[i].projectiles.splice(j,1);j}}this.entities[i].draw(this.ctx)}}}this.player.x-=this.scrollSpeed;if(this.platforms[this.platforms.length-1].x<this.canvas.width-200){this.createRandomPlatform()}this.entitySpawnTimer++;if(this.entitySpawnTimer>=120/this.entitySpawnRate){this.entitySpawnTimer=0;this.entities.push(new Entity);this.entitySpawnRate+=.001;this.entityIncreaseFactor=.001;this.entityIncreaseFactor=Math.min(this.entityIncreaseFactor,.001)}this.ctx.clearRect(0,0,this.canvas.width,this.canvas.height);for(let i=0;i<this.platforms.length;i++){let p=this.platforms[i];this.ctx.fillRect(p.x,p.y,p.w,p.h)}for(let i=0;i<this.entities.length;i++){this.entities[i].draw(this.ctx)}this.ctx.fillRect(this.player.x,this.player.y,this.player.w,this.player.h);requestAnimationFrame(this.update.bind(this))}}let canvas=document.createElement(“canvas”);canvas.width=window.innerWidth;canvas.height=window.innerHeight;document.body.appendChild(canvas);new Game(canvas);