如何在KineticJS中获取点击事件相对于其层的位置
How to get the position of a click event relative to its layer in KineticJS?
我正在用HTML5开发一个十六进制网格策略游戏,由于在UI中添加更多按钮变得很复杂,我正在使用KineticJS重写代码来绘制画布。
在我的游戏中,有一个小地图,里面有一个矩形显示玩家相机的位置。当玩家点击小地图时,他的相机中心将设置为他点击的位置。我的原始代码不使用任何外部库,看起来像这样:
this.on('click', function(event){
var canvas = document.getElementById('gameCanvas');
var x = event.pageX - canvas.offsetLeft;
var y = event.pageY - canvas.offsetTop;
camera.setPos( // calculate new position based on x and y....);
}
})
所以基本上我想要的是点击事件相对于画布的位置。由于现在KineticJS控制了画布,并且它不允许我设置画布id,所以我不能再使用getElementById
来选择我的画布了。还有别的办法吗?
可能有一些方法我不知道可以设置画布id,但我期待着一个更优雅的解决方案,理想的是通过KineticJS API。
谢谢。
要获取鼠标在舞台(画布)上的位置,可以使用:
var mouseXY = stage.getPointerPosition();
var canvasX = mouseXY.x;
var canvasX = mouseXY.y;
你可以用同样的方式点击形状内的鼠标位置:
myShape.on('click', function() {
var mouseXY = stage.getPointerPosition();
var canvasX = mouseXY.x;
var canvasY = mouseXY.y;
});
好问题,我想您要找的是getAbsolutePosition()。根据我的经验,以下是一些有用的东西。
getPosition()
node x/y position relative to parent
if your shape is in layer, x/y position relative to layer
if your shape is in group, x/y position relative to group
getParent()
To know what parent node is
getX()
x position relative to parent
getY()
y position relative to parent
获取绝对位置()
absolute position relative to the top left corner of the stage container div
没有什么比更有用的了
getScale()
if your stage is zoomed in or out, better to know this.
所有内容都在文档中,http://kineticjs.com/docs/symbols/Kinetic.Node.php
这是一个老问题,但正如我所看到的,最佳答案没有考虑轮换。
这是我基于Kinetic v.1.0的解决方案。他们考虑到了所有的转变。
var myStage = new Kinetic.Stage();
var myShape = new Kinetic.Shape(); // rect / circle or whatever
myShape.on('click', function(){
var mousePos = myStage.getPointerPosition();
var p = { x: mousePos.x, y: mousePos.y }; // p is a clone of mousePos
var r = myShape.getAbsoluteTransform().copy().invert().point(mousePos);
// r is local coordinate inside the shape
// mousePos is global coordinates
})
我发现最好的方法是…
var bgxy = bg.getAbsolutePosition();
var x = event.pageX - stage.getContainer().offsetLeft - bgxy.x;
var y = event.pageY - stage.getContainer().offsetTop - bgxy.y;
您应该使用event.layerX
和event.layerY
:
this.on('click', function(event){
var canvas = document.getElementById('gameCanvas');
var x = event.layerX;
var y = event.layerY;
camera.setPos( // calculate new position based on x and y....);
}
})
相关文章:
- 我可以获得相对于被点击元素的确切点击位置吗
- JavaScript:单击时相对于父级增加变量值
- 打开相对于鼠标位置的CSS3/HTML5模式对话框
- 相对于角度控制器中的另一个阵列过滤阵列项目
- Javascript元素相对于屏幕的位置
- 块相对于父对象的位置
- 如果元素在容器外部,是否可以相对于容器以绝对定位来定位该元素
- 如何相对于浏览器窗口定位DIV
- 立即调用函数表达式(IIFE)相对于普通函数的优势
- 获取插入符号相对于行可见起点的位置
- 如何使Highcharts中的渲染标签始终可见,并且相对于单击或悬停的点仍然可见
- 正在获取单击的元素相对于整个文档的索引
- jQuery"悬停时放大”;无法相对于图片中心放大
- 获取相对于窗口的IFRAME位置
- 将相对于选择器的变量传递给多个 jQuery 事件
- 如何相对于导致更改的单击事件对 ng 重复项进行动画处理
- 相对于处理程序事件的按键事件
- 绑定事件相对于创建它的类
- 函数式响应式编程相对于事件侦听器的优势
- 如何在KineticJS中获取点击事件相对于其层的位置