У меня есть массив, который заполнен позициями многих разных объектов в моей игре, и то, что я пытаюсь достичь, - это когда мышь находится на объекте на холсте, пользователь может щелкните, а затем появится окно (будет меню).Мышь щелкните по массиву объектов javascript Canvas
Вот код, у меня есть уже:
this.init_inv = function(value){
canvas.onmousemove = function (e) {
var x, y;
for(var i = 0;i < value.length; i++){
// Get the mouse position relative to the canvas element.
if (e.layerX || e.layerX) { //for firefox
x = e.layerX;
y = e.layerY;
}
x-=canvas.offsetLeft;
y-=canvas.offsetTop;
if(x>=value[i][0] && x <= (value[i][0] + value[i][2]) &&
y<=value[i][1]&& y >= (value[i][1]-value[i][2])){
document.body.style.cursor = "pointer";
inObject=true;
}
else{
document.body.style.cursor = "";
inObject=false;
}
}
};
canvas.addEventListener("click", on_click, false);
};
Обработчик нажмите выглядит следующим образом:
function on_click(e) {
if (inLink) {
var dataString = {"save": "true", "level":level, "location_X":pos_X, "location_Y":pos_Y};
$.ajax({
type:"POST",
url:"PHP/class.ajax.php",
data: dataString,
dataType: "JSON",
success: function(success){
alert("Saved");
},
error:function(){
alert("Not Saved");
}
});
}
if(inObject){
console.log("hovering");
}
}
У меня есть отдельный обработчик щелчка, потому что мне нужно обрабатывать щелчки на разных частях разные холсты.
Я считаю, что проблема заключается в том, как я читаю значения в массиве, но не знаю, как это сделать. Я знаю это, потому что, если я ввожу int, где значения value[i][0]
и т. Д., Я могу щелкнуть в указанной области и триггерах щелчка, и я получаю журнал консоли.
массив выглядит следующим образом:
var array = [
[pos_x,pox_y, size]
//etc...
];
Обычно вы справляетесь с этим, перемещая элементы на холсте и просто прикрепляя к ним обработчики кликов, а не отслеживая mousemove и определяя позицию щелчка, просматривая вещи в массиве; есть ли причина, по которой вы не просто используете эту встроенную функциональность? –
Возможно, вам захочется взглянуть на библиотеку, такую как [KineticJS] (http://www.html5canvastutorials.com/kineticjs/html5-canvas-listen-or-dont-listen-to-events-with-kineticjs/), чтобы помочь вам если вы хотите реагировать на события по конкретным элементам на холсте. @ChrisMoschini Canvas не позволяет связать обработчики событий с элементами холста, поскольку все растрируется, а векторы не сохраняются. –
Как вы определяете другую часть холста? единственный способ, которым я могу думать, - это 1 слушатель мыши, который имеет 2 разных ifs, основанных на местоположении. Пример 1D: if (x <10) {listener1}, если (x <20) {слушатель 2} – Drakoumel