【问题标题】:Add a custom object to a JavaFX scene and render it将自定义对象添加到 JavaFX 场景并渲染它
【发布时间】:2015-09-10 15:37:08
【问题描述】:

我想做一个简单的 2D 游戏。现在我想做的就是显示我的精灵表的单个精灵(播放器)。所以我的主类扩展了javafx.application.Application,我有一个舞台和一个我想在上面展示的玩家。

播放器类包含一个数组,其中填充了我使用方法.getSubimage 从我的精灵表中获得的单个精灵。为了在舞台上显示某些东西,您需要一个包含 GroupStackPane 的场景以及要显示的对象。因此,我尝试通过将我的播放器附加到名为 entities 的 StackPane by entities.getChildren().add(player) 来将其添加到场景中。那是行不通的。

我不太熟悉使用阶段等。从“应用程序”扩展我的游戏是否是错误的方式。如何将自定义对象添加到场景中?

主类:

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;

}
}

如果你想知道我是如何处理精灵表的:

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

抽象类可移动:

public abstract class Moveable {

private int posX;
private int posY;
private BufferedImage sprite;

public void getSprite(int x,int y) {

}

public void moveTo(int newX, int newY) {

}

}

【问题讨论】:

  • 什么是Moveable?它是Node 子类吗? “那行不通”是什么意思?
  • @James_D 我添加了代码。而“这不起作用”是指我不能以这种方式添加对象“玩家”。似乎它不接受课程。在教程中,人们总是使用文本或形状之类的东西并将它们附加到 Group 或 StackPane。但我想知道如何添加自己的对象。
  • 它不是Node。您只能将Nodes 添加到场景图中。 (通过将播放器添加到场景图中,您希望看到什么,以及您希望 JavaFX 如何知道您想要看到的内容?)
  • 好吧,实际上最好在播放器类中调用一个渲染函数,而不是只将精灵的图像添加到一个节点,而不是添加到场景中并显示。但是我该怎么做呢?将玩家添加到场景中不会显示任何内容,我明白了。

标签: java javafx 2d-games


【解决方案1】:

您只能将Node 子类添加到您的场景图中。

我会在你的Player 类中公开一个javafx.scene.image.Image。 (您可以选择专门使用这些,而不是 BufferedImages,或者您可以在代码中的某处使用 SwingFXUtils.toFXImage(...) 进行转换。)

所以这看起来像

public class Player {

    //existing code...

    public Image getSprite() {
        return ... ;
    }
}

然后你就可以做

entities.getChildren().add(new ImageView(player.getSprite()));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-09
    • 1970-01-01
    • 2017-03-15
    • 1970-01-01
    相关资源
    最近更新 更多