Java游戏分辨率变化时鼠标坐标转世界坐标的正确计算方法
Java游戏分辨率变化时鼠标世界坐标计算问题及解决过程
我正在开发一款Java游戏,需要在窗口分辨率变化时计算鼠标对应的世界空间坐标。当前使用的坐标计算代码仅在720x480窗口及全屏模式下可正常工作,提升分辨率后鼠标坐标会出现偏移(红色标记为鼠标光标)。
初始实现代码
鼠标世界坐标计算代码
Game.s2wX = (int)(((mouseX - (Window.REAL_WIDTH() / 2 - Window.SCALED_WIDTH() / 2)) / s) - (-x - width/2 + (Window.SCALED_WIDTH() / s) / 2)); Game.s2wY = (int)(((mouseY - (Window.REAL_HEIGHT() / 2 - Window.SCALED_HEIGHT() / 2)) / s) - (-y - height / 2 + (Window.SCALED_HEIGHT() / s) / 2));
游戏画面居中绘制代码
g.drawImage(image, Window.REAL_WIDTH()/2-Window.SCALED_WIDTH()/2, Window.REAL_HEIGHT()/2-Window.SCALED_HEIGHT()/2, Window.SCALED_WIDTH(), Window.SCALED_HEIGHT(),null);
迭代更新过程
第一次调整(引入缩放因子)
@HassanUsman指出需考虑缩放因子,调整后仍存在小偏移问题:
double scalingFactorX = (double) Window.SCALED_WIDTH() / Window.REAL_WIDTH(); double scalingFactorY = (double) Window.SCALED_HEIGHT() / Window.REAL_HEIGHT(); Game.s2wX = (int)(Window.SCALED_WIDTH() +(mouseX/s)+scalingFactorX - (-x - width/2 + (Window.REAL_WIDTH() /s)/2)); Game.s2wY = (int)(Window.SCALED_HEIGHT()+(mouseY/s)+scalingFactorY - (-y - height/2 + (Window.REAL_HEIGHT()/s)/2));
10月1日更新
再次修改后,720x480窗口模式计算正确,但全屏模式存在1/2线偏移:
double scalingFactorX = (double) Window.SCALED_WIDTH() / Window.REAL_WIDTH(); double scalingFactorY = (double) Window.SCALED_HEIGHT() / Window.REAL_HEIGHT(); int translationX = (Window.REAL_WIDTH() - Window.SCALED_WIDTH()) / 2; int translationY = (Window.REAL_HEIGHT() - Window.SCALED_HEIGHT()) / 2; lineX = (int) (((mouseX - translationX) / scalingFactorX) / s - (-x - width / 2 + (Window.SCALED_WIDTH() / (scalingFactorX * s)) / 2)); lineY = (int) (((mouseY - translationY) / scalingFactorY) / s - (-y - height / 2 + (Window.SCALED_HEIGHT() / (scalingFactorY * s)) / 2));
最终解决代码(10月2日)
将缩放因子的计算基准改为原始分辨率720x480后,问题完全解决:
double scalingFactorX = (double) Window.SCALED_WIDTH() / 720; double scalingFactorY = (double) Window.SCALED_HEIGHT() / 480; int translationX = (Window.REAL_WIDTH() - Window.SCALED_WIDTH()) / 2; int translationY = (Window.REAL_HEIGHT() - Window.SCALED_HEIGHT()) / 2; lineX = (int) (((mouseX - translationX) / scalingFactorX) / s - (-x - width / 2 + (Window.SCALED_WIDTH() / (scalingFactorX * s)) / 2)); lineY = (int) (((mouseY - translationY) / scalingFactorY) / s - (-y - height / 2 + (Window.SCALED_HEIGHT() / (scalingFactorY * s)) / 2));
内容的提问来源于stack exchange,提问作者GDjkhp
相关产品推荐
相关产品推荐

