【发布时间】:2017-12-19 03:06:08
【问题描述】:
我正在使用 JavaFX 创建一个自上而下的游戏,但我在实现一个随玩家移动的相机时遇到了问题。
我尝试创建这样的东西不是移动玩家,而是将场景移动到玩家想要去的相反方向。这造成了玩家在移动的错觉,但它需要场景中的所有对象不断移动,这显然会产生大量的性能问题。所以在这之后我做了一个剪辑,并将所有的地形节点放在一个剪辑的矩形内。
下面是我的TerrainRenderer 类,它创建了剪切的矩形和其中的内容。它的作用是获取一张图片,然后生成一堆矩形节点,以制作一张看起来像图片的地图。
private static final Pane tileContainer = new Pane();
private static final Rectangle rectClip = new Rectangle();
private static void clipChildren(Region region) {
region.setClip(rectClip);
region.layoutBoundsProperty().addListener((ov, oldValue, newValue) -> {
rectClip.setWidth(newValue.getWidth());
rectClip.setHeight(newValue.getHeight());
});
}
private static void drawTile(int x, int y, Color color) {
final int TILE_SIZE = 15;
Rectangle tile = new Rectangle(x * TILE_SIZE, y * TILE_SIZE, TILE_SIZE, TILE_SIZE);
tile.setFill(color);
tileContainer.getChildren().add(tile);
}
public static Region generate() {
final Image map = new Image("main/Images/IcJR6.png");
for (int x = 0; x < (int) map.getWidth(); x++) {
for (int y = 0; y < (int) map.getHeight(); y++) {
drawTile(x, y, map.getPixelReader().getColor(x, y));
}
}
tileContainer.setPrefSize(Main.getAppWidth(), Main.getAppHeight());
clipChildren(tileContainer);
return tileContainer;
}
public static Rectangle getRectClip() {
return rectClip;
}
您在下面看到的是我对使用精灵表的播放器的更新方法。到目前为止,这段代码只翻译剪辑节点,而不是里面的内容。
void update() {
int speed;
if (Main.isPressed(KeyCode.SHIFT)) speed = 6;
else speed = 3;
if (Main.isPressed(KeyCode.W)) {
getAnimation().play();
getAnimation().setOffsetY(96);
moveY(speed);
} else if (Main.isPressed(KeyCode.S)) {
getAnimation().play();
getAnimation().setOffsetY(0);
moveY(-speed);
} else if (Main.isPressed(KeyCode.D)) {
getAnimation().play();
getAnimation().setOffsetY(64);
moveX(-speed);
} else if (Main.isPressed(KeyCode.A)) {
getAnimation().play();
getAnimation().setOffsetY(32);
moveX(speed);
} else getAnimation().stop();
}
@Override
protected void moveX(int x) {
boolean right = x > 0;
for(int i = 0; i < Math.abs(x); i++) {
if (right) TerrainRenderer.getRectClip().setTranslateX(TerrainRenderer.getRectClip().getTranslateX() + 1);
else TerrainRenderer.getRectClip().setTranslateX(TerrainRenderer.getRectClip().getTranslateX() - 1);
}
}
@Override
protected void moveY(int y) {
boolean down = y > 0;
for (int i = 0; i < Math.abs(y); i++) {
if (down) TerrainRenderer.getRectClip().setTranslateY(TerrainRenderer.getRectClip().getTranslateY() + 1);
else TerrainRenderer.getRectClip().setTranslateY(TerrainRenderer.getRectClip().getTranslateY() - 1);
}
}
我想要的结果看起来像 this(跳到 6:10),但是我如何在 JavaFX 中制作这样的东西呢?有什么建议吗?
【问题讨论】:
-
如果您可以先绘制整个事物,只需定义一个
clip,并将其与translateX和translateY属性一起移动。 -
我的代码会是什么样子?我现在拥有的代码只翻译播放器,所以我会在场景中的窗格中添加一个剪辑吗?
pane.getClip().setTranslateY(pane.getClip().getTranslateY() - 1);将窗格向上移动一个像素? -
为剪辑创建一个矩形,将其 x 和 y 属性绑定到播放器的 translateX 和 translateY 属性的函数。 (您可能希望将宽度和高度绑定到显示器的宽度和高度,或者只是硬编码它们。)。
-
我很抱歉,因为我是使用剪辑的新手,但是剪辑一个矩形并将其 X Y 属性绑定到播放器的平移属性会做什么?为什么这是一个不会造成延迟的更好解决方案?
-
剪辑限制了节点的渲染部分。