Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使图像以正确的速度在屏幕上移动,以适应所有显示_Java - Fatal编程技术网

Java 使图像以正确的速度在屏幕上移动,以适应所有显示

Java 使图像以正确的速度在屏幕上移动,以适应所有显示,java,Java,我有一个自上而下的射手使用绘画方法,我想它的所有显示工作。它的工作原理是获得分辨率,然后将x和y除以40,将其全部分割成正方形。 我让子弹移动的方法是用线和移动法 public void move(){ x += dx; y += dy; } 但是如果个人电脑更小,子弹在屏幕上的移动速度会更快。如何让它在较小的屏幕上以较慢的速度移动,在较大的屏幕上以较快的速度移动? 谢谢你的建议。你说的慢是什么意思?你是说子弹在屏幕上移动的总时间(以秒为单位)在不同的设备上是不同的吗 假设您按照描述正确地完成

我有一个自上而下的射手使用绘画方法,我想它的所有显示工作。它的工作原理是获得分辨率,然后将x和y除以40,将其全部分割成正方形。 我让子弹移动的方法是用线和移动法

public void move(){
x += dx;
y += dy;
}
但是如果个人电脑更小,子弹在屏幕上的移动速度会更快。如何让它在较小的屏幕上以较慢的速度移动,在较大的屏幕上以较快的速度移动?
谢谢你的建议。

你说的慢是什么意思?你是说子弹在屏幕上移动的总时间(以秒为单位)在不同的设备上是不同的吗


假设您按照描述正确地完成了所有计算,我认为您忘记了一个因素:不同的设备具有不同的计算速度(也可能是屏幕更新速度),因此一个设备中的“勾号”可能比其他设备长或短。所以,当您调用move时,您应该计算上次调用move()所经过的时间,然后根据它计算dx和dy。希望这是有意义的

我想你忘了不是每台计算机都以相同的速度运行,如果你能以最快的速度进行循环,那么每台计算机上的运行速度都会非常不同。我建议实施增量缩放,这包括对最后一帧进行计时,比如说您想要60fps,这意味着它需要16毫秒,所以请将时间除以如下:

int lastframe = getFrameTime();
float scaler = lastFrame/(1000f/targetFrameRate)
public void move() {
    x += dx * scaler;
    y += dy * scaler;
}
然后将所有运动乘以这个比例。例如:

int lastframe = getFrameTime();
float scaler = lastFrame/(1000f/targetFrameRate)
public void move() {
    x += dx * scaler;
    y += dy * scaler;
}

A还可以看到不同屏幕尺寸的速度更快是什么意思,这是因为像素密度,要获得这一点,您必须获得屏幕物理尺寸以及分辨率。例如,如果您的屏幕为20mm宽,其1280x720为20/1280,则每个像素的宽度为0.015mm。然后,您可以使用上述标量技术缩放它们,以移动物理世界的速度

你的措辞令人困惑。你想让所有子弹在相同的时间内穿过屏幕,还是让子弹具有相同的速度(以像素/秒为单位)?我想让子弹在相同的时间内穿过屏幕。如果我有一个更大的屏幕,并使用我的移动方法,如果我有一个更小的屏幕,子弹从屏幕的一侧移动到另一侧需要更长的时间。因为更小的屏幕会有更少的像素,所以会更快。我希望子弹在所有尺寸的屏幕上从屏幕的一侧移动到另一侧所花费的时间相同。希望这会有帮助。当你得到屏幕分辨率并将其除以40时,看起来应该注意屏幕大小的差异。没有考虑的是调用move()的时间。在速度较快的设备中,move()可能每秒被调用60次,而在速度较慢的设备中,它可能每秒被调用30次。我这样做是为了使它在所有计算机上都能以相同的帧速率工作,方法是在设定的时间量后进行更新。所以我计算了你刚才提到的时间,理论上应该是这样的。我想问题出在代码的某个地方。也许你应该发布更多的代码,有人可以帮你检查。作为调试提示,您的项目符号在屏幕上的移动应该正好需要40帧。也许你应该在第40帧检查你的子弹在哪里。