【发布时间】:2015-09-10 15:37:08
【问题描述】:
我想做一个简单的 2D 游戏。现在我想做的就是显示我的精灵表的单个精灵(播放器)。所以我的主类扩展了javafx.application.Application,我有一个舞台和一个我想在上面展示的玩家。
播放器类包含一个数组,其中填充了我使用方法.getSubimage 从我的精灵表中获得的单个精灵。为了在舞台上显示某些东西,您需要一个包含 Group 或 StackPane 的场景以及要显示的对象。因此,我尝试通过将我的播放器附加到名为 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 如何知道您想要看到的内容?) -
好吧,实际上最好在播放器类中调用一个渲染函数,而不是只将精灵的图像添加到一个节点,而不是添加到场景中并显示。但是我该怎么做呢?将玩家添加到场景中不会显示任何内容,我明白了。