《Java 2D游戏编程入门》—— 1.2 创建Hello World应用程序

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

1.2 创建Hello World应用程序

图1.1所示的Hello World应用程序是第一个游戏窗口的示例。HelloWorldApp位于javagames.render包中。除了清除和重新绘制背景,这个窗口中不再渲染其他内容。HelloWorldApp扩展了JFrame类,这是Java的Swing库中一个顶级的窗口组件。这个应用程序包含一个FrameRate对象,该对象用来测量应用程序的帧速率。

d45a75eca7b893fadf348c05d0b82d0e0a2fddcc

由于Swing库不是线程安全的,因此你应该总是在Swing事件线程上创建并展示一个JFrame。然而,该程序的main()方法并不是在事件线程上调用的,因此,必须要使用SwingUtilities类来启动游戏窗口。通过使用SwingUtilities类,我们在相同的线程上创建了GUI组件。在使用Swing组件进行渲染的时候,遵从Java对于线程的规则是很重要的,因为忽略这些规则可能会导致不确定的行为,而这些行为是很难调试的。

我知道有的程序员会针对要在整个站点上部署的应用程序注释掉SwingUtilities代码,以测试是否真的需要SwingUtilities类来启动游戏窗口。每过几天,一些人就会报告应用程序在刚启动的时候崩溃。注意,我从来不会做这种事情,但这种做法似乎确实管用。

final HelloWorldApp app = new HelloWorldApp();
  SwingUtilities.invokeLater( new Runnable() {
    public void run() { 
      app.createAndShowGUI();
    }
});```
在HelloWorldApp内部,是GamePanel类,它扩展了一个JPanel。GamePanel类用于在屏幕上绘制图形。覆盖了paint方法,这使得应用程序可以访问Graphics对象。注意,之所以能使用背景颜色来清除这个面板,只是因为调用了super.paint()方法。如果把这个方法的调用去除掉,就不会再绘制背景了。onPaint()方法中的实际代码并没有做任何令人兴奋的事情。目前,它计算并显示了帧速率。

注意,在paint()方法中,调用了repaint()。如果该应用程序在其自身内部递归地调用paint(),该方法将会无法返回(直到程序抛出一个栈溢出异常)。repaint()方法发出一个绘制请求,只要当前的绘制请求完成了,就会启动该请求。应用程序通过这种方式来尽可能快地持续绘制。

createAndShowGUI()方法是实际创建和显示窗口的地方。应在GamePanel上设置优先大小,而不是在JFrame上设置优先大小,这一点很重要。注意,当创建GamePanel的时候,已经设置了其优先大小。如果在JFrame上设置应用程序的大小,一些绘制区域将会被帧所占用,并且绘制区域将会变得更小一些。在面板上设置大小,可以保证它完全符合指定的大小。

在设置窗口之后,显示窗口之前,会初始化帧速率类。设置该类的初始启动时间是必须的,这样才能正确地计算第一帧。一旦通过调用setVisible(true)使得应用程序变得可见,就会调用绘制方法,该方法继续计算帧速率并且重新绘制自身直到应用程序关闭。

HelloWorldApp示例的代码如下所示。

package javagames.render;

import java.awt.*;
import javax.swing.*;
import javagames.util.*;

public class HelloWorldApp extends JFrame {

  private FrameRate frameRate;
  public HelloWorldApp() {
    frameRate = new FrameRate();
  }

  protected void createAndShowGUI() {
    GamePanel gamePanel = new GamePanel();
    gamePanel.setBackground( Color.BLACK );
    gamePanel.setPreferredSize( new Dimension( 320, 240 ) );
    getContentPane().add( gamePanel );
    setDefaultCloseOperation( EXIT_ON_CLOSE );
    setTitle( "Hello World!" );
    pack();
    frameRate.initialize();
    setVisible( true );
  }

  private class GamePanel extends JPanel {
    public void paint( Graphics g ) {
      super.paint( g );
      onPaint( g );
    }
  }

  protected void onPaint( Graphics g ) {
    frameRate.calculate();
    g.setColor( Color.WHITE );
    g.drawString( frameRate.getFrameRate(), 30, 30 );
    repaint();
  }
  public static void main( String[] args ) {
    final HelloWorldApp app = new HelloWorldApp();
    SwingUtilities.invokeLater( new Runnable() {
      public void run() {
        app.createAndShowGUI();
      }
    });
  }
}`

