Javafx有窗格跟随游戏角色

时间:2016-12-30 03:39:33

标签: java javafx pane

我正在尝试使用javafx创建一个简单的RPG游戏。到目前为止,我已经让我的角色出现在屏幕上,四处移动,而不是碰到障碍物。我通过使用Board类来实现这一点,它充当网格:

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; 
    }
}

基本上,这个类包含GameTiles的集合并且具有Character对象。它的设置方式很好,但我希望屏幕只显示我的主角而不显示整个屏幕,就像真正的RPG一样。现在,出现整个级别的屏幕。我希望能够让屏幕与我的角色一起移动,而不是透露整个屏幕。

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();
}

How the screen appears

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

1 个答案:

答案 0 :(得分:1)

如果您想同时加载整个关卡,可以将背景和角色放在Group中。每当角色移动时,你都会调整它的翻译属性。整个组的翻译属性也进行了调整,但方向相反。确保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();
}