我正在尝试使用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();
}
如果需要更多文档,请告诉我们!感谢。
答案 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();
}