java游戲開發雜談 - 線程


線程,讓游戲擁有了動態變化的能力。

java的圖形界面,在啟動的時候,就開始了一個線程。

這個線程負責處理:JFrame、JPanel等的繪制、事件處理。

它是由操作系統調用的,在程序啟動時開啟,程序關閉時消亡。

這個線程里執行的邏輯,支撐着圖形框架的基礎邏輯,我們無法控制它。


想一下,游戲里那些動畫效果、呼嘯而出的子彈、飄來飄去的雲朵。。

這些行為都不是我們用按鍵和鼠標來控制的,是隨着時間自己在動的。

它們在動,說明它們的坐標發生了變化,那么誰來控制這些坐標變化的呢?

答案是:另一個線程!


先看一段線程的代碼吧:

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,執行一遍,看看效果。改改代碼,再看看執行效果。

用手寫,用眼看,用腦想,缺一不可。


台哥編程課堂,用最口語化的表達,介紹編程如何入門。

為什么這么口語化呢,因為台哥的表達能力太差啦,實在寫不出書面語來。。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM