Я работаю над 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 неверен, когда resolution changes. Может ли кто-нибудь помочь мне понять, как правильно рассчитывать координаты мыши в мировом пространстве с учетом изменений разрешения?
Он прекрасно работает в оконном и полноэкранном режиме 720x480, поскольку указывает 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));
ОБНОВЛЕНИЕ (1 ОКТЯБРЯ): снова изменил код. В полноэкранном режиме есть смещение на половину строки, но теперь оно рассчитывается правильно, если оно фиксировано в оконном режиме 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));
РЕШЕНО (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));




Попробуй это:
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);
В этом коде я настраиваю координаты мыши в соответствии с мировым пространством при изменении разрешения.
Я обновил свой код, посмотрите.
Я использовал первый предоставленный вами код и думаю, что он почти готов. Обновил пост.
Приятно знать, что.
Мышь (0, 0) указывала в правый нижний угол, но когда я меняю разрешение, длина линии меняется. Думаю, я доберусь туда.