Javascript 二维平面,所以你需要做一些线性代数投影,可能是使用你观察瓷砖的角度。我没有使用三维平面-它是一个二维平面模仿一个三维平面,重要的是模仿部分。假装你可以“旋转”你的世界。这样你就能看到不同的瓷砖了,对吗?向上倾斜角度,使您的视线垂直向下?然后你可以很容易地找

Javascript 二维平面,所以你需要做一些线性代数投影,可能是使用你观察瓷砖的角度。我没有使用三维平面-它是一个二维平面模仿一个三维平面,重要的是模仿部分。假装你可以“旋转”你的世界。这样你就能看到不同的瓷砖了,对吗?向上倾斜角度,使您的视线垂直向下?然后你可以很容易地找,javascript,isometric,Javascript,Isometric,二维平面,所以你需要做一些线性代数投影,可能是使用你观察瓷砖的角度。我没有使用三维平面-它是一个二维平面模仿一个三维平面,重要的是模仿部分。假装你可以“旋转”你的世界。这样你就能看到不同的瓷砖了,对吗?向上倾斜角度,使您的视线垂直向下?然后你可以很容易地找到你的鼠标所在的瓷砖。因此,要么考虑倾斜和旋转角度,要么考虑鼠标输入和离开事件的边界框侦听器,要么完全放弃鼠标,只使用键盘选择一个磁贴。如果我正确理解了本文,这正是我用来计算磁贴位置的方法。但是,我的问题是,当某些瓷砖具有较高的标高时,瓷砖的侧


二维平面,所以你需要做一些线性代数投影,可能是使用你观察瓷砖的角度。我没有使用三维平面-它是一个二维平面模仿一个三维平面,重要的是模仿部分。假装你可以“旋转”你的世界。这样你就能看到不同的瓷砖了,对吗?向上倾斜角度,使您的视线垂直向下?然后你可以很容易地找到你的鼠标所在的瓷砖。因此,要么考虑倾斜和旋转角度,要么考虑鼠标输入和离开事件的边界框侦听器,要么完全放弃鼠标,只使用键盘选择一个磁贴。如果我正确理解了本文,这正是我用来计算磁贴位置的方法。但是,我的问题是,当某些瓷砖具有较高的标高时,瓷砖的侧面以及瓷砖本身必须通过鼠标进行选择,并且如果后面的瓷砖隐藏在另一个瓷砖后面,则不能选择它。因此,没有捷径;您必须计算可能位于的整个分幅集,然后取最前面的一个,通常是行+列最少的分幅集。最小化的确切功能将取决于您的投影和编号,但将是(+/-)行(+/-)列(+/-列)的(最小或最大)。“便宜”的方法是在屏幕或彩色托盘上使用z值来编码瓷砖编号。这是一种有趣的方法。但是,可以为高架瓷砖的侧面做些什么?我的第一个想法是检查鼠标是否位于提升的瓷砖和地面上相同瓷砖之间的矩形内,但是如果前面的瓷砖提升程度较低,则会出现错误,选择后面的瓷砖(具有较高的标高),而不是正确选择前面的瓷砖(略低的标高).你说得对,这种方法不解决在垂直(“墙”)表面上单击的问题,而只处理在水平(“屋顶”)表面上单击的问题。问题描述没有说明单击“墙”时的行为。它应该是一个noop还是与单击瓷砖的“屋顶”相同?我选择了“简单”的行为,并将墙视为点击浏览这应该和在瓷砖屋顶上点击一样。这是一个漂亮的答案。这里有一个非常类似的新问题:
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);
}
function getTile(mousePt, tiles) {
    var maxElevation = getMaxElevation(tiles);
    var minElevation = getMinElevation(tiles);
    var elevation;
    for (elevation = maxElevation; elevation >= minElevation; elevation--) {
        var pt = getTileCoordinates(mousePt, elevation);
        if (tiles[pt.x][pt.y].elevation === elevation) {
            return pt;
        }
    }
    return null; // not tile hit
}