本节书摘来异步社区《java 2d游戏编程入门》一书中的第1章,第1.4节,作者:【美】timothy wright(莱特),更多章节内容可以访问云栖社区“异步社区”公众号查看。
除了使用前面的代码来执行定制的渲染外,还需要一个定制的渲染线程。为了只是关注线程问题,位于<code>javagames.render</code>包中的<code>renderthreadexample</code>实际上不会在屏幕上绘制任何内容,它只是在渲染代码应该出现的地方打印出“game loop”。下面的示例将<code>renderthreadexample</code>和前面的代码组合起来,创建了一个主动渲染的应用程序。
在renderthreadexample中,首先需要注意的是,它实现了一个可运行的接口。这个可运行的接口包含一个单个的方法,即<code>public void run()</code>。这个方法包含了渲染循环,并且它只调用一次。当它返回的时候,线程结束并且不能再次使用。为了防止run方法中的代码在程序完成之前退出,boolean类型的running变量保持run方法重复运行。
app.addwindowlistener( new windowadapter() {
public void windowclosing( windowevent e ) {
app.onwindowclosing();
}
});<code>`</code>
要关闭渲染线程,running变量应设置为false。然而,渲染线程可能只是读取running变量的值,并且进入睡眠。要确保该线程已经停止了,应调用join()方法。该方法将会等待,直到该线程结束,并且run方法已经返回。如果没有向join()方法传入一个超时值,将会在线程结束前造成阻塞,因此,如果没有提供超时值的话,请确保线程将会结束。
最后,必须通过手动调用system.exit(0)来关闭程序。之前,当在jframe中设置jframe.exit_on_close标志的时候,程序将会结束。这时应用程序负责处理关闭,只有在调用了exit方法的时候,程序才会结束。如果应用程序在关闭后挂起,通常是因为程序员忘了调用system.exit()。