Javafx:同时多个密钥侦听器

2024-03-22

我正在尝试在 Javafx 中重新创建 Pong 游戏,但我遇到了平台移动的问题。

我使用 keylisteners 和 switch 语句来上下移动平台。左边的一个带有 W 和 S,右边的一个带有 Up 和 Down。

当我单独按下它们时效果很好,但当我想同时移动它们时则效果不佳。

    package application;

import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.input.KeyEvent;
import javafx.scene.layout.BorderPane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;

public class Main extends Application {
    @Override
    public void start(Stage primaryStage) {
        try {
            BorderPane root = new BorderPane();
            Scene scene = new Scene(root,700,400);
            primaryStage.setScene(scene);
            primaryStage.show();
            scene.setFill(Color.BLACK);

            Rectangle player1 = new Rectangle();
            player1.setWidth(10);
            player1.setHeight(50);
            player1.setY(175);
            player1.setX(10);
            player1.setFill(Color.WHITE);
            root.getChildren().add(player1);

            Rectangle player2 = new Rectangle();
            player2.setWidth(10);
            player2.setHeight(50);
            player2.setY(175);
            player2.setX(680);
            player2.setFill(Color.WHITE);
            root.getChildren().add(player2);


            scene.setOnKeyPressed(new EventHandler<KeyEvent>(){ 
                public void handle(KeyEvent event) {
                    switch(event.getCode()) {
                    case W: if(player1.getY() -3 >= 0) {player1.setY(player1.getY()- 4);} break;
                    case S: if(player1.getY() +53 <= 400) {player1.setY(player1.getY()+4);} break;
                    case UP: if(player2.getY() -3 >= 0) {player2.setY(player2.getY()- 4);} break;
                    case DOWN: if(player2.getY() +53 <= 400) {player2.setY(player2.getY()+4);} break;
                    }
                }
            });


        } catch(Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        launch(args);
    }
}

JavaFX 在事件处理程序中仅处理一个 KeyCode。因此无法从 keyevent 对象中检查多个按键代码。然而,它确实处理按顺序按下的所有键码。因此,如果您一次按下 A 和 B,它会按照按下的顺序处理 A 和 B 的事件。因此,利用此功能,我们可以进行一些调整并处理多按键事件处理。

考虑您的示例,继续注册通过按下事件处理程序的所有关键代码(在一组中)并相应地执行您的逻辑。并确保清除按键释放时的设置。这样我们就可以知道哪些键被一起按下了。

下面是演示我上述解释的代码。它在你的例子中有效:)

