《Java 2D游戏编程入门》—— 2.2 键盘改进

简介: 尽管键盘输入类允许在游戏循环中访问键盘状态,但是实现起来还是有一些问题。首先,游戏循环代码执行的时候,如果键盘按键没有按下,将会错过keypress事件。尽管对于这些简单的示例来说,不太可能发生这种情况,但当应用程序变得更强大并且游戏循环需要更多的时间来处理代码时,游戏循环就可能变得太慢而导致错过了输入。

本节书摘来异步社区《Java 2D游戏编程入门》一书中的第2章,第2.2节,作者:【美】Timothy Wright(莱特),更多章节内容可以访问云栖社区“异步社区”公众号查看。

2.2 键盘改进

尽管键盘输入类允许在游戏循环中访问键盘状态,但是实现起来还是有一些问题。首先,游戏循环代码执行的时候,如果键盘按键没有按下,将会错过keypress事件。尽管对于这些简单的示例来说,不太可能发生这种情况,但当应用程序变得更强大并且游戏循环需要更多的时间来处理代码时,游戏循环就可能变得太慢而导致错过了输入。现在,只需要知道这可能是一个问题就行了。我们将会在第11章中讨论确保事件不会被错过的一种解决方案。

第二个问题是,当按键第一次被按下的时候,很难进行测试。如果需要跟踪20个按键,并且其中一些按键会根据游戏的状态而改变行为,那么,试图使用类似下面的代码来跟踪所有这些状态,可能会变得非常糟糕:

// SimpleKeyboardExample.java
if( keys.keyDown( KeyEvent.VK_SPACE ) ) {
  if( !space ) {
    System.out.println( "VK_SPACE" );
  }
  space = true;
} else {
  space = false;
}```
为了更新KeyboardInput类来跟踪初始的按键事件以及键盘状态,添加了一个整数型数值的数组。这些值将会记录按键被按下了多少帧。实现KeyListener接口的代码并不会改变,但是keyDown()方法不再会从布尔的按键数组提取值。

poll()方法同步地保护共享的按键数组,将键盘状态从布尔型数组转换为整数型数组。如果按键按下,这个值将会增加1;否则的话,它将会设置为0。现在,keyDown()方法将检测这个值是否为0,并且当这个值确实为1的时候,新的方法keyDownOnce()将会返回真。

package javagames.util;
import java.awt.event.*;
public class KeyboardInput implements KeyListener {
  private boolean[] keys;
  private int[] polled;
  public KeyboardInput() {
    keys = new boolean[ 256 ];
    polled = new int[ 256 ];
  }
  public boolean keyDown( int keyCode ) {
    return polled[ keyCode ] > 0;
  }
  public boolean keyDownOnce( int keyCode ) {
    return polled[ keyCode ] == 1;
  }
  public synchronized void poll() {
    for( int i = 0; i < keys.length; ++i ) {
      if( keys[i] ) {
        polled[i]++;
      } else {
        polled[i] = 0;
      }
    }
  }
  public synchronized void keyPressed( KeyEvent e ) {
    int keyCode = e.getKeyCode();
    if( keyCode >= 0 && keyCode < keys.length ) {
      keys[ keyCode ] = true;
    }
  }
  public synchronized void keyReleased( KeyEvent e ) {
    int keyCode = e.getKeyCode();
    if( keyCode >= 0 && keyCode < keys.length ) {
      keys[ keyCode ] = false;
    }
  }
  public void keyTyped( KeyEvent e ) {
    // Not needed
  }
}`

别忘了,针对每一帧要调用KeyboardInput.poll() 方法。
通过使用如下代码替换前面例子中的游戏循环代码,可以使用这个新的类。检查空格键按下一次所需的代码大大简化了。

