JavaFX 动画使用循环?

2024-05-27

我正在尝试制作一款类似太空侵略者的游戏。 我画了一个正方形,我想通过使用循环逐步向下移动它thread.sleep。然而,正方形立即被绘制出来。我知道有可以使用的动画路径,但我想保持低水平并仅使用坐标系。

有没有办法使用这样的循环来制作时间轴动画?

package com.company;

import javafx.application.Application;
import javafx.stage.Stage;
import javafx.scene.*;
import javafx.scene.layout.*;
import javafx.scene.shape.Rectangle;

public class Main extends  Application  {

    public static void main(String[] args)  {
        // write your code here
        launch(args);
    }

    public void start(Stage myStage) throws InterruptedException {
        myStage.setTitle("space invaders");

        Pane rootNode= new Pane();
        Scene myScene=new Scene(rootNode, 400, 800);
        myStage.setScene(myScene);
        Rectangle r = new Rectangle();
        myStage.show();
        rootNode.getChildren().add(r);
        r.setX(50);
        r.setY(50);
        r.setWidth(20);
        r.setHeight(20);

        for (int i = 0; i < 500; i++){
            Thread.sleep(2000);
            r.setTranslateY(i);
        }
    }
}

这是一个糟糕的实施。我可能会用AnimationTimer https://docs.oracle.com/javase/8/javafx/api/javafx/animation/AnimationTimer.html。这是用完成的Timeline https://docs.oracle.com/javase/8/javafx/api/javafx/animation/Timeline.html。它基本上是向右或向左移动。如果您到达右边界或左边界,请放下,然后朝相反方向移动。

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import javafx.animation.KeyFrame;
import javafx.animation.PauseTransition;
import javafx.animation.Timeline;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.Pane;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;
import javafx.util.Duration;

/**
 *
 * @author blj0011
 */
public class JavaFXApplication343 extends Application
{
    int invaderWidth = 30;
    int invaderHeight = 10;
    int gapBetweenInvaderX = 5;
    int gapBetweenInvaderY = 5;
    int locationTrackerX;
    int locationTrackerY;

    int screenWidth = 300;
    int screenHeight = 400;

    double timeBetweenFrames = .25;

    boolean direction = true;

    Timeline timeline;

    @Override
    public void start(Stage primaryStage)
    {
        Pane pane = new Pane();

        locationTrackerX = (screenWidth - (invaderWidth * 6 + gapBetweenInvaderX * 5)) / 2;
        locationTrackerY = (screenHeight - (invaderHeight * 6 + gapBetweenInvaderY * 5)) / 7;

        List<Rectangle> invaders = new ArrayList();
        for (int i = 0; i < 36; i++) {
            Rectangle rectangle = new Rectangle(locationTrackerX, locationTrackerY, invaderWidth, invaderHeight);
            rectangle.setFill(Color.YELLOW);
            invaders.add(rectangle);
            System.out.println(locationTrackerX);

            locationTrackerX += invaderWidth + gapBetweenInvaderX;
            if ((i + 1) % 6 == 0) {
                locationTrackerX = (screenWidth / 2) - ((invaderWidth * 6 + gapBetweenInvaderX * 5) / 2);
                locationTrackerY += invaderHeight + gapBetweenInvaderY;
            }
        }

        timeline = new Timeline(new KeyFrame(Duration.seconds(timeBetweenFrames), (event) -> {
            //Check to see if invader hits bounds
            Optional<Rectangle> hitRightOptional = invaders.stream().filter(invader -> invader.getBoundsInLocal().getMaxX() >= pane.getWidth()).findFirst();
            Optional<Rectangle> hitLeftOptional = invaders.stream().filter(invader -> invader.getBoundsInLocal().getMinX() <= 0).findFirst();
            //Move invaders
            if (hitRightOptional.isPresent()) {
                invaders.forEach((tempInvader) -> tempInvader.setY(tempInvader.getY() + 10));
                timeline.stop();
                PauseTransition pause = new PauseTransition(Duration.seconds(timeBetweenFrames));
                pause.setOnFinished((pauseEvent) -> {
                    invaders.forEach(invader -> invader.setX(invader.getX() - 10));
                    timeline.play();
                });
                pause.play();

                direction = false;
            }
            else if (hitLeftOptional.isPresent()) {
                invaders.forEach((tempInvader) -> tempInvader.setY(tempInvader.getY() + 10));
                timeline.stop();
                PauseTransition pause = new PauseTransition(Duration.seconds(timeBetweenFrames));
                pause.setOnFinished((pauseEvent) -> {
                    invaders.forEach(invader -> invader.setX(invader.getX() + 10));
                    timeline.play();
                });
                pause.play();

                direction = true;
            }
            else {
                if (direction) {
                    invaders.forEach(invader -> invader.setX(invader.getX() + 10));
                }
                else {
                    invaders.forEach(invader -> invader.setX(invader.getX() - 10));
                }
            }
        }));
        timeline.setCycleCount(Timeline.INDEFINITE);

        Button btn = new Button();
        btn.setText("Start Game");
        btn.setOnAction((ActionEvent event) -> {
            timeline.play();
            btn.setDisable(true);
        });

        pane.getChildren().addAll(invaders);
        pane.setPrefSize(screenWidth, screenHeight);

        VBox root = new VBox(pane, new StackPane(btn));
        Scene scene = new Scene(root, screenWidth, screenHeight);

        primaryStage.setTitle("Hello World!");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args)
    {
        launch(args);
    }

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JavaFX 动画使用循环? 的相关文章