final List<KeyCode> acceptedCodes = Arrays.asList(KeyCode.S, KeyCode.W, KeyCode.UP, KeyCode.DOWN);
            final Set<KeyCode> codes = new HashSet<>();
            scene.setOnKeyReleased(e -> codes.clear());
            scene.setOnKeyPressed(e -> {
                if (acceptedCodes.contains(e.getCode())) {
                    codes.add(e.getCode());
                    if (codes.contains(KeyCode.W)) {
                        if (player1.getY() - 3 >= 0) {
                            player1.setY(player1.getY() - 4);
                        }
                    } else if (codes.contains(KeyCode.S)) {
                        if (player1.getY() + 53 <= 400) {
                            player1.setY(player1.getY() + 4);
                        }
                    }
                    if (codes.contains(KeyCode.UP)) {
                        if (player2.getY() - 3 >= 0) {
                            player2.setY(player2.getY() - 4);
                        }
                    } else if (codes.contains(KeyCode.DOWN)) {
                        if (player2.getY() + 53 <= 400) {
                            player2.setY(player2.getY() + 4);
                        }
                    }
                }
            });
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Javafx:同时多个密钥侦听器 的相关文章

  • 清理码头 - 删除“不必要”的东西

    我习惯用Jetty http jetty codehaus org jetty 作为我的网络容器 我对我做了什么安装步骤得到原始的焦油球并且清理一些目录和文件从中 我在这里想提出的是 您通常从 Jetty 中删除什么以在生产 登台环境中使用
  • Java Try Catch Final 没有 Catch 的情况下会阻塞

    我正在审查一些新代码 该程序只有一个 try 和一个 finally 块 既然排除了 catch 块 那么如果 try 块遇到异常或任何可抛出的内容 它如何工作 它直接进入finally块吗 如果 try 块中的任何代码可以引发已检查异常
  • 将 jar 作为 Linux 服务运行 - init.d 脚本在启动应用程序时卡住

    我目前正在致力于在 Linux VM 上实现一个可运行的 jar 作为后台服务 我已经使用了找到的例子here https gist github com shirish4you 5089019作为工作的基础 并将 start 方法修改为
  • 使用 GWT CellTableBuilder 构建树表

    Is it possible to build a tree table like this http www sencha com examples ExamplePlace basictreegrid with the new Cell
  • 使用 RecyclerView 适配器在运行时更改布局屏幕

    我有两个布局文件 如下所示 如果列表中存在数据 则我显示此布局 当列表为空时 我会显示此布局 现在我想在运行时更改布局 当用户从列表中删除最后一项时 我想将布局更改为第二张图片中显示的 空购物车布局 In getItemCount Recy
  • 内存一致性 - Java 中的happens-before关系[重复]

    这个问题在这里已经有答案了 在阅读有关内存一致性错误的 Java 文档时 我发现与创建 发生 之前 关系的两个操作相关的点 当语句调用时Thread start 每个具有 与该语句发生之前的关系也有一个 与 new 执行的每个语句之间发生的
  • 如何从 Retrofit2 获取字符串响应?

    我正在做 android 正在寻找一种方法来执行超级基本的 http GET POST 请求 我不断收到错误 java lang IllegalArgumentException Unable to create converter for
  • 具有共享依赖项的多模块项目的 Gradle 配置

    使用 gradle 制作第一个项目 所以我研究了 spring gradle hibernate 项目如何组织 gradle 文件 并开始制作自己的项目 但是 找不到错误 为什么我的配置不起作用 子项目无法解决依赖关系 所以项目树 Root
  • 如何获取 WebElement 的父级[重复]

    这个问题在这里已经有答案了 我试过了 private WebElement getParent final WebElement webElement return webElement findElement By xpath 但我得到
  • 隐式超级构造函数 Person() 未定义。必须显式调用另一个构造函数?

    我正在开发一个项目 但收到错误 隐式超级构造函数 Person 未定义 必须显式调用另一个构造函数 我不太明白它 这是我的人物课程 public class Person public Person String name double D
  • 获取给定类文件的目录路径

    我遇到的代码尝试从类本身的 class 文件所在的同一目录中读取一些配置文件 File configFiles new File this getClass getResource getPath listFiles new Filenam
  • 计算日期之间的天数差异

    在我的代码中 日期之间的差异是错误的 因为它应该是 38 天而不是 8 天 我该如何修复 package random04diferencadata import java text ParseException import java t
  • 在 Spring Boot Actuator 健康检查 API 中启用日志记录

    我正在使用 Spring boot Actuator APIproject https imobilenumbertracker com 拥有一个健康检查端点 并通过以下方式启用它 management endpoints web base
  • 尝试使用等于“是”或“否”的字符串变量重新启动 do-while 循环

    计算行程距离的非常简单的程序 一周前刚刚开始 我有这个循环用于解决真或假问题 但我希望它适用于简单的 是 或 否 我为此分配的字符串是答案 public class Main public static void main String a
  • Linux 上有关 getBounds() 和 setBounds() 的 bug_id=4806603 的解决方法?

    在 Linux 平台上 Frame getBounds 和 Frame setBounds 的工作方式不一致 这在 2003 年就已经有报道了 请参见此处 http bugs java com bugdatabase view bug do
  • 将图像添加到自定义 AlertDialog

    我制作了一个 AlertDialog 让用户可以从我显示的 4 个选项中选择一个 前 3 个让他们在单击号码时直接拨打号码 第 4 个显示不同的视图 现在看起来是这样的 由于第四个选项的目的是不同的任务 我想让它看起来不同 因为用户可能会感
  • 如何在Java中正确删除数组[重复]

    这个问题在这里已经有答案了 我刚接触 Java 4 天 从我搜索过的教程来看 讲师们花费了大量精力来解释如何分配二维数组 例如 如下所示 Foo fooArray new Foo 2 3 但我还没有找到任何解释如何删除它们的信息 从内存的情
  • Hibernate 和可序列化实体

    有谁知道是否有一个框架能够从实体类中剥离 Hibernate 集合以使它们可序列化 我查看了 BeanLib 但它似乎只进行实体的深层复制 而不允许我为实体类中的集合类型指定实现映射 BeanLib 目前不适用于 Hibernate 3 5
  • Android AutoCompleteTextView 带芯片

    我不确定我是否使用了正确的词语来描述此 UI 功能 但我已附上我希望在我的应用程序中实现的目标的快照 它由 Go SMS 使用 用户在编辑文本中键入联系人 在用户从完成下拉列表中选择联系人后 该联系人将被插入到编辑文本中 如附图所示 编辑文
  • 在哪里存储 Java 的 .properties 文件?

    The Java教程 http download oracle com javase tutorial essential environment properties htmlon using Properties 讨论如何使用 Prop

