当前位置: 首页 > 知识库问答 >
问题:

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

方增
2023-03-14

我想做一个简单的2D游戏。现在,我想做的所有事情都是显示我的精灵表中的单个精灵(播放器)。因此,我的主类扩展了javafx.application。应用程序,我想在上面展示一个舞台和一个播放器。

玩家类包含一个数组,其中包含我从精灵表中获得的单个精灵,方法.getSubimage。为了在舞台上显示某些内容,您需要一个场景来容纳要显示的对象的StackPane。因此,我尝试将我的播放器添加到场景中,方法是将其附加到StackPane中,称为entityities.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) {

}

}

共有1个答案

邢华清
2023-03-14

只能将< code>Node子类添加到场景图形中。

我将在您的< code>Player类中公开一个< code > Java FX . scene . image . image 。(您可以选择专门使用这些,而不是< code>BufferedImage,或者使用< code>SwingFXUtils.toFXImage(...)代码中的某个地方。)

所以这看起来会像

public class Player {

    //existing code...

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

然后你可以做

entities.getChildren().add(new ImageView(player.getSprite()));
 类似资料:
  • 我想创建一个对象动态,例如在JavaFX中的一个圆。我的代码会像这样。 我现在的问题是如何增加每个圆的独特性。例如,如果我要添加每个圆的不同颜色和大小。我该如何实现呢?请帮忙。

  • 问题内容: 我是Java的初学者,正在尝试创建自定义类的数组。假设我有一个名为car的类,并且我想创建一组称为Garage的汽车。如何将每辆车添加到车库?这就是我得到的: 问题答案: 如果要使用数组,则必须保留一个包含车库中汽车数量的计数器。最好使用而不是数组:

  • 我有一个HashMap,我试着按它的值(从大到小)排序。我想要一个新的Map对象,它是新排序的哈希映射的克隆(或者直接对哈希映射本身排序的方法)。以下是我的代码: 问题是输出是原始哈希图的输出,而不是排序哈希图的输出。如果有人能帮助我,将不胜感激! 编辑:我使用LinkedHashMap修改了当前代码。

  • 我有一个Employee类有2个属性id和name。我正在重写hashcode和equals方法,如下所示。 Employee.java: 现在我有了一个测试类,我正在创建一个名为“Chris Gayle”的employee类的对象,并将其添加到HashSet中。之后,我将这个现有的employee对象的名称修改为“Kieron Pollard”,并将这个修改后的employee对象再次添加到Ha

  • 我是JavaFX新手。我想与我的场景互动 例如:当我单击一个按钮时,我添加了一个新按钮,Textfield。。在里面。然而,我搜索了一下,却没有找到满意的答案! 我的fxml文件: 我的控制器: }

  • 第一次使用JavaFX,所以我对/方法有一个问题。我在做一个弹跳球项目。首先,我使用对象创建球,但由于需要传递更多参数,我决定构建自己的球类()。这是我以前使用时使用的代码: 当将和和放入中时,就会使“球”弹出墙壁。现在,我正试图弄清楚如何使用ball来实现这一点,因为在使用我自己的对象时,无法解析、和方法。如何处理这个/构建自己的等?