  • 如何使用 Java 和 Selenium WebDriver 在 C 目录中创建文件夹并需要将屏幕截图保存在该目录中?

    目前正在与硒网络驱动程序和代码Java 我有一种情况 我需要在 C 目录中创建一个文件夹 并在该文件夹中创建我通过 selenium Web 驱动程序代码拍摄的屏幕截图 它需要存储在带有时间戳的文件夹中 如果我每天按计划运行脚本 所有屏幕截
  • 制作一个交互式Windows服务

    我希望我的 Java 应用程序成为交互式 Windows 服务 用户登录时具有 GUI 的 Windows 服务 我搜索了这个 我发现这样做的方法是有两个程序 第一个是服务 第二个是 GUI 程序并使它们进行通信 服务将从 GUI 程序获取
  • Final字段的线程安全

    假设我有一个 JavaBeanUser这是从另一个线程更新的 如下所示 public class A private final User user public A User user this user user public void
  • 反射找不到对象子类型

    我试图通过使用反射来获取包中的所有类 当我使用具体类的代码 本例中为 A 时 它可以工作并打印子类信息 B 扩展 A 因此它打印 B 信息 但是当我将它与对象类一起使用时 它不起作用 我该如何修复它 这段代码的工作原理 Reflection
  • 如何在PreferenceActivity中添加工具栏

    我已经使用首选项创建了应用程序设置 但我注意到 我的 PreferenceActivity 中没有工具栏 如何将工具栏添加到我的 PreferenceActivity 中 My code 我的 pref xml
  • 十进制到八进制的转换[重复]

    这个问题在这里已经有答案了 可能的重复 十进制转换错误 https stackoverflow com questions 13142977 decimal conversion error 我正在为一个类编写一个程序 并且在计算如何将八进
  • Java TestNG 与跨多个测试的数据驱动测试

    我正在电子商务平台中测试一系列商店 每个商店都有一系列属性 我正在考虑对其进行自动化测试 是否有可能有一个数据提供者在整个测试套件中提供数据 而不仅仅是 TestNG 中的测试 我尝试不使用 testNG xml 文件作为机制 因为这些属性
  • 如何将 pfx 文件转换为 jks,然后通过使用 wsdl 生成的类来使用它来签署传出的肥皂请求

