将自定义对象添加到JavaFX场景并进行渲染
我想做一个简单的2D游戏。现在我想做的就是显示我的精灵表中的一个精灵(播放器)。所以我的主类扩展了将自定义对象添加到JavaFX场景并进行渲染,java,javafx,2d-games,Java,Javafx,2d Games,我想做一个简单的2D游戏。现在我想做的就是显示我的精灵表中的一个精灵(播放器)。所以我的主类扩展了javafx.application.application,我有一个舞台和一个播放器要在上面显示 player类保存一个数组,数组中填充了我用.getSubimage方法从精灵表中获得的单个精灵。为了在舞台上显示某些内容,您需要一个场景,其中包含一个组或一个堆栈窗格,其中包含您要显示的对象。因此,我尝试将我的播放器添加到场景中,方法是通过entities.getChildren().add(pla
javafx.application.application
,我有一个舞台和一个播放器要在上面显示
player类保存一个数组,数组中填充了我用.getSubimage
方法从精灵表中获得的单个精灵。为了在舞台上显示某些内容,您需要一个场景,其中包含一个组
或一个堆栈窗格
,其中包含您要显示的对象。因此,我尝试将我的播放器添加到场景中,方法是通过entities.getChildren().add(player)
将其添加到名为entities
的堆栈窗格中。这是行不通的
我不太熟悉舞台等等。从“应用程序”扩展我的游戏是错误的吗。如何将自定义对象添加到场景中
主要类别:
public class Sokobencho extends Application {
private int height = 96;
private int width = 144;
private int scale = 4;
private Player player;
private StackPane entities;
public Stage stage;
public Sokobencho() throws IOException {
player = new Player("res/", 0);
}
public void start(Stage stage) throws Exception {
loadEntities();
Scene scene = new Scene(entities, width*scale, height*scale);
stage.setTitle("Sokobencho by Daniel Welzel");
stage.setScene(scene);
stage.show();
}
public void loadEntities() {
entities.getChildren().add(player);
}
public static void main(String[] args) throws Exception {
launch(args);
}
}
球员级别:
public class Player extends Moveable {
private int posX;
private int posY;
private Spritesheet spritesheet;
private BufferedImage sprite;
public Player(String filePath, int spriteNumber) throws IOException {
spritesheet = new Spritesheet(filePath, 16, 16, 10, 10);
getSprite(spriteNumber);
}
public void getSprite(int i) {
sprite = spritesheet.getSprite(i);
}
public void moveTo(int newX, int newY) {
posX = newX;
posY = newY;
}
}
如果您想知道我是如何处理sprite表的:
public Spritesheet(String filepath, int spriteWidth, int spriteHeight, int spriteRows, int spriteCols) throws IOException {
filePath = filepath;
rows = spriteRows;
cols = spriteCols;
width = spriteWidth;
height = spriteHeight;
sprites = new BufferedImage[rows * cols];
createSprites();
}
public void createSprites() throws IOException {
spritesheet = ImageIO.read(new File(filePath));
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < cols; j++)
{
sprites[(i * cols) + j] = spritesheet.getSubimage(
j * width,
i * height,
width,
height
);
}
}
}
public BufferedImage getSprite(int number) {
return sprites[number];
}
}
只能将
节点
子类添加到场景图中
我会在你的Player
类中公开一个javafx.scene.image.image
。(您可以选择以独占方式使用它们,而不是使用buffereImage
s,或者可以使用代码中的某个地方进行转换。)
所以这看起来像
public class Player {
//existing code...
public Image getSprite() {
return ... ;
}
}
然后你就可以
entities.getChildren().add(new ImageView(player.getSprite()));
什么是可移动的?它是
节点
子类吗?“你说的“那不起作用”是什么意思?@James_D我加上了密码。我所说的“这不起作用”是指我不能以这种方式添加对象“player”。似乎它不接受这门课。在教程中,人们总是使用诸如文本或形状之类的内容,并将它们附加到组或堆栈窗格中。但我想知道如何添加自己的对象。它不是节点
。只能将节点
s添加到场景图中。(通过将播放器添加到场景图中,您希望看到什么,以及您希望JavaFX如何知道这是您希望看到的?)实际上,在播放器类中调用渲染函数会比只将精灵图像添加到节点(而不是添加到场景并显示)更好。但是我该怎么做呢?我明白了,如果添加播放器,场景将不会显示任何内容。
entities.getChildren().add(new ImageView(player.getSprite()));