我有一个安卓游戏,其中使用此代码在所有设备上缩放画布看起来相同:
canvas.scale((float)(getWidth()/(double)WIDTH), (float)(getHeight()/(double)HEIGHT))
其中WIDTH
和HEIGHT
分别为1920和1080。我的问题是,我的所有触摸碰撞(即用户触摸形状)都是使用Path
和Region
来处理的:
public static boolean collided(Path a, Path b) {
Region clip = new Region(0,0,3000, 3000);
Region rA = new Region();
rA.setPath(a, clip);
Region rB = new Region();
rB.setPath(b, clip);
return !rA.quickReject(rB) && rA.op(rB, Region.Op.INTERSECT);
}
现在我还有另一种缩放方法(我可以告诉它几乎没有任何影响,但有时会产生影响)来缩放坐标和尺寸:
public static double scale(double x) {
return dpToPx(x)/Resources.getSystem().getDisplayMetrics().density;
}
我的问题是,通过所有这些缩放,我似乎无法让鼠标处于正确的位置。这是我用来创建鼠标Path
的代码,用于处理鼠标和其他形状之间的碰撞:
mouse.set(x, y);
mousePath.reset();
mousePath.addRect(mouse.x - 10, mouse.y - 10, mouse.x + 10, mouse.y + 10, Path.Direction.CW);
我绘制mousePath
以查看mousePath的位置,这是我得到的结果(它是绿色框,鼠标实际位于蓝色圆圈的一般区域)
这是更严重的一点,因为我越接近(0,0),mousePath
越接近鼠标实际所在的位置。
那么如何让鼠标位于正确的位置呢?
答案 0 :(得分:0)
经过更多搜索后发现此问题与以下内容重复:https://stackoverflow.com/a/24895485/4188097。
浏览器始终以未转换的坐标返回鼠标位置。您的绘图已在变换的空间中完成。如果您想知道鼠标在变换空间中的位置,可以将未转换的鼠标坐标转换为变换后的坐标,如下所示:
var mouseXTransformed = (mouseX-panX) / scaleFactor; var mouseYTransformed = (mouseY-panY) / scaleFactor;