具有窗格跟随游戏角色的Javafx

Javafx having pane follow game character

我正在尝试使用 javafx 创建一个简单的 RPG 游戏。到目前为止,我已经让我的角色出现在屏幕上,四处移动,而不是撞到障碍物。我通过使用板 class 来完成此操作,它充当网格:

public class TestBoard extends Pane{

    public static final int TILE_SIZE = 40;
    public static final int X_DIM_TILES = 10;
    public static final int Y_DIM_TILES = 10;
    private Image TREE = new Image(Game.class.getResource("tree.png").toString());
    private Image GRASS = new Image(Game.class.getResource("grasssquare.png").toString());
    private Character character;
    private GameTile[][] tiles = new GameTile[X_DIM_TILES][Y_DIM_TILES];
    public TestBoard(){

        this.setPrefWidth(TILE_SIZE * X_DIM_TILES);
        this.setPrefHeight(TILE_SIZE * Y_DIM_TILES);
        setUpScreen();
        character = new Character(this);
        addCharacter();
    }
    public boolean checkTile(double x, double y){
        return (x < X_DIM_TILES && x >= 0 && y < Y_DIM_TILES && y >= 0 && tiles[(int)x][(int)y].getPassable());
    }
    public Character getCharacter(){
        return character;
    }
    public void addCharacter(){
        character.setLocation(4, 4);

    }
    public GameTile getTile(int x, int y){
        return tiles[x][y];
    }
    public void setUpScreen(){
        for (int i = 0; i < X_DIM_TILES; i++){
            for (int j = 0; j < Y_DIM_TILES; j++){
                addTile(i, j, GRASS, true);
            }
        }
        for (int j = 1; j < Y_DIM_TILES-1; j++){
            addTile(1, j, TREE, false);
        }
    }
    public void addTile(int xCord, int yCord, Image image, boolean passable){
        SceneryTile tile = new SceneryTile(this, image, passable);
        tile.setLocation(xCord, yCord);
        tiles[xCord][yCord] = tile; 
    }
}

基本上,这个 class 包含 GameTiles 的集合并具有 Character 对象。它的设置方式工作正常,但我希望屏幕只显示我的主角而不显示整个屏幕,就像真正的角色扮演游戏一样。现在,出现了整个关卡屏幕。我希望能够让屏幕随着我的角色移动而不是显示整个屏幕。

public void start(Stage primaryStage) throws Exception {
    board = new TestBoard();
    testManager = new TestManager(this, board);
    Scene scene = new Scene(board);
    primaryStage.setScene(scene);
    primaryStage.show();
    setUpAnimation();
    setUpKeyPresses();
}

如果需要更多文档,请告诉我!谢谢

如果你想同时加载整个关卡,你可以将背景和角色放在一个Group中。每当角色移动时,您都会调整它的平移 属性。整组的translate属性也调整了,但是方向相反。确保 Group 未被管理,否则父级在确定其自身大小时将考虑其大小。

下面的例子是一个只允许左右移动的简单例子,以圆形为字符,以渐变填充的矩形为背景:

@Override
public void start(Stage primaryStage) {
    Circle character = new Circle(100, 100, 20, Color.RED);
    Rectangle background = new Rectangle(2000, 200, new LinearGradient(0, 0, 100, 0, false, CycleMethod.REPEAT, new Stop(0, Color.WHITE), new Stop(100, Color.BLUE)));
    Group group = new Group(background, character);
    group.setManaged(false);

    Pane root = new Pane(group);
    root.setPrefSize(200, 200);

    Scene scene = new Scene(root);
    scene.setOnKeyPressed(evt -> {
        double direction = -1;
        switch (evt.getCode()) {
            case RIGHT:
                direction = 1;
            case LEFT:
                double delta = direction * 10;
                character.setTranslateX(character.getTranslateX() + delta);
                group.setTranslateX(group.getTranslateX() - delta);
        }
    });

    primaryStage.setScene(scene);
    primaryStage.show();
}