// replacing the game loop
public void gameLoop() {
  keys.poll(); 
  if( keys.keyDownOnce( KeyEvent.VK_SPACE ) ) {
    System.out.println( "VK_SPACE" );
  }
  if( keys.keyDown( KeyEvent.VK_UP ) ) {
    System.out.println( "VK_UP" );
  }
  if( keys.keyDown( KeyEvent.VK_DOWN ) ) {
    System.out.println( "VK_DOWN" );
  }
  if( keys.keyDown( KeyEvent.VK_LEFT ) ) {
    System.out.println( "VK_LEFT" );
  }
  if( keys.keyDown( KeyEvent.VK_RIGHT ) ) {
    System.out.println( "VK_RIGHT" );
  }
  try {
    Thread.sleep( 10 );
  } catch( InterruptedException ex ) { }
相关文章
|
14天前
|
Java
java入门代码示例
本文介绍Java入门基础,包含Hello World、变量类型、条件判断、循环及方法定义等核心语法示例,帮助初学者快速掌握Java编程基本结构与逻辑。
205 0
|
2月前
|
安全 Java 数据库连接
2025 年最新 Java 学习路线图含实操指南助你高效入门 Java 编程掌握核心技能
2025年最新Java学习路线图,涵盖基础环境搭建、核心特性(如密封类、虚拟线程)、模块化开发、响应式编程、主流框架(Spring Boot 3、Spring Security 6)、数据库操作(JPA + Hibernate 6)及微服务实战,助你掌握企业级开发技能。
290 3
|
1月前
|
前端开发 Java 数据库连接
帮助新手快速上手的 JAVA 学习路线最详细版涵盖从入门到进阶的 JAVA 学习路线
本Java学习路线涵盖从基础语法、面向对象、异常处理到高级框架、微服务、JVM调优等内容,适合新手入门到进阶,助力掌握企业级开发技能,快速成为合格Java开发者。
307 3
|
2月前
|
NoSQL Java 关系型数据库
Java 从入门到进阶完整学习路线图规划与实战开发最佳实践指南
本文为Java开发者提供从入门到进阶的完整学习路线图,涵盖基础语法、面向对象、数据结构与算法、并发编程、JVM调优、主流框架(如Spring Boot)、数据库操作(MySQL、Redis)、微服务架构及云原生开发等内容,并结合实战案例与最佳实践,助力高效掌握Java核心技术。
225 1
|
2月前
|
Java 测试技术 API
Java IO流(二):文件操作与NIO入门
本文详解Java NIO与传统IO的区别与优势,涵盖Path、Files类、Channel、Buffer、Selector等核心概念,深入讲解文件操作、目录遍历、NIO实战及性能优化技巧,适合处理大文件与高并发场景,助力高效IO编程与面试准备。
|
2月前
|
Java 编译器 API
Java Lambda表达式与函数式编程入门
Lambda表达式是Java 8引入的重要特性,简化了函数式编程的实现方式。它通过简洁的语法替代传统的匿名内部类,使代码更清晰、易读。本文深入讲解Lambda表达式的基本语法、函数式接口、方法引用等核心概念,并结合集合操作、线程处理、事件回调等实战案例,帮助开发者掌握现代Java编程技巧。同时,还解析了面试中高频出现的相关问题,助你深入理解其原理与应用场景。
|
22天前
|
Java API 数据库
2025 年最新 Java 实操学习路线,从入门到高级应用详细指南
2025年Java最新实操学习路线,涵盖从环境搭建到微服务、容器化部署的全流程实战内容,助你掌握Java 21核心特性、Spring Boot 3.2开发、云原生与微服务架构,提升企业级项目开发能力,适合从入门到高级应用的学习需求。
304 0
|
1月前
|
监控 Java API
2025 年全新出炉的 Java 学习路线:从入门起步到实操精通的详细指南
2025年Java学习路线与实操指南,涵盖Java 21核心特性、虚拟线程、Spring Boot 3、微服务、Spring Security、容器化部署等前沿技术,助你从入门到企业级开发进阶。
245 0
|
2月前
|
前端开发 Java 数据库
Java 项目实战从入门到精通 :Java Web 在线商城项目开发指南
本文介绍了一个基于Java Web的在线商城项目,涵盖技术方案与应用实例。项目采用Spring、Spring MVC和MyBatis框架,结合MySQL数据库,实现商品展示、购物车、用户注册登录等核心功能。通过Spring Boot快速搭建项目结构,使用JPA进行数据持久化,并通过Thymeleaf模板展示页面。项目结构清晰,适合Java Web初学者学习与拓展。
192 1
|
2月前
|
算法 Java 测试技术
零基础学 Java: 从语法入门到企业级项目实战的详细学习路线解析
本文为零基础学习者提供完整的Java学习路线,涵盖语法基础、面向对象编程、数据结构与算法、多线程、JVM原理、Spring框架、Spring Boot及项目实战,助你从入门到进阶,系统掌握Java编程技能,提升实战开发能力。
129 0

热门文章

最新文章