ARR в canvas.onmouse
Товарищи! Имеем следующую часть кода, задача которой во время движения мыши считывать ее координаты по X, Y и записывать эти координаты в массивы mgx=[] и mgy=[] так, чтобы пара координат была записана туда лишь единожды, без повторения, по одному разу. Как только массив достигает значения в 16 символов, будет выполнена команда отпускания мыши.
Попробовал реализовать данную задачу работой массива внутри функции canvas.onmousedown = function(event) {...}, а именно так, что при нажатии onmouseclick мы получаем на вход первую пару координат, далее при движении onmousemove по плану идет сверка новой пары коодинат с координатами в массиве, таким образом достигается отсутствие повторений, но массив не хочет работать внутри функций onmouse. Кто шарит, подскажите что изменить в коде чтобы заработало или мб попробовать другую логику?
const canvas = document.getElementById("TFG");
const ctx = canvas.getContext("2d");
var mgx = [];
var mgy = [];
canvas.onmousedown = function(event) {
var x = event.offsetX;
var y = event.offsetY;
x = Math.floor(x/30); //работаем с боксами 30x30 пикселей по X
y = Math.floor(y/30); //и по Y соответственно
mgx.push(x);
mgy.push(y);
console.log(mgx);
console.log(mgy);
canvas.onmousemove = function(event) {
var x = event.offsetX;
var y = event.offsetY;
x = Math.floor(x/30);
y = Math.floor(y/30);
for (var i=0; i < mgy.lenght; i++) {
if (x == mgx[i] && y == mgy[i]) {
break;
}
if (i == (mgy.length - 1)) {
mgx.push(x);
mgy.push(y);
}
}
canvas.onmouseup = function() {
canvas.onmousemove = null;
}
}
}
|
const canvas = document.getElementById("TFG");
const ctx = canvas.getContext("2d");
var mgx = [];
var mgy = [];
canvas.onmousedown = function(event) {
var x = event.offsetX;
var y = event.offsetY;
x = Math.floor(x/30); //работаем с боксами 30x30 пикселей по X
y = Math.floor(y/30); //и по Y соответственно
mgx.push(x);
mgy.push(y);
console.log(mgx);
console.log(mgy);
canvas.onmousemove = function(event) {
var x = event.offsetX;
var y = event.offsetY;
x = Math.floor(x/30);
y = Math.floor(y/30);
let exist = false;
for (var i=0; i < mgy.length; i++) {
if (x == mgx[i] && y == mgy[i]) {
exist = true;
break;
}
}
if (! exist) {
mgx.push(x);
mgy.push(y);
}
if (mgy.length == 16) canvas.onmousemove = null;
}
canvas.onmouseup = function() {
canvas.onmousemove = null;
canvas.onmouseup = null;
}
}
В принципе ваш код тоже может работать, если ошибку исправить for (var i=0; i < mgy.lenght; i++) { |
Цитата:
Попробуйте так:
const BOX_SIDE_SIZE = 30;
const MAX_DISTANCE = 16;
const canvas = document.getElementById('TFG');
const ctx = canvas.getContext('2d');
const getKeyByCoordinates = ({x, y}) => `${x}*${y}`;
const getCoordinatesByEvent = e => ({
x: Math.floor(e.offsetX / BOX_SIDE_SIZE),
y: Math.floor(e.offsetY / BOX_SIDE_SIZE),
});
let coordinates = {},
coordsLength = 0,
mouseStillPressed = false;
canvas.addEventListener('mousedown', e => {
const eventCoordinates = getCoordinatesByEvent(e);
coordinates = {
[getKeyByCoordinates(eventCoordinates)]: eventCoordinates
};
coordsLength = 1;
mouseStillPressed = true;
});
canvas.addEventListener('mousemove', e => {
if (!mouseStillPressed || coordsLength >= MAX_DISTANCE) {
return;
}
const eventCoordinates = getCoordinatesByEvent(e);
const key = getKeyByCoordinates(eventCoordinates);
if (!coordinates[key]) {
coordinates[key] = eventCoordinates;
++coordsLength;
}
});
canvas.addEventListener('mousemove', e => {
mouseStillPressed = false;
});
|
Цитата:
Благодарю! Код действительно заработал после исправления ошибки, но я все таки обновил его, мне понравился ход с переменной exist |
Цитата:
Да! Только не бить по рукам, а сверху будет падать шкаф, если вовремя не отпустить! Ваш код разбирать и разбирать для понимания, взял на вооружения в качестве оптимизации, благодарю! |
Цитата:
Используется: деструктуризация, стрелочные функции, template strings, переменные let и псевдоконстанты const, работа с событиями и присвоение объекту динамического ключа (как это «по-умному» называется - не знаю). |
| Часовой пояс GMT +3, время: 01:41. |