java 如何计算鼠标坐标到世界坐标,同时改变分辨率

edqdpe6u  于 2023-09-29  发布在  Java
关注(0)|答案(1)|浏览(95)

我正在处理一个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);

我怀疑resolution changes时,s2wXs2wY变量中的鼠标坐标计算不正确。有人能帮助我了解如何正确计算鼠标在世界空间中的坐标,同时适应分辨率的变化吗?
它在720 x480窗口和全屏上工作得非常好,因为它指向0,0到左上角。但是当我试图增加分辨率时,我有一个偏移。红色标记指向鼠标光标。

更新:@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));
rta7y2nd

rta7y2nd1#

试试这个:

int mouseX; // Current mouse X position in screen space
int mouseY; // Current mouse Y position in screen space

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;

Game.s2wX = (int) (((mouseX - translationX) / scalingFactorX) - (-x - width / 2 + (Window.SCALED_WIDTH() / (scalingFactorX * s)) / 2));
Game.s2wY = (int) (((mouseY - translationY) / scalingFactorY) - (-y - height / 2 + (Window.SCALED_HEIGHT() / (scalingFactorY * s)) / 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;

int screenX = mouseX - translationX;
int screenY = mouseY - translationY;

Game.s2wX = (int) (screenX / scalingFactorX);
Game.s2wY = (int) (screenY / scalingFactorY);

在这段代码中,我根据分辨率变化时的世界空间来调整鼠标坐标。

相关问题