具有窗格跟随游戏角色的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();
}
我正在尝试使用 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();
}