Ver*_*rne 7 javascript html5 drag-and-drop canvas html5-canvas
我正在寻找最快最轻的方法来在JS Canvas上拖放形状和精灵以进行游戏开发.
我开始使用当前鼠标位置和圆圈的起点进行距离检查.它可以工作,但是当它们重叠时我们会遇到问题,而且我不知道在每个'框架'上测试多个精灵和其他形状时它的效果如何.
任何评论或指向更好的方法表示赞赏!
我宁愿不使用类似jQuery的库,因为我要求纯粹的速度和轻松,当然要学习实际的方法!这是我在的地方:
//add the canvas listeners and functions
canvas.addEventListener("mousemove",mousemove);
canvas.addEventListener("mousedown",mousedown);
canvas.addEventListener("mouseup",mouseup);
function mousemove(e){
mouseX = e.layerX - canvas.offsetLeft;
mouseY = e.layerY - canvas.offsetTop;
//for each circle stored in my array of Circle objects, is my mouse within its'
//bounds? If so, set the circles' (X,Y) to my mouse's (X,Y)
for(i=0;i<circArray.length;i++){
dx = mouseX - circArray[i].x;
dy = mouseY - circArray[i].y;
dist = Math.sqrt((dx*dx) + (dy*dy));
if(draggable && dist < circArray[i].r){
circArray[i].x = mouseX;
circArray[i].y = mouseY;
}
}
}
function mousedown(){
draggable = true;
}
function mouseup(){
draggable = false;
}
Run Code Online (Sandbox Code Playgroud)
小智 3
这是我用于拖动单个项目的设置。我不知道你是否想拖动多个东西,这只是一个小小的修改。
换句话说:在 mousedown 中,按照您绘制对象的保留顺序搜索击中对象(因此最上面的项目首先被击中),存储此击中项目,然后 mousedrag 只是通过管道将坐标/增量传递给该项目。
//start with only the mousedown event attached
canvas.addEventListener("mousedown",mousedown);
//and some vars to track the dragged item
var dragIdx = -1;
var dragOffsetX, dragOffsetY;
function mousedown(e){
//...calc coords into mouseX, mouseY
for(i=circArray.length; i>=0; i--){ //loop in reverse draw order
dx = mouseX - circArray[i].x;
dy = mouseY - circArray[i].y;
if (Math.sqrt((dx*dx) + (dy*dy)) < circArray[i].r) {
//we've hit an item
dragIdx = i; //store the item being dragged
dragOffsetX = dx; //store offsets so item doesn't 'jump'
dragOffsetY = dy;
canvas.addEventListener("mousemove",mousemove); //start dragging
canvas.addEventListener("mouseup",mouseup);
return;
}
}
}
function mousemove(e) {
//...calc coords
circArray[dragIdx].x = mouseX + dragOffsetX; //drag your item
circArray[dragIdx].y = mouseY + dragOffsetY;
//...repaint();
}
function mouseup(e) {
dragIdx = -1; //reset for next mousedown
canvas.removeListener(.... //remove the move/up events when done
}
Run Code Online (Sandbox Code Playgroud)
我的 js 目前已经生锈了,但这应该给出这个想法。DragOffsetX/Y 用于防止项目在单击时跳转到光标处。您也可以只存储旧的鼠标坐标并向您的项目添加增量。
此外,您可以存储对拖动项目的引用,或者存储用于拖动多个项目的引用数组,而不是存储拖动项目的索引。您可以在它们上面放置一个鼠标向下/拖动/向上界面来让它们处理它,而不是直接操作您的项目。这将使混合其他类型的物品变得更容易。
我不确定的另一件事是你如何计算坐标。我做了一些不同的事情,但它是较旧的代码,我猜你的方法也可以测量。-t
| 归档时间: |
|
| 查看次数: |
9838 次 |
| 最近记录: |