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

使用JavaFX的ImageView精灵动画

淳于功
2023-03-14

我试图在登录窗口(stage)内创建一个精灵动画,使用JavaFX,一旦用户获得登录和密码信息,就会播放该动画。我试图使用Michael Heinrichs在他的博客文章中发布的关于使用JavaFX的sprite动画的类,但我无法使其工作,主要是因为我不知道如何在ImageView中创建这个动画,而不使用start方法(在我的情况下也不起作用)。

这是我在登录阶段的FXML文件中的代码:

<GridPane alignment="CENTER" hgap="10.0" vgap="10.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="crud.controller.MainController">
    <padding>
        <Insets bottom="25.0" left="25.0" right="25.0" top="25.0" />
    </padding>
    <children>
        <ImageView fx:id="loginAnimationImageView" GridPane.columnIndex="0" GridPane.halignment="CENTER" GridPane.columnSpan="2" GridPane.rowIndex="0">
            <image>
                <Image url="@../assets/shop-sprite.png" />
            </image>
        <viewport>
            <Rectangle2D height="130.0" width="131.0" />
        </viewport>
        </ImageView>
        <Label text="Usuario" GridPane.columnIndex="0" GridPane.halignment="RIGHT" GridPane.rowIndex="2" />
        <TextField fx:id="loginTextField" onAction="#onEnterTextFieldAction" GridPane.columnIndex="1" GridPane.rowIndex="2" />
        <Label text="Contraseña" GridPane.columnIndex="0" GridPane.rowIndex="3" />
        <PasswordField fx:id="passwordTextField" onAction="#onEnterPasswordFieldAction" GridPane.columnIndex="1" GridPane.rowIndex="3" />
        <Button fx:id="loginButton" onAction="#loginButtonAction" text="Ingresar" GridPane.columnIndex="0" GridPane.columnSpan="2" GridPane.halignment="CENTER" GridPane.rowIndex="5" />
    </children>
</GridPane>

在控制器类中,我试图创建一个启动方法,但首先,我不知道如何在舞台打开的同时启动它,其次,当我尝试从按钮调用该方法时,它会尝试渲染图像(修改图像所需的空间),但它什么也没显示。

代码如下:

@FXML private void launchAnimation() {
    loginAnimationImageView = new ImageView(IMAGE);
    loginAnimationImageView.setViewport(new Rectangle2D(OFFSET_X, OFFSET_Y, WIDTH, HEIGHT));

    final Animation animacion = new SpriteAnimation(
            loginAnimationImageView,
            Duration.millis(1000.0),
            COUNT, COLUMNS,
            OFFSET_X, OFFSET_Y,
            WIDTH, HEIGHT
    );

    animacion.setCycleCount(Animation.INDEFINITE);
    animacion.play();
}

最后,以下是常量声明:

private static final Image IMAGE = new Image("https://i.cloudup.com/1VA2FCnqY6-2000x2000.png");
private static final int COLUMNS  = 4;
private static final int COUNT    = 12;
private static final int OFFSET_X = 0;
private static final int OFFSET_Y = 0;
private static final int WIDTH    = 131;
private static final int HEIGHT   = 125;

这就是登录阶段现在的样子,我想为我的徽标制作动画:

你们能帮助我理解如何在这个案例中使用图像视图吗?

我可以使用ImageView来创建这种效果,还是我只是在浪费时间?

共有1个答案

苏涛
2023-03-14

我成功了,我可以使用这个精灵图像使用JavaFX制作这个简单的动画,如果你想完成类似的事情,我想与你分享

这就是结果(YouTube)

首先,我用这段代码为登录阶段创建了FXML文件(请记住,您必须为控制器类和图像文件设置正确的位置)

<?xml version="1.0" encoding="UTF-8"?>

<?import java.lang.*?>
<?import javafx.geometry.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.image.*?>
<?import javafx.scene.layout.*?>

