我正在制作一个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);

我怀疑鼠标坐标在计算s2wXs2wY变量时是不正确的.有人能帮我理解一下如何在适应分辨率变化的同时正确计算鼠标在世界空间中的坐标吗?

它在720x480窗口和全屏幕上运行得非常好,因为它指向0,0到左上角.但当我试图提高分辨率时,我会有一个补偿.红色标记指向鼠标光标.

preview

UPDATE: @HassanUsman is pointing out scaling factors and it's almost done, but with minor issues: screentoworldfast

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窗口,它现在可以正确计算.

enter image description here

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));

推荐答案

试试这个:

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);

在这段代码中,当分辨率改变时,我根据世界空间调整了鼠标坐标.

Java相关问答推荐

我应该避免在Android中创建类并在运行时编译它们吗?

如果给定层次 struct 级别,如何从其预序穿越构造n元树

Quarkus keycloat配置不工作.quarkus. keycloak. policy—enforcer. enable = true在. yaml表示中不工作

如果一个子类没有构造函数,超类也没有构造函数,那么为什么我可以构造子类的实例呢?

Java FX中的河内之塔游戏-在游戏完全解决之前什么都不会显示

Java中如何根据Font.canDisplay方法对字符串进行分段

如何获得执行人?

RichFaces 3.x-Spring Boot-迁移web.xml

如何在Java中从XML中获取特定的 node ,然后将其删除?

如何修复PDF重建过程中的文本定位

JDK 21-为什么线程局部随机S nextInt不直接用Super.nextInt实现?

使用Room Database删除Jetpack合成中的所有项目后,UI未重新合成

无法播放音频:从资源加载库GStreamer-Lite失败

Domino中不同的java.Protocol.handler.pkgs设置在XPages Java中导致错误

FETCH类型设置为LAZY,但它仍会发送第二个请求

为什么我不能建立输入/输出流?Java ServerSocket

使IntelliJ在导入时优先 Select 一个类或将另一个标记为错误

使用MediaPlayer类在一段时间后停止播放音乐

java中的网上购物车解析错误

Java ModbusRTU写寄存器