iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 17
1
Software Development

若沒有遊戲引擎、合作夥伴...做得出遊戲嗎? 不試試看不知道吧? [使用C語言]系列 第 17

[11屆鐵人賽Day17] 3D引擎製作(七)—放置方塊(上)(struct, linklist介紹)

  • 分享至 

  • xImage
  •  

引言

昨天我們完成了第一版最基本的3D引擎,可以控制攝影機移動旋轉
觀察其世界裡面的一切,但終究只能在程式中寫死預先要建立哪些方塊...

接下來我們就來擴增自行放置方塊的功能吧!

在開始前我們先來介紹會使用到的一些資料結構:structlinklist


結構(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;

這裡有張示意圖:
https://ithelp.ithome.com.tw/upload/images/20191001/20111429ac5CVff3tS.png

再來,我們實際建立一個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的概念,明天將會直接使用這兩個概念來建立「放置方塊功能」!


上一篇
[11屆鐵人賽Day16] 3D引擎製作(六)—按鍵讀取設計
下一篇
[11屆鐵人賽Day18] 3D引擎製作(八)—放置方塊(下)
系列文
若沒有遊戲引擎、合作夥伴...做得出遊戲嗎? 不試試看不知道吧? [使用C語言]30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言