線程,讓遊戲擁有了動態變化的能力。java
java的圖形界面,在啓動的時候,就開始了一個線程。編程
這個線程負責處理:JFrame、JPanel等的繪製、事件處理。app
它是由操做系統調用的,在程序啓動時開啓,程序關閉時消亡。框架
這個線程裏執行的邏輯,支撐着圖形框架的基礎邏輯,咱們沒法控制它。學習
想一下,遊戲裏那些動畫效果、呼嘯而出的子彈、飄來飄去的雲朵。。動畫
這些行爲都不是咱們用按鍵和鼠標來控制的,是隨着時間本身在動的。this
它們在動,說明它們的座標發生了變化,那麼誰來控制這些座標變化的呢?spa
答案是:另外一個線程!操作系統
先看一段線程的代碼吧:線程
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秒就運行一次的線程!
能夠把它想成一個定時器,每隔一段時間,就運行一次某個動做。
運行什麼動做呢? 遊戲的動態邏輯、遊戲界面的刷新!
再貼出剩下的兩塊代碼,以下:
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; } } }
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,執行一遍,看看效果。改改代碼,再看看執行效果。
用手寫,用眼看,用腦想,缺一不可。
臺哥編程課堂,用最口語化的表達,介紹編程如何入門。
爲何這麼口語化呢,由於臺哥的表達能力太差啦,實在寫不出書面語來。。