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; } } } 

  • Try to break into f-ii, no more than 15-20 lines each. - Vladimir Gamalyan
  • What exactly needs to be broken down into functions? Every movement? If I understand you correctly, then nothing will come of it, I’m having a check to see if there is a block in front of the mobs, and if I do what you say, then I’ll be checking backward. the check will take place a couple of times, and if there is no block in front of the mobs, but it is on the block further, then the mob will quietly pass there, because it is still at that stage where there is no block in front of it - edikxl
  • All that can be broken break. So few people will read this code. - Vladimir Gamalyan
  • And do not be limited to one partition. You have many blocks with very similar code, it makes sense to put the repeating code into a separate function, and transfer all the differences as parameters to this function. - fori1ton
  • one
    For traffic, discover at least SetInterval .... or requestAnimationFrame - in order to loop something ............... while the movement will be for example dir * speed * deltaTime , where dir is the direction of movement, speed is speed and deltaTime is the amount of time that has passed since calling the last frame (calling the redraw function) - Alexey Shimansky

1 answer 1

Solved a problem with a delay in rendering. Could in fact be in place, but for the user, they only move. Thanks for the suggestion