无法理解此算法中用于 java 中相机移动的 maths/code
Trouble understanding the maths/code used within this algorithm for camera movement in java
我正在 java 参考 youtube 视频编写游戏,遇到了一些我不太了解的代码和算法。
private float x, y;
public Camera(float x, float y) {
this.x = x;
this.y = y;
}
public void tick(GameObject object) {
x += ((object.getX() - x) - 1000 / 2) * 0.05f;
y += ((object.getY() - y) - 563 / 2) * 0.05f;
System.out.println(x);
if (x <= 0)
x = 0;
if (x >= 1032)
x = 1032;
if (y <= 0)
y = 0;
if (y >= 563 + 48)
y = 563 + 48;
}
public float getX() {
return x;
}
public void setX(float x) {
this.x = x;
}
public float getY() {
return y;
}
public void setY(float y) {
this.y = y;
}
}
现在,除了这个我都明白了
x += ((object.getX() - x) - 1000 / 2) * 0.05f;
y += ((object.getY() - y) - 563 / 2) * 0.05f;
在 tick 方法中。该方法是更新相机以跟随屏幕周围的玩家。 GameObject 参数被解析为玩家对象。摄像机 x 和 y 如何使用此算法跟随玩家?为什么我们要用摄像机 x/y 减去玩家 x/y,然后再乘以一个浮点数。我得到减去 windows width / 2 和 height / 2 将播放器居中在屏幕部分的中间。
根据 RealtutsGML,浮动使相机感觉更平滑。它并没有严格固定在玩家的位置上,它会稍微滑动。但是为什么 * 0.05 会发生这种情况呢?
然后在游戏中 class 在主要渲染方法中,摄像机 getX 和 getY 方法与 graphics2D 的转换方法一起确定摄像机在游戏中的移动位置。
Graphics g = bs.getDrawGraphics();
Graphics2D g2d = (Graphics2D) g;
g.setColor(Color.BLUE);
g.fillRect(0, 0, 1000, 563);
g2d.translate(-camera.getX(), -camera.getY());
handler.render(g);
g2d.translate(camera.getX(), camera.getY());
显然,屏幕中心将位于坐标 (x + 1000 / 2, y + 563 / 2)
。考虑到这一点,让我们仔细看看公式(只有 x 部分;y 完全相同):
x += ((object.getX() - x) - 1000 / 2) * 0.05f;
重新排列括号,我们得到:
x += (object.getX() - (x + 1000 / 2)) * 0.05f;
我们看到屏幕中心就在那里。让我们用变量 c
代替它使事情更清楚:
x += (object.getX() - c) * 0.05f;
第一项object.getX() - c
是物体位置与屏幕中心的差值。因此,如果对象居中,则此差异为零。这正是我们需要移动相机以准确地将对象居中的量。如果我们有
x += (object.getX() - c);
...我们总是将对象保持在屏幕中心。但是我们有 0.05
的因素。因此,我们不会将相机移动整个距离。只是其中的一小部分。也就是说,我们正在将对象移近屏幕中心。如果距离很远,它会移动得很快(因为差异很大)。如果已经很近了,它会慢慢移动(因为差异很小)。 0.05
的因素是设置居中的即时程度。 0
的因子根本不会移动对象,1
的因子会立即使对象居中。介于两者之间的一切都代表具有不同加速度的平滑运动。您可以将此因素想象为屏幕中心和对象之间 spring 的刚度。
我正在 java 参考 youtube 视频编写游戏,遇到了一些我不太了解的代码和算法。
private float x, y;
public Camera(float x, float y) {
this.x = x;
this.y = y;
}
public void tick(GameObject object) {
x += ((object.getX() - x) - 1000 / 2) * 0.05f;
y += ((object.getY() - y) - 563 / 2) * 0.05f;
System.out.println(x);
if (x <= 0)
x = 0;
if (x >= 1032)
x = 1032;
if (y <= 0)
y = 0;
if (y >= 563 + 48)
y = 563 + 48;
}
public float getX() {
return x;
}
public void setX(float x) {
this.x = x;
}
public float getY() {
return y;
}
public void setY(float y) {
this.y = y;
}
}
现在,除了这个我都明白了
x += ((object.getX() - x) - 1000 / 2) * 0.05f;
y += ((object.getY() - y) - 563 / 2) * 0.05f;
在 tick 方法中。该方法是更新相机以跟随屏幕周围的玩家。 GameObject 参数被解析为玩家对象。摄像机 x 和 y 如何使用此算法跟随玩家?为什么我们要用摄像机 x/y 减去玩家 x/y,然后再乘以一个浮点数。我得到减去 windows width / 2 和 height / 2 将播放器居中在屏幕部分的中间。 根据 RealtutsGML,浮动使相机感觉更平滑。它并没有严格固定在玩家的位置上,它会稍微滑动。但是为什么 * 0.05 会发生这种情况呢? 然后在游戏中 class 在主要渲染方法中,摄像机 getX 和 getY 方法与 graphics2D 的转换方法一起确定摄像机在游戏中的移动位置。
Graphics g = bs.getDrawGraphics();
Graphics2D g2d = (Graphics2D) g;
g.setColor(Color.BLUE);
g.fillRect(0, 0, 1000, 563);
g2d.translate(-camera.getX(), -camera.getY());
handler.render(g);
g2d.translate(camera.getX(), camera.getY());
显然,屏幕中心将位于坐标 (x + 1000 / 2, y + 563 / 2)
。考虑到这一点,让我们仔细看看公式(只有 x 部分;y 完全相同):
x += ((object.getX() - x) - 1000 / 2) * 0.05f;
重新排列括号,我们得到:
x += (object.getX() - (x + 1000 / 2)) * 0.05f;
我们看到屏幕中心就在那里。让我们用变量 c
代替它使事情更清楚:
x += (object.getX() - c) * 0.05f;
第一项object.getX() - c
是物体位置与屏幕中心的差值。因此,如果对象居中,则此差异为零。这正是我们需要移动相机以准确地将对象居中的量。如果我们有
x += (object.getX() - c);
...我们总是将对象保持在屏幕中心。但是我们有 0.05
的因素。因此,我们不会将相机移动整个距离。只是其中的一小部分。也就是说,我们正在将对象移近屏幕中心。如果距离很远,它会移动得很快(因为差异很大)。如果已经很近了,它会慢慢移动(因为差异很小)。 0.05
的因素是设置居中的即时程度。 0
的因子根本不会移动对象,1
的因子会立即使对象居中。介于两者之间的一切都代表具有不同加速度的平滑运动。您可以将此因素想象为屏幕中心和对象之间 spring 的刚度。