《Java 2D游戏编程入门》—— 1.5 创建一个主动渲染的窗口
本节书摘来异步社区《Java 2D游戏编程入门》一书中的第1章,第1.5节,作者:【美】Timothy Wright(莱特),更多章节内容可以访问云栖社区“异步社区”公众号查看。
1.5 创建一个主动渲染的窗口可以使用主动渲染,将渲染代码从事件分派线程移动到定制游戏线程。Windows类和Canvas类是两个可用的类,它们允许创建一个BufferStrategy。通过添加画布,我们可以访问缓冲策略,并且强迫画布的大小与所要求的大小完全一致,就像Hello World应用程序中的JPanel示例一样。
由于渲染循环为应用程序完成了所有的绘制,因此可以在JFrame上设置setIgnoreRepaint()标志。调用Canvas.createBufferStrategy(),传入想要缓冲的数目,然后调用Canvas.getBufferStrategy()创建主动渲染所需的缓冲。由于应用程序正在处理绘制,因此这里不需要响应重绘方法。Component.setIgnoreRepaint()方法负责忽略额外的绘制消息。
如果在窗口布局之前创建了BufferStrategy的话,将会有一个奇怪的错误发生:
Exception in thread "AWT-EventQueue-0" java.lang.IllegalStateException: Component must have a valid peer``` 调用pack()方法可以解决这个问题。如果抛出了前面的异常,要注意,在尝试创建BufferStrategy 之前,确保Component是可见的或者已经包装了。 游戏循环现在执行渲染,就像之前的小节中所讨论的那样。使用getDrawGraphics()、contentsLost()、show()和dispose()方法,渲染循环控制了应用程序绘图。一旦图形对象变得可用,并且之前的屏幕已经清除了,就可以渲染场景了。ActiveRenderingExample代码可以在javagames.render包中找到。
package javagames.render;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import javax.swing.*;
import javagames.util.*;
public class ActiveRenderingExample extends JFrame implements Runnable {
private FrameRate frameRate;
private BufferStrategy bs;
private volatile boolean running;
private Thread gameThread;
public ActiveRenderingExample() {
frameRate = new FrameRate();
}
protected void createAndShowGUI() {
Canvas canvas = new Canvas();
canvas.setSize( 320, 240 );
canvas.setBackground( Color.BLACK );
canvas.setIgnoreRepaint( true );
getContentPane().add( canvas );
setTitle( "Active Rendering" );
setIgnoreRepaint( true );
pack();
setVisible( true );
canvas.createBufferStrategy( 2 );
bs = canvas.getBufferStrategy();
gameThread = new Thread( this );
gameThread.start();
}
public void run() {
running = true;
frameRate.initialize();
while( running ) {
gameLoop();
}
}
public void gameLoop() {
do {
do {
Graphics g = null;
try {
g = bs.getDrawGraphics();
g.clearRect( 0, 0, getWidth(), getHeight() );
render( g );
} finally {
if( g != null ) {
g.dispose();
}
}
} while( bs.contentsRestored() );
bs.show();
} while( bs.contentsLost() );
}
private void render( Graphics g ) {
frameRate.calculate();
g.setColor( Color.GREEN );
g.drawString( frameRate.getFrameRate(), 30, 30 );
}
protected void onWindowClosing() {
try {
running = false;
gameThread.join();
} catch( InterruptedException e ) {
e.printStackTrace();
}
System.exit( 0 );
}
public static void main( String[] args ) {
final ActiveRenderingExample app = new ActiveRenderingExample();
app.addWindowListener( new WindowAdapter() {
public void windowClosing( WindowEvent e ) {
app.onWindowClosing();
}
});
SwingUtilities.invokeLater( new Runnable() {
public void run() {
app.createAndShowGUI();
}
});
}
}`
java入门之数据结构详细介绍以及代码示例 数据结构是计算机科学中的一个重要概念,它是指在计算机中存储和组织数据的方式。在Java中,数据结构可以通过类和接口来实现。本文将介绍Java中常见的数据结构,包括数组、链表、栈、队列、二叉树、哈希表等,并提供相应的代码示例。
Java入门 Java属于高级编程语言,接近人类语言,需要有翻译成机器语言才能运行,javac和java文件分别提供了编译和运行功能,这两个工具包含在JDK中,JDK由JRE和开发工具组成,JRE包含JVM和库函数,安装完Java后需要配置Path和JAVA_HOME环境变量
异步社区 异步社区(www.epubit.com)是人民邮电出版社旗下IT专业图书旗舰社区,也是国内领先的IT专业图书社区,致力于优质学习内容的出版和分享,实现了纸书电子书的同步上架,于2015年8月上线运营。公众号【异步图书】,每日赠送异步新书。
相关文章
- JAVA学习(五):Java面向对象编程基础
- Java实现 LeetCode 389 找不同
- Java实现 LeetCode 299 猜数字游戏
- Java实现 LeetCode 107 二叉树的层次遍历 II(二)
- Java实现 LeetCode 71 简化路径
- java实现 洛谷 P1056 排座椅
- java实现 洛谷 P1427 小鱼的数字游戏
- java实现亲密数
- java实现取球游戏
- java实现拍7游戏
- Java实现 蓝桥杯 历届试题 数字游戏
- java实现求逆序对
- Java实现蓝桥杯调和级数
- Java实现蓝桥杯历届试题填字母游戏
- Java实现蓝桥杯历届试题填字母游戏
- Java实现 蓝桥杯VIP 算法训练 传球游戏
- Java实现 蓝桥杯VIP 算法训练 链表数据求和操作
- 向Java开发者介绍Scala
- 【JAVA】java中的length和length()
- Atitit.跨平台预定义函数 魔术方法 魔术函数 钩子函数 api兼容性草案 v2 q216 java c# php js.docx
- Java — java.lang.NullPointerException - 如何处理空指针异常
- Java扑克牌(斗地主,手中牌的排序)【Comparator】
- 【Java】java 环境配置(详细教程)
- JAVA编程:java环境安装和helloworld
- 【Java】java 性能监控及工具
- java中的transient 详细总结Java中transient关键字 对象写出流ObjectOutputStream 对象写入流ObjectInputStream
- JAVA运行java程序
- Java collection 容器
- Java如何将每个单词的第一个字符转为大写?
- 基于Java+SpringBoot+Vue前后端分离农产品物流系统设计与实现(有视频讲解)
- 【java】Java 中泛型的实现原理
- 【java】Java 封装
- Java类加载
- Java软件开发 | 高并发编程篇之——安全访问的集合(2)