随机推荐

  • 如何使用 MSTest 从命令行运行 SpecFlow 场景?

    我有 Visual Studio 2010 并且我们有两个使用的 VS 解决方案 第一个是 Web 应用程序 第二个是严格用于 SpecFlow 测试 同时运行两个 Visual Studio 实例来运行 SpecFlow 功能会占用所有可
  • 从另一个网站获取数据

    我正在使用 PHP 创建一个新网站 我想从另一个有我的个人资料的网站获取数据 其中包含壁纸 徽标等 我想从该网站获取数据并将其显示在我的新网站的内容部分中 请给我一些关于如何在 PHP 中完成此任务的想法 提前致谢 参见例如这卷曲延伸 ht
  • Clojure 中的惯用模式函数

    我正在学习 Clojure 想要一些关于惯用用法的建议 作为小型统计包的一部分 我有一个计算一组数据的众数的函数 背景 众数是一组数据中最常见的值 几乎有十几种已发布的算法来计算它 这里使用的算法来自 Bernard Rosner 的 生物
  • 鼠标移动时滚动窗口

    大家好我的意思是 当鼠标移向窗口边缘 x 或 y 或两者 时 我希望页面滚动 当鼠标停止移动时 我希望页面停止滚动 有很多关于如何基于使用 onClick 事件或窗口边缘的滚动区域进行滚动的示例 但基于鼠标光标的移动的示例并不多 任何帮助将
  • 解析多部分表单数据

    我正在尝试组合一个 HTML POST 表单 该表单具有两个字段 文件上传和文本字段 由于表单具有用于文件上传的 multipart form data 类型 因此我无法通过正常的 PHP POST 变量获取文本字段 那么如何使用 PHP
  • ASP.NET 中的静态对象浪费内存?

    前几天我只是想知道这个问题 我不太确定 ASPX 如何管理垃圾处理 但据我所知 完成加载 不会删除静态内存值或在页面重新加载后 至少就 C 而言 静态意味着内存分配会跟随您的程序 直到程序本身关闭 ASPX 中也是这样吗 如果我有一个静态值
  • 我们可以在 C# 项目中使用 COM 对象吗?

    我按照教程制作了一个 C COM 对象 http www codeproject com Articles 18939 C Com http www codeproject com Articles 18939 C Com 现在我想在 C
  • VB.NET 中的 UploadString(Post 方法)不起作用

    我正在尝试将简单数据发布到某个站点 在本例中发布到本地服务器上的 php 文件 我的 VB NET 代码 Dim W As New Net WebClient Dim A As String W Encoding System Text E
  • Google 如何确定将页面索引为讨论页面? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我正在自己建立一个问答网站 我想让这个网站被Google索引为问答网站或论坛 可以在使用Google中的 讨论 时检索到 根据我的个人经验 当我想获得
  • pymongo:使用 MongoReplicaSetClient 的优点?

    看来两者Mongo客户端 http api mongodb org python current api pymongo mongo client html and MongoReplicaSet客户端 http api mongodb o
  • IOS:停止 NSTimer [重复]

    这个问题在这里已经有答案了 可能的重复 NSTimer 不会停止 https stackoverflow com questions 1031554 nstimer doesnt stop 我有这个代码 NSTimer scheduledT
  • TensorFlow中矩阵乘法函数的使用

    我对这个函数的使用有点困惑tf matmul 在 TensorFlow 中 不过 我的问题可能更多是关于深度学习的理论 假设你有一个输入 X 和权重矩阵 W 假设零偏差 我想将 WX 计算为输出 可以通过以下方式完成tf matmul W
  • 找不到适用于 jdbc:mysql/localhost:3306/world 的驱动程序

    我是这个领域编程的新手 我在驱动程序方面遇到了一些问题 有点 当我直接与客户端一起使用时 MySql 工作正常 问题是我无法将 tomcat 与 MySql 连接 我将所有驱动程序放在 WEB INF lib 中 使用mysql 5 7 t
  • Word 文档的 XML/XSD 验证

    我有一份将不断更新的文档 由文本和表格组成 这些表有两行 第一行包含数字范围 第二行包含单个数字 我想检查第 2 行中的数字是否在第 1 行给出的范围内 我想使用 XML 和 XSD 来执行此操作 我最初的想法是从单词 doc 创建一个 X
  • python-docx 从下拉列表中获取信息(在表中)

    我有一个包含多个表的 docx 文件 我想从列表中的表中获取所有信息 该列表称为 alletabellen 通过下面的脚本 我收到了表格中几乎所有的信息 除了下拉列表中的某些变量的值 在某些表格单元格中 这些单元格的值在我的列表中保持为空
  • 你能避免与 Promise 完全嵌套吗? [复制]

    这个问题在这里已经有答案了 据我了解 Promise 的主要卖点之一是能够编写扁平代码 或者 比回调地狱更扁平 尽管在很多情况下我们似乎需要嵌套 Promise 才能使用闭包 例如 来自q https www npmjs org packa
  • 使用 selenium webdriver 从 Jquery、日期选择器中选择日期

    前往Jquery官网https jqueryui com datepicker https jqueryui com datepicker 不允许单击输入文本 即使它具有唯一的 id datepicker 获取错误元素未找到异常 但当我通过
  • Netbeans:需要在类路径中包含第 3 方目录

    我们有一个在 NetBeans 中开发的应用程序 基于 NetBeans 平台 我们有一个运行时依赖的第 3 方程序 更具体地说 是其他程序 lib 文件夹中的 jar 我们应该如何将其他程序的 jar 包含在我们的类路径中 其他程序制造商
  • Angular ng-submit 未触发所需的控制器方法[重复]

    这个问题在这里已经有答案了 在 Angular 1 4 7 中 我试图在这个 plunk 中实现一个基本的登录表单http plnkr co edit xQEN1ZNN5ZEw1CSwNw97 p preview http plnkr co
  • Javafx:同时多个密钥侦听器

    我正在尝试在 Javafx 中重新创建 Pong 游戏 但我遇到了平台移动的问题 我使用 keylisteners 和 switch 语句来上下移动平台 左边的一个带有 W 和 S 右边的一个带有 Up 和 Down 当我单独按下它们时效果