无法理解此算法中用于在java

时间:2018-06-18 09:46:25

标签: java math camera game-development

我正在编写一个参考youtube视频的java游戏,并且遇到了一些我不太了解的代码和算法。

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然后乘以浮点数。我得到的是减去窗口宽度/ 2和高度/ 2将玩家置于屏幕中间的中间位置。 根据RealtutsGML,浮动使相机感觉更平滑。它不是严格固定在球员位置上,而是略微滑动。但为什么* 0.05会发生这种情况? 然后在主渲染方法内的游戏类中,摄像机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());

1 个答案:

答案 0 :(得分:0)

显然,屏幕中心位于坐标(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因子会立即使对象居中。介于两者之间的所有东西都代表着不同加速度的平滑运动。你可以把这个因素想象成屏幕中心和物体之间弹簧的刚度。