java游戏开发杂谈 - 线程
线程,让游戏拥有了动态变化的能力。
java的图形界面,在启动的时候,就开始了一个线程。
这个线程负责处理:JFrame、JPanel等的绘制、事件处理。
它是由操作系统调用的,在程序启动时开启,程序关闭时消亡。
这个线程里执行的逻辑,支撑着图形框架的基础逻辑,我们无法控制它。
想一下,游戏里那些动画效果、呼啸而出的子弹、飘来飘去的云朵。。
这些行为都不是我们用按键和鼠标来控制的,是随着时间自己在动的。
它们在动,说明它们的坐标发生了变化,那么谁来控制这些坐标变化的呢?
答案是:另一个线程!
先看一段线程的代码吧:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | package game5; /** * java游戏开发杂谈 * ---demo5:引入线程 * * @author 台哥编程课堂 * https://www.cnblogs.com/chaohi/ * * @date 2019-04-23 */ public class GameThread extends Thread{ private GamePanel panel; public GameThread(GamePanel panel){ this .panel = panel; } public void run() { while ( true ){ try { //程序运行暂停 0.01秒 Thread.sleep( 10 ); } catch (InterruptedException e) { e.printStackTrace(); } //循环逻辑的执行 panel.logic(); //页面刷新 panel.repaint(); } } } |
这就是我们定义的、用来控制游戏动态逻辑的、每隔0.01秒就运行一次的线程!
可以把它想成一个定时器,每隔一段时间,就运行一次某个动作。
运行什么动作呢? 游戏的动态逻辑、游戏界面的刷新!
再贴出剩下的两块代码,如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 | package game5; import java.awt.Color; import java.awt.Graphics; import javax.swing.JPanel; /** * java游戏开发杂谈 * ---demo5:引入线程 * * @author 台哥编程课堂 * https://www.cnblogs.com/chaohi/ * * @date 2019-04-23 */ public class GamePanel extends JPanel{ /** 屏幕的宽和高 */ private int width,height; public GamePanel( int width, int height) { this .width = width; this .height = height; this .setSize(width, height); //设置当前画布可以获得焦点。 this .setFocusable( true ); } /**方块的位置*/ private int fk_x = 60 ; private int fk_y = 60 ; /** * 画布的绘制 */ public void paintComponent(Graphics g) { super .paintComponent(g); //画绿色背景 g.setColor( new Color( 0x9391d6 )); g.fillRect( 0 , 0 , width, height); //绘制方块 g.setColor(Color.red); g.fillRect(fk_x, fk_y, 80 , 80 ); } /** * 游戏逻辑,处理方块的运动,每次横纵坐标都移动1个像素 */ public void logic() { if (fk_x < 260 ){ fk_x = fk_x + 1 ; } else { fk_x = 60 ; } if (fk_y < 260 ){ fk_y = fk_y + 1 ; } else { fk_y = 60 ; } } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | package game5; import javax.swing.JFrame; /** * java游戏开发杂谈 * ---demo5:引入线程 * * @author 台哥编程课堂 * https://www.cnblogs.com/chaohi/ * * @date 2019-04-23 */ public class GameFrame extends JFrame{ private int width = 600 , height = 400 ; public GameFrame() { //设置窗体标题 this .setTitle( "java游戏开发杂谈-台哥出品" ); //创建一个画布 GamePanel panel = new GamePanel(width, height); //把画布加入到窗体中 getContentPane().add(panel, "Center" ); //设置窗体大小 this .setSize(width, height); //设置能否调整窗体大小 this .setResizable( false ); //这句会使得在屏幕上居中显示 this .setLocationRelativeTo( null ); //当关闭窗体的时候退出程序 this .setDefaultCloseOperation(EXIT_ON_CLOSE); //把窗体显示出来 this .setVisible( true ); //开始游戏线程的循环 GameThread gt = new GameThread(panel); gt.start(); } /** * 主方法 */ public static void main(String[] args) { GameFrame frame = new GameFrame(); } } |
在游戏界面创建时,我们就创建了游戏线程。游戏界面显示后,游戏线程也随之启动了,然后就不断的调用游戏逻辑、刷新游戏界面。
我们就可以在逻辑方法里进行物体的坐标修改、动画的帧数切换、人物的行为变化、地图的移动等等,游戏线程里这一刻运行的逻辑,影响着下一刻游戏界面上的变化。
上面的三段代码,执行后出现的是,一个方块从屏幕左上角往右下角运动,运动一段后再回到左上角。
最好的学习方法,是实践! 眼过千遍,不如手过一遍!
老老实实的把代码放进Eclipse,执行一遍,看看效果。改改代码,再看看执行效果。
用手写,用眼看,用脑想,缺一不可。
台哥编程课堂,用最口语化的表达,介绍编程如何入门。
为什么这么口语化呢,因为台哥的表达能力太差啦,实在写不出书面语来。。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步