java遊戲開發雜談 - 線程

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;
/**

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;
/**

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;
/**

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章