中文名: Java2游戏编程 原名: Java 2 Game Programming 作者: Thomas Petchel译者: 晏利斌 孙淑敏 邵荣 资源格式: PDF 版本: 扫描版 出版社: 清华大学出版社书号: 7302112932发行时间: 2005年08月 地区: 大陆 语言: 简体中文 简介: 内容介绍:   你经常看到有人在玩手机游戏吧,那些手机游戏基本上是用Java编写的。Java已经成熟了,它现在是一种开发能够多种平台上运行的中小型游戏的很好方式。本书将向读者展示用Java语言和它的类库创建2D游戏,所涉及的主题包括高速性能、双缓冲图像、动画、声音、媒体控制、I/O和网络支持等。将带领大家一步一步学习编写Java游戏,最终打造属于自己的Java游戏。 目录: 第1篇 步入Java丛林:从Java2 API开始 第1章 Java2软件开发工具包 1.1 Java简史 1.2 为什么在游戏中使用Java 1.3 为Java准备系统 1.3.1 安装Java SDK 1.3.2 编译和运行Java程序 1.3.3 使用命令行 1.3.4 使用集成开发环境(IDE) 1.3.5 关于Java2文档的说明 1.4 总结 第2章 预备:学习Java2 API 2.1 Game Over! 程序 2.1.1 import语句 2.1.2Java代码加注释 2.1.3 Java类声明 2.1.4 Java方法声明 2.1.5 Java中的代码块 2.1.6 Java程序组成部分的关键点回顾 2.2 比特和字节:原始的Java类型 2.2.1 基本的整数类型 2.2.2 浮点类型 2.2.3 Char类型 2.2.4 布尔型 2.2.5 String类型 2.2.6 强制转换变量类型 2.2.7 Java数据类型、数组和标识符需要记忆的要点 2.3 Java中的运算符 2.3.1 赋值运算符 2.3.2 比较运算符 2.3.3 算术运算符 2.3.4 自增和自减运算符 2.3.5 更多的整数运算符 2.3.6 使用点运算符 2.3.7 instanceof运算符 2.3.8 优先级顺序 2.3.9 关于运算符的记忆要点 2.4 条件语句 2.4.1 switch语句 2.4.2 Java中的循环语句 2.4.3 用break、continue和return提前退出循环 2.5 处理运行时异常 2.5.1 使用try和catch块 2.5.2 使用throws子句 2.5.3 关于流程控制语句的记忆要点 2.6 总结 2.7 练习 第3章 带有类的语言:Java面向对象程序设计 3.1 设计一个Java类 3.2 方法的魔法 3.3 关于方法的更多话题 3.3.1 构造函数方法 3.3.2 访问方法 3.3.3 类方法 3.3.4 “其他”方法 3.4 继承 3.5 抽象类 3.6 类修饰符 3.7 接口 3.8 快捷地创建类 3.9 包 3.10 总结 3.11 练习 第4章 Java API为你服务:常用Java类 4.1 java.lang包 4.1.1 java.lang.Object 4.1.2 java.lang.String 4.1.3 java.lang.StringBuffer 4.1.4 封装类 4.1.5 java.lang.Math 4.1.6 java.lang.System 4.1.7 java.lang.Cloneable 4.1.8 java.lang.Thread 4.2 java.io包 4.3 java.util包 4.3.1 java.util.StringTokenizer 4.3.2 java.util.Random 4.3.3 Java2集合框架 4.4 总结 4.5 练习 第2篇 Java 2-D图像开发和抽象Window工具包 第5章 Applet基础 5.1 什么是Java applet 5.2 Applet和Application的比较 5.3 Applet的组成和生命周期 5.4 一个Applet例子 5.5 运行Java Applets 5.6 通用AWT组件 5.6.1 按钮 5.6.2 单选按钮(Radio Button) 5.6.3 作出重要选择 5.6.4 循环播放声音文件 5.6.5 文本域 5.6.6 标签 5.7 布局管理 5.7.1 FlowLayout类 5.7.2 GridLayout类 5.7.3 BorderLayout类 5.7.4 CardLayout类 5.8 容器(Container) 5.9 创建自定义组件 5.10 一个完整的例子 5.11 总结 5.12 练习 第6章 监听用户 6.1 EventLi
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值
>