<GridPane alignment="CENTER" hgap="10.0" vgap="10.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="package.Controller">
    <padding>
        <Insets bottom="25.0" left="25.0" right="25.0" top="25.0" />
    </padding>
    <children>
        <ImageView fx:id="loginAnimationImageView" GridPane.columnIndex="0" GridPane.halignment="CENTER" GridPane.columnSpan="2" GridPane.rowIndex="0">
            <image>
                <Image url="@route/to/shop-sprite.png" />
            </image>
        <viewport>
            <Rectangle2D minX="0" minY="0" height="130.0" width="130.0" />
        </viewport>
        </ImageView>
        <Label text="Usuario" GridPane.columnIndex="0" GridPane.halignment="RIGHT" GridPane.rowIndex="2" />
        <TextField fx:id="loginTextField" onAction="#onEnterTextFieldAction" GridPane.columnIndex="1" GridPane.rowIndex="2" />
        <Label text="Contraseña" GridPane.columnIndex="0" GridPane.rowIndex="3" />
        <PasswordField fx:id="passwordTextField" onAction="#onEnterPasswordFieldAction" GridPane.columnIndex="1" GridPane.rowIndex="3" />
        <Button fx:id="loginButton" onAction="#loginButtonAction" text="Ingresar" GridPane.columnIndex="0" GridPane.columnSpan="2" GridPane.halignment="CENTER" GridPane.rowIndex="5" />
    </children>
</GridPane>

现在我们必须使用迈克尔·海因里希斯创建的动画类来设置控制器,我在上面的问题中链接了这个类。

注意:一旦登录和密码信息得到验证,该动画将通过登录按钮启动,因此您必须设置代码才能在自己的应用程序中完成此操作。

下面是控制器的代码:

public class MainController {
    private static final int COLUMNS  = 4;
    private static final int COUNT    = 12;
    private static final int OFFSET_X = 0;
    private static final int OFFSET_Y = 0;
    private static final int WIDTH    = 130;
    private static final int HEIGHT   = 130;
    @FXML private ImageView loginAnimationImageView;
    @FXML private TextField loginTextField;
    @FXML private PasswordField passwordTextField;
    @FXML private Button loginButton;

    @FXML protected void onEnterTextFieldAction(ActionEvent actionEvent) {
}

    @FXML protected void onEnterPasswordFieldAction(ActionEvent actionEvent) {
}

    @FXML protected void loginButtonAction(ActionEvent actionEvent) {
        final Animation animation = new SpriteAnimation(
                loginAnimationImageView,
                Duration.millis(400.0),
                COUNT, COLUMNS,
                OFFSET_X, OFFSET_Y,
                WIDTH, HEIGHT
        );

        animation.setCycleCount(1);
        animation.play();
    }
}

就是这样,你不需要做任何其他事情就可以为你的任何JavaFX应用程序创建这个简单的动画。享受吧!

 类似资料:
  • 移动精灵 现在你知道了如何展示精灵,但是让它们移动呢?很简单:使用Pixi的ticker。这被称为 游戏循环 。任何在游戏循环里的代码都会1秒更新60次。你可以用下面的代码让 cat 精灵以每帧1像素的速率移动。 function setup() { //Start the game loop by adding the `gameLoop` function to //Pixi's `t

  • XYQuickDeveloper 是一个常用方法与常用第三方库的集合。目前实现了一个帧动画精灵类 XYSpriteView。XYSpriteManager 是一个精灵管理类,里面实现了定时器。 [Code4App.com]

  • 哇哦...JavaFX2让我陷入了游戏编程的困境。我正在努力永恒如何最好地接近玩家控制的精灵动画。(使敌人、事物和玩家活跃起来)。

  • 问题内容: 如何实现对精灵的对角线运动?我创建了一个可移动的精灵(一个矩形),它可以在四个方向上移动。 为了给矩形设置动画,使用了一个计时器对象和执行动作的方法。我在keyPressed和keyReleased方法中实现了以下代码,以使其在四个方向上移动。 问题答案: 这是基于您的最后评论的代码:

  • 我正在用PyGame制作一个小游戏,相机聚焦在一个代表角色的精灵上,当按下箭头键时,地图会围绕它移动。问题是地图不动。我以前多次遇到过这个问题,我想我已经把它缩小到可能的范围,但是我不知道如何真正解决这个问题。 这是代码: 基于我过去的PyGame程序,我总是在移动被绘制到屏幕上的精灵集时遇到问题,比如我在这里所做的。即使是平庸简单的例子也会失败。我想知道的是这是为什么,我怎样才能简明扼要地画出大

  • 父类:BK.Node 精灵类 成员变量 变量 类型 名称 备注 size Object 大小 anchor Object 锚点 cornerRadius number 圆角 单位为像素 例子: var babaTex =new BK.Texture('GameRes://texture/test.png'); var sp =new BK.Sprite(200,200,babaTex,0,1,1