我有一个基于图块的等距世界,我可以使用以下计算来计算哪个图块位于特定(鼠标)坐标下方:
function isoTo2D(pt:Point):Point{
var tempPt:Point = new Point(0, 0);
tempPt.x = (2 * pt.y + pt.x) / 2;
tempPt.y = (2 * pt.y - pt.x) / 2;
return(tempPt);
}
function getTileCoordinates(pt:Point, tileHeight:Number):Point{
var tempPt:Point = new Point(0, 0);
tempPt.x = Math.floor(pt.x / tileHeight);
tempPt.y = Math.floor(pt.y / tileHeight);
return(tempPt);
}
(取自http://gamedevelopment.tutsplus.com/tutorials/creating-isometric-worlds-a-primer-for-game-developers--gamedev-6511 http://gamedevelopment.tutsplus.com/tutorials/creating-isometric-worlds-a-primer-for-game-developers--gamedev-6511,这是一个 Flash 实现,但数学原理是相同的)
However, my problem comes in when I have tiles that have different elevation levels:
![enter image description here](https://i.stack.imgur.com/sACIL.gif)
在这些情况下,由于某些具有较高标高的图块的高度,后面的图块(或图块的一部分)被覆盖,并且不应该能够通过鼠标选择,而是选择前面的图块它的。
如何通过鼠标坐标计算图块并考虑图块的标高?
我正在使用 javascript 和 canvas 实现。
有一种技术可以捕获鼠标下方的对象canvas
无需将鼠标坐标重新计算为“世界”坐标。这并不完美,有一些缺点和限制,但它在一些简单的情况下可以发挥作用。
1)放置另一个canvas
在你的主要之上canvas
并设置它的opacity
到 0。确保你的第二个canvas
具有相同的大小并与您的主要部分重叠。
2) 每当您将交互式对象绘制到主窗口时canvas
,在第二个画布上绘制并填充相同的对象,但每个对象使用一种唯一的颜色(来自#000000
to #ffffff
)
3) 将鼠标事件处理设置到第二个画布。
4) Use getPixel
在第二个canvas
在鼠标位置获取单击/悬停的对象的“id”。
主要优点是WYSIWYG
原则上,所以(如果一切都正确完成)你可以确定,主要的对象canvas
与第二个位于同一位置canvas
,因此您无需担心画布大小或对象的调整depth
(就像你的情况一样)计算以获得正确的对象。
主要缺点是需要“双重渲染”整个场景,但可以通过在不需要时不在第二个画布上绘制来优化它,例如:
主要限制是场景中交互对象的最大数量(最多#ffffff
或 16777215 个对象)。
所以...不推荐用于:
适合:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)