    我正在寻找一个代码示例 该示例演示如何使用 PFX 证书通过 SSL 访问安全 Web 服务 我有证书及其密码 我首先使用下面提到的命令创建一个 KeyStore 实例 keytool importkeystore destkeystore
  • 如何在控制器、服务和存储库模式中使用 DTO

    我正在遵循控制器 服务和存储库模式 我只是想知道 DTO 在哪里出现 控制器应该只接收 DTO 吗 我的理解是您不希望外界了解底层域模型 从领域模型到 DTO 的转换应该发生在控制器层还是服务层 在今天使用 Spring MVC 和交互式
  • Eclipse Java 远程调试器通过 VPN 速度极慢

    我有时被迫离开办公室工作 这意味着我需要通过 VPN 进入我的实验室 我注意到在这种情况下使用 Eclipse 进行远程调试速度非常慢 速度慢到调试器需要 5 7 分钟才能连接到远程 jvm 连接后 每次单步执行断点 行可能需要 20 30
  • 无法捆绑适用于 Mac 的 Java 应用程序 1.8

    我正在尝试将我的 Java 应用程序导出到 Mac 该应用程序基于编译器合规级别 1 7 我尝试了不同的方法来捆绑应用程序 1 日食 我可以用来在 Eclipse 上导出的最新 JVM 版本是 1 6 2 马文 看来Maven上也存在同样的
  • 如何在桌面浏览器上使用 webdriver 移动网络

    我正在使用 selenium webdriver 进行 AUT 被测应用程序 的功能测试自动化 AUT 是响应式网络 我几乎完成了桌面浏览器的不同测试用例 现在 相同的测试用例也适用于移动浏览器 因为可以从移动浏览器访问 AUT 由于它是响
  • 声明的包“”与预期的包不匹配

    我可以编译并运行我的代码 但 VSCode 中始终显示错误 早些时候有一个弹出窗口 我不记得是什么了 我点击了 全局应用 从那以后一直是这样 Output is there but so is the error The declared
  • 获取 JVM 上所有引导类的列表?

    有一种方法叫做findBootstrapClass对于一个类加载器 如果它是引导的 则返回一个类 有没有办法找到类已经加载了 您可以尝试首先通过例如获取引导类加载器呼叫 ClassLoader bootstrapLoader ClassLo
  • 捕获的图像分辨率太大

    我在做什么 我允许用户捕获图像 将其存储到 SD 卡中并上传到服务器 但捕获图像的分辨率为宽度 4608 像素和高度 2592 像素 现在我想要什么 如何在不影响质量的情况下获得小分辨率图像 例如我可以获取或设置捕获的图像分辨率为原始图像分
  • 使用 JMF 创建 RTP 流时出现问题

    我正处于一个项目的早期阶段 需要使用 RTP 广播DataStream创建自MediaLocation 我正在遵循一些示例代码 该代码目前在rptManager initalize localAddress 出现错误 无法打开本地数据端口
  • 当我从 Netbeans 创建 Derby 数据库时,它存储在哪里?

    当我从 netbeans 创建 Derby 数据库时 它存储在哪里 如何将它与项目的其余部分合并到一个文件夹中 右键单击Databases gt JavaDB in the Service查看并选择Properties This will
  • JGit 检查分支是否已签出

    我正在使用 JGit 开发一个项目 我设法删除了一个分支 但我还想检查该分支是否已签出 我发现了一个变量CheckoutCommand但它是私有的 private boolean isCheckoutIndex return startCo
  • 按日期对 RecyclerView 进行排序

    我正在尝试按日期对 RecyclerView 进行排序 但我尝试了太多的事情 我不知道现在该尝试什么 问题就出在这条线上适配器 notifyDataSetChanged 因为如果我不放 不会显示错误 但也不会更新 recyclerview
  • Spring Boot @ConfigurationProperties 不从环境中检索属性

    我正在使用 Spring Boot 1 2 1 并尝试创建一个 ConfigurationProperties带有验证的bean 如下所示 package com sampleapp import java net URL import j

随机推荐