Решил заморочится с написанием двух отдельных функций по передвижению, где одна "обрабатывает" получаемые данные, а другая их рассчитывает.
Алгоритм: активация определённого "триггера передвижения" требует состояние "work"(массив [0]) и ключ(из true и false)(массив [1-2]) .
Есть возможность сделать это с if, но нужна максимальная оптимизация от if.
Возможно, проблема в том что вместо активации определённого триггера оно активирует сразу все, и ничего не работает.
Кину весь скрипт чтобы понять суть. Внимание стоит проявить на функции uptade(С комментарием "вычисление физики и данных").
Вот весь скрипт:
let canvas = document.getElementById('canvas');
let ctx = canvas.getContext('2d');
canvas.width = 450;
canvas.height = 450;
document.addEventListener('keydown', function (e) {keydown_about[0] = e.keyCode; keydowner = true} );
document.addEventListener('keyup', function (e) {keydown_about[0] = e.keyCode; keydowner = false;} );
let world = [
{x:10,y:30,t:50,c:'red'},
{x:50,y:100,t:50,c:'green'},
];
let x,y,t,c;
let keydowner = false;
let keydown_about = [,['',false,true],['',true,true],['',false,false],['',true,false]];
function get() {
//Обработка информации от пользователя
if (keydowner) {
switch(keydown_about[0]) {
case 87: //W
keydown_about[1] = ["work", false, true];//Сообщение, не по x(y), инверсия(--)
break;
case 65: //A
keydown_about[2] = ["work", true, true];//Сообщение, по x, инверсия(--)
break;
case 83: //S
keydown_about[3] = ["work", false, false];//Сообщение, не по x(y), не инверсия(++)
break;
case 68: //D
keydown_about[4] = ["work", true, false];//Сообщение, по x(y), не инверсия(++)
break;
}
} else {
switch(keydown_about[0]) {
case 87: //W
keydown_about[1] = ["", false, true];
break;
case 65: //A
keydown_about[2] = ["", true, true];
break;
case 83: //S
keydown_about[3] = ["", false, false];
break;
case 68: //D
keydown_about[4] = ["", true, false];
break;
}
}
}
function update() {
//Вычисление данных, физика
for(let i=1;i<keydown_about.length;i++) {
switch(true) {
case ((keydown_about[i][0] === "work")&!keydown_about[i][1]&keydown_about[i][2]): //x--
world[0].x-=1;
break;
case ((keydown_about[i][0] === "work")&keydown_about[i][1]&keydown_about[i][2]): //x++
world[0].x+=1;
break;
case ((keydown_about[i][0] === "work")&!keydown_about[i][1]&!keydown_about[i][2]): //y--
world[0].y-=1;
break;
case ((keydown_about[i][0] === "work")&keydown_about[i][1]&!keydown_about[i][2]): //y++
world[0].y+=1;
break;
}
}
}
function clear() {
//Рендеринг, обновление холста
ctx.fillStyle = "gray";
ctx.fillRect(0,0,canvas.width,canvas.height)
for(let i=0;i<world.length;i++) {
x = world[i].x;
y = world[i].y;
t = world[i].t;
c = world[i].c;
ctx.fillStyle=c;
ctx.fillRect(x,y,t,t);
}
}
function AllTogether () {
get();
update();
clear();
requestAnimationFrame(AllTogether);
}
AllTogether();
Можно доработать код(желательно указать комментариями где произошла доработка) и добавлять новые переменные во имя исправления ошибки.