I made a simple game and the code will be lower. The point is to make them a step-by-step movement, and not that they instantly make moves. It is necessary to replace the while loop with something else most likely, well, of all my other stupid ideas, this is the best. If you need the source files of other files or an explanation of the function, I will add. (The essence of my ai is that the mobs go to the player’s cords until they have finished their moves, I don’t know if it will help or not)
var stepEnemyBase = function(i,set){ if(set == "y-"){ updateMap("3",enemyList[i].x,enemyList[i].y); enemyList[i].y -= 1; updateMap(enemyList[i].type,enemyList[i].x,enemyList[i].y); }else if(set == "y+"){ updateMap("3",enemyList[i].x,enemyList[i].y); enemyList[i].y += 1; updateMap(enemyList[i].type,enemyList[i].x,enemyList[i].y); }else if(set == "x-"){ updateMap("3",enemyList[i].x,enemyList[i].y); enemyList[i].x -= 1; updateMap(enemyList[i].type,enemyList[i].x,enemyList[i].y); }else if(set == "x+"){ updateMap("3",enemyList[i].x,enemyList[i].y); enemyList[i].x += 1; updateMap(enemyList[i].type,enemyList[i].x,enemyList[i].y); } } var stepEnemy = function(){ for(var i = 1;i < enemyList.length;i ++){ if(enemyList[i].status){ enemyList[i].mana = 100; while(enemyStep != enemyList[i].step){ enemyStep += 1; if(xHero == enemyList[i].x){ if(yHero < enemyList[i].y){ if(checkBlock("player",enemyList[i].x,enemyList[i].y - 1)){ if(checkBlock("block",enemyList[i].x,enemyList[i].y - 1) && checkBlock("enemy",enemyList[i].x,enemyList[i].y - 1)){ stepEnemyBase(i,"y-"); }else if(checkBlock("block",enemyList[i].x + 1,enemyList[i].y) && checkBlock("enemy",enemyList[i].x + 1,enemyList[i].y)){ stepEnemyBase(i,"x+"); }else if(checkBlock("block",enemyList[i].x - 1,enemyList[i].y) && checkBlock("enemy",enemyList[i].x - 1,enemyList[i].y)){ stepEnemyBase(i,"x-"); } }else{ damageHero(10,50,i); } }else if(yHero > enemyList[i].y){ if(checkBlock("player",enemyList[i].x,enemyList[i].y + 1)){ if(checkBlock("block",enemyList[i].x,enemyList[i].y + 1) && checkBlock("enemy",enemyList[i].x,enemyList[i].y + 1)){ stepEnemyBase(i,"y+"); }else if(checkBlock("block",enemyList[i].x + 1,enemyList[i].y) && checkBlock("enemy",enemyList[i].x + 1,enemyList[i].y)){ stepEnemyBase(i,"x+"); }else if(checkBlock("block",enemyList[i].x - 1,enemyList[i].y) && checkBlock("enemy",enemyList[i].x - 1,enemyList[i].y)){ stepEnemyBase(i,"x-"); } }else{ damageHero(10,50,i); } } }else if(yHero == enemyList[i].y){ if(xHero < enemyList[i].x){ if(checkBlock("player",enemyList[i].x - 1,enemyList[i].y)){ if(checkBlock("block",enemyList[i].x - 1,enemyList[i].y) && checkBlock("enemy",enemyList[i].x - 1,enemyList[i].y)){ stepEnemyBase(i,"x-"); }else if(checkBlock("block",enemyList[i].x,enemyList[i].y + 1) && checkBlock("enemy",enemyList[i].x,enemyList[i].y + 1)){ stepEnemyBase(i,"y+"); }else if(checkBlock("block",enemyList[i].x,enemyList[i].y - 1) && checkBlock("enemy",enemyList[i].x,enemyList[i].y - 1)){ stepEnemyBase(i,"y-"); } }else{ damageHero(10,50,i); } }else if(xHero > enemyList[i].x){ if(checkBlock("player",enemyList[i].x + 1,enemyList[i].y)){ if(checkBlock("block",enemyList[i].x + 1,enemyList[i].y) && checkBlock("enemy",enemyList[i].x - 1,enemyList[i].y)){ stepEnemyBase(i,"x+"); }else if(checkBlock("block",enemyList[i].x,enemyList[i].y + 1) && checkBlock("enemy",enemyList[i].x,enemyList[i].y + 1)){ stepEnemyBase(i,"y+"); }else if(checkBlock("block",enemyList[i].x,enemyList[i].y - 1) && checkBlock("enemy",enemyList[i].x,enemyList[i].y - 1)){ stepEnemyBase(i,"y-"); } }else{ damageHero(10,50,i); } } }else if(xHero > enemyList[i].x){//x + if(checkBlock("block",enemyList[i].x + 1,enemyList[i].y) && checkBlock("enemy",enemyList[i].x + 1,enemyList[i].y)){ stepEnemyBase(i,"x+"); }else if(checkBlock("block",enemyList[i].x,enemyList[i].y + 1) && checkBlock("enemy",enemyList[i].x,enemyList[i].y + 1)){ stepEnemyBase(i,"y+"); }else if(checkBlock("block",enemyList[i].x,enemyList[i].y - 1) && checkBlock("enemy",enemyList[i].x,enemyList[i].y - 1)){ stepEnemyBase(i,"y-"); } }else if(xHero < enemyList[i].x){//x - if(checkBlock("block",enemyList[i].x - 1,enemyList[i].y) && checkBlock("enemy",enemyList[i].x - 1,enemyList[i].y)){ stepEnemyBase(i,"x-"); }else if(checkBlock("block",enemyList[i].x,enemyList[i].y + 1) && checkBlock("enemy",enemyList[i].x,enemyList[i].y + 1)){ stepEnemyBase(i,"y+"); }else if(checkBlock("block",enemyList[i].x,enemyList[i].y - 1) && checkBlock("enemy",enemyList[i].x,enemyList[i].y - 1)){ stepEnemyBase(i,"y-"); } }else if(yHero > enemyList[i].y){//y - if(checkBlock("block",enemyList[i].x,enemyList[i].y - 1) && checkBlock("enemy",enemyList[i].x,enemyList[i].y - 1)){ stepEnemyBase(i,"y-"); }else if(checkBlock("block",enemyList[i].x + 1,enemyList[i].y) && checkBlock("enemy",enemyList[i].x + 1,enemyList[i].y)){ stepEnemyBase(i,"x+"); }else if(checkBlock("block",enemyList[i].x - 1,enemyList[i].y) && checkBlock("enemy",enemyList[i].x - 1,enemyList[i].y)){ stepEnemyBase(i,"x-"); } }else if(yHero < enemyList[i].y){//y + if(checkBlock("block",enemyList[i].x,enemyList[i].y + 1) && checkBlock("enemy",enemyList[i].x,enemyList[i].y + 1)){ stepEnemyBase(i,"y+"); }else if(checkBlock("block",enemyList[i].x + 1,enemyList[i].y) && checkBlock("enemy",enemyList[i].x + 1,enemyList[i].y)){ stepEnemyBase(i,"x+"); }else if(checkBlock("block",enemyList[i].x - 1,enemyList[i].y) && checkBlock("enemy",enemyList[i].x - 1,enemyList[i].y)){ stepEnemyBase(i,"x-"); } }else{ console.log("Вы в другом пространстве!"); } } enemyStep = 0; stopTimer = 3; }else{ enemyStep = 0; stopTimer = 3; } } }
SetInterval
.... or requestAnimationFrame - in order to loop something ............... while the movement will be for exampledir * speed * deltaTime
, wheredir
is the direction of movement,speed
is speed anddeltaTime
is the amount of time that has passed since calling the last frame (calling the redraw function) - Alexey Shimansky