我正在制作一个Java game
,我需要计算鼠标在世界空间中的坐标,同时改变游戏窗口的resolution
.我目前使用以下代码来执行计算:
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);
我怀疑鼠标坐标在计算s2wX
和s2wY
变量时是不正确的.有人能帮我理解一下如何在适应分辨率变化的同时正确计算鼠标在世界空间中的坐标吗?
它在720x480窗口和全屏幕上运行得非常好,因为它指向0,0到左上角.但当我试图提高分辨率时,我会有一个补偿.红色标记指向鼠标光标.
UPDATE: @HassanUsman is pointing out scaling factors and it's almost done, but with minor issues:
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日):再次修改代码.全屏上有1/2行偏移量,但如果固定在720x480窗口,它现在可以正确计算.
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日)
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));