【发布时间】:2019-11-23 09:54:12
【问题描述】:
我正在尝试用 Java 开发 Snake,并且我使用 KeyListeners 来获取按钮 w、a、s 和 d 的 KeyEvent。我创建了一个实现 KeyEvent 的类,并将该类的一个对象添加到我正在绘制的画布中。
游戏在 while(true) 循环中运行,在此循环中,它每秒调用 update() 方法 60 次,同时一直调用 render() 方法。
我现在的问题是关于 KeyEvent: 如果我输入 f.x。 w,我的 KeyEvent 对象中的方法是否立即执行,或者我正在运行的 while 循环如何执行代码顺序? 在我的 while 循环中根本没有 KeyEvent 对象的引用,如果我键入一个 Key,我的 KeyEvent 对象中的 Methode 会被调用并执行它应该做的任何事情。
除了我必须在我的 while(true) 循环中放置一个 if 语句之外,我会读取是否按下了任何按钮,或者 KeyListener 将在不同的线程上运行,它会在其中查找来自键盘处于 while(true) 循环中。
【问题讨论】:
-
你没有发布代码,所以我们不得不猜测。事件侦听器在 Swing 事件调度线程上执行。您的 while 循环可能正在主线程或其他线程上同时执行。
-
我不清楚你的问题是什么(或者你似乎已经自己回答了)。也就是说,当一个键被按下时,KeyEvent 侦听器方法被激活,而无需在主循环中使用任何轮询代码。这就是 Windows 和 Swing 等事件驱动的 GUI 的工作方式。鼠标移动、菜单选择和其他用户交互也是如此。既然您已经观察到这一点,那么您的问题到底是什么???
-
刚刚查了一下,谢谢解答。让我更清楚。我还有一个问题是,当两个线程同时更新时,它不能陷入一些冲突吗?我的问题是,如果 KeyEvents 在不同的线程上运行。 JavaDoc 上没有提到任何内容。
-
刚查了一下,谢谢回答 太好了。也许您愿意回答自己的问题并与我们分享?
-
Abra,那是关于我上方的前 2 个 cmets。他们非常清楚地回答了这个问题。