我正在编写一个参考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());
答案 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
因子会立即使对象居中。介于两者之间的所有东西都代表着不同加速度的平滑运动。你可以把这个因素想象成屏幕中心和物体之间弹簧的刚度。