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秒就運作一次的線程!
可以把它想成一個定時器,每隔一段時間,就運作一次某個動作。
運作什麼動作呢? 遊戲的動态邏輯、遊戲界面的重新整理!
再貼出剩下的兩塊代碼,如下:
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
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JPanel;
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;
}
}
import javax.swing.JFrame;
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,執行一遍,看看效果。改改代碼,再看看執行效果。
用手寫,用眼看,用腦想,缺一不可。
台哥程式設計課堂,用最口語化的表達,介紹程式設計如何入門。
為什麼這麼口語化呢,因為台哥的表達能力太差啦,實在寫不出書面語來。。
原文位址
https://www.cnblogs.com/chaohi/p/10766790.html