引言
昨天我們完成了第一版最基本的3D引擎,可以控制攝影機移動、旋轉,
觀察其世界裡面的一切,但終究只能在程式中寫死預先要建立哪些方塊...
接下來我們就來擴增自行放置方塊的功能吧!
在開始前我們先來介紹會使用到的一些資料結構:struct 與 linklist。
結構(struct)
結構簡單來說是可以裝很多變數的結構體,
關鍵字「struct」,連接一個大括號,大括號中可以放許多資料型態不同的變數。
C語言中,很常會在struct前加上typedef關鍵字,利用typedef另外幫struct取名字。
為什麼要這麼做呢?
舉個例子:
struct student
{
int id;
char name[8];
};
一個學生的結構,包含id以及姓名。
若我們要宣告一個新的student型態變數,那我們要這樣子:
struct student student1; // 我們不管取什麼結構名,都要在前面加上"struct"
一旦程式變複雜,這種寫法會增加讀取上的困難。
因此我們可以用typedef替它取個名字:
typedef struct student
{
int id;
char name[8];
}Student; // 取的新名字放在這
意思就是,我利用typedef把"struct student"取為"Student"。
這麼一來,若我們再宣告一個新的student型態變數,就可以這樣子:
Student student1; // 簡潔多了,宣告方式變得跟 int a; 類似
struct取用其中的變數的方法也很簡單:
student1.id = 12345; // 用"."來取得其中的變數
結構指標(struct pointer)
講到C語言,就會想到指標~
int, double等型態有自己的指標,struct也有哦,宣告方式如下:
Student *student_pointer; // 宣告一個結構指標:student_pointer,型態為:Student *
我們可以用結構指標來指向結構並試著存取它:
student_pointer = &student1; // 將student1這個結構的位址指派給student_pointer
結構指標若指向了一個合法的結構,可以用"->"來直接存取該結構的內容:
student_pointer->id = 12345;
// 意思等同於:
(*student_pointer).id = 12345; // 先查出student_pointer指向的結構,再用"."取得內容
鏈結串列(linklist)
(這邊講的是最基本的linklist種類)
鏈結串列是利用結構與指標來共同組合的一種資料結構,
它在一個結構中定義一些資料的變數,以及一個指向下一個結構的指標。
舉個例子吧:
typedef struct node
{
int someData; // 一些資料(可能不只一個)
Node *next; // 最重要的,需要有一個指向下一個Node型態結構的指標
}Node;
這裡有張示意圖:
再來,我們實際建立一個linklist吧:
typedef struct book // 書
{
int id; // 編號
char title; // 標題開頭字母
Node *next;
}Book;
Book *checker; // 我們取名叫檢查者,就像生產線上一本一本檢查書本的工人
Book book1;
Book book2;
Book leader; // id, title都為空,作為鏈結串列的開頭,一個標的物的概念,表示這裡是第一個
checker = &leader; // checker指到了leader,作為第一項
// (checker目前在leader)
checker->next = &book1; // 將leader的next設為book1
checker = checker->next; // 這個動作表示checker移動到leader的下一項,也就是book1
// (checker目前在book1)
checker->id = 10001;
checker->title = 'A'; // 開始操作book1的內容
checker->next = &book2;
// (checker目前在book2)
checker->id = 10002;
checker->title = 'B'; // 開始操作book2的內容
checker->next = NULL; // 非常重要,當不再往下串,記得將最後一項的next設為NULL,表示這裡是終點
checker = &leader; // checker回到開頭,串列串接完成,等待往後的操作
// (checker目前在leader)
我們粗淺地講解了struct與linklist的概念,明天將會直接使用這兩個概念來建立「放置方塊功能」!