将自定义对象添加到JavaFX场景并进行渲染

将自定义对象添加到JavaFX场景并进行渲染,java,javafx,2d-games,Java,Javafx,2d Games,我想做一个简单的2D游戏。现在我想做的就是显示我的精灵表中的一个精灵(播放器)。所以我的主类扩展了javafx.application.application,我有一个舞台和一个播放器要在上面显示 player类保存一个数组,数组中填充了我用.getSubimage方法从精灵表中获得的单个精灵。为了在舞台上显示某些内容,您需要一个场景,其中包含一个组或一个堆栈窗格,其中包含您要显示的对象。因此,我尝试将我的播放器添加到场景中,方法是通过entities.getChildren().add(pla

我想做一个简单的2D游戏。现在我想做的就是显示我的精灵表中的一个精灵(播放器)。所以我的主类扩展了
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()));