java遊戲開發雜談 - 遊戲物體

java遊戲開發雜談 - 遊戲物體
現實生活中,有很多物體,每個物體的長相、行爲都不同。

物體存在於不同的空間內,它只在這個空間內發生作用。

物體沒用了,空間就把它剔除,不然既佔地方,又需要花精力管理。

需要它的時候,就把它造出來,不需要它的時候,就把它銷燬。

按照面向對象的設計思想,遊戲裏的物體,我們也把它定義爲一個類。

一個類就定義了一種物體的屬性、行爲。類是對象的模板,對象是類的實例。

我們用一個集合,把所有的遊戲物體都放在裏面,對它們進行統一的管理。

隨着遊戲線程的運行,集合裏的物體,它們的邏輯和繪製也不斷被調用執行。

我這裏實現一個例子:遊戲裏,鼠標點擊哪裏,哪裏就出現一個方塊,方塊先向上

運動,再往下,當掉落出屏幕後,方塊就從遊戲中消除。注意方塊的加速度機制。

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
package game7;

import java.awt.Color;
import java.awt.Graphics;

/**

public class FangKuai extends GameObject{

 
private GamePanel panel;
 
public FangKuai(GamePanel panel){
    this.panel = panel;
}
 
//縱座標超出多少,就銷燬
public int limit_y ;
 
private int u = -10; //速度
private int a = 1; //加速度
 

@Override
public void logic() {
    x = x + 1;
    y = y + u;
    u = u + a;
    if(y > limit_y){
        destory();
    }
}
 
@Override
public void paint(Graphics g) {
    g.setColor(Color.red);
    g.fillRect(x, y, 30, 30);
}
 
/**
 * 自身銷燬方法,即從遊戲屏幕中消失
 */
private void destory(){
    panel.remove(this);
}
 

}
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
package game7;

import java.awt.Graphics;

/**

public class GameObject {

 
//所在位置
public int x, y;

//自身邏輯
public void logic(){
     
}
 
//自身繪製
public void paint(Graphics g){
     
}
 

}
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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
package game7;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.LinkedList;
import java.util.List;

import javax.swing.JPanel;
/**

public class GamePanel extends JPanel implements MouseListener{

/** 屏幕的寬和高 */
private int width,height;
 
public GamePanel(int width, int height) {
    this.width = width;
    this.height = height;
    this.setSize(width, height);
     
    //設置當前畫布可以獲得焦點。
    this.setFocusable(true);
     
    this.addMouseListener(this);
}
 
/**
 * 遊戲物體所在的集合
 */
private List<GameObject> objects = new LinkedList<GameObject>();
 
 
/**
 * 畫布的繪製
 */
public void paintComponent(Graphics g) {
    super.paintComponent(g);
     
    //畫綠色背景
    g.setColor(new Color(0x9391d6));
    g.fillRect(0, 0, width, height);
     
    //繪製出所有遊戲物體
    for (int i = 0; i < objects.size(); i++) {
        GameObject go = objects.get(i);
        go.paint(g);
    }
}
 
/**
 * 遊戲邏輯,調用所有遊戲物體的邏輯
 */
public void logic()
{
    for (int i = 0; i < objects.size(); i++) {
        GameObject g = objects.get(i);
        g.logic();
    }
}
 
 
public void remove(GameObject object){
    objects.remove(object);
}

@Override
public void mouseClicked(MouseEvent e) {
}

@Override
public void mousePressed(MouseEvent e) {
    FangKuai fk = new FangKuai(this);
    fk.x = e.getX() - 15;
    fk.y = e.getY() - 15;
    fk.limit_y = this.height;
    this.objects.add(fk);
}

@Override
public void mouseReleased(MouseEvent e) {
}

@Override
public void mouseEntered(MouseEvent e) {
}

@Override
public void mouseExited(MouseEvent e) {
}
 

}
另外的GameFrame和GameThread兩個類,跟前面兩篇博客的一樣,這裏就不重複貼出了。

遊戲的運行截圖也不發了,大家可以自己運行下代碼,反正就是方塊的生成、運動、銷燬。

方塊繼承的是GameObject類,我們繼續定義圓形、三角形、五角星等,都讓它們繼承GameObject,

也可以定義子彈、飛機、植物、地圖、人物、怪物等等,只要有行爲的物體,都可以繼承GameObject。

然後用一個集合來統一管理它們。順便說下爲什麼用LinkedList,因爲這個鏈表列表,刪除的效率高。

講到這裏,基本上一個遊戲的雛形,已經建立起來了,剩下的就是在這個框架上,進行完善。

如同我們學繪畫,先要臨摹那些正方體、椎體,正是這些基礎性的東西,構造出很複雜的圖案。

遊戲裏那些很酷、很炫、很複雜的效果,也都是基於繪製、刷新、線程、事件、有限狀態機。

萬變不離其宗,掌握好基本的東西,剩下的都是些技巧,運用之妙,存乎一心也。

去開發自己的遊戲,享受編程的樂趣吧。。

原文地址https://www.cnblogs.com/chaohi/p/10782259.html

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