Как вычислить координаты мыши в мировых координатах при изменении разрешения

Я работаю над 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));
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
58
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Попробуй это:

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) указывала в правый нижний угол, но когда я меняю разрешение, длина линии меняется. Думаю, я доберусь туда.

GDjkhp 28.09.2023 09:34

Я обновил свой код, посмотрите.

HassanUsman 28.09.2023 09:53

Я использовал первый предоставленный вами код и думаю, что он почти готов. Обновил пост.

GDjkhp 28.09.2023 11:15

Приятно знать, что.

HassanUsman 28.09.2023 12:00

Другие вопросы по теме