@Adsdasus

Почему значение не хочет «равниться»?

Решил заморочится с написанием двух отдельных функций по передвижению, где одна "обрабатывает" получаемые данные, а другая их рассчитывает.
Алгоритм: активация определённого "триггера передвижения" требует состояние "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();


Можно доработать код(желательно указать комментариями где произошла доработка) и добавлять новые переменные во имя исправления ошибки.
  • Вопрос задан
  • 157 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы