iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 11
1

引言

經過了前面幾天的洗禮,我們就大致具備了製作一個簡易3D引擎所需的知識啦!

接下來我們將從0開始設計一個簡易3D引擎。

備註:以下程式碼最上方的

/* File: Xxxxx.h */

僅為註解,寫給讀者們方便辨識要把程式寫在哪個檔案用的,可不加。


準備

  1. 先建立一個新專案,並新增一個"main.c"檔案在專案中。
    https://ithelp.ithome.com.tw/upload/images/20190925/201114294nDVMSXfh4.png
  2. 在main中先打一些基本的include與main函數
/* File: main.c */

#include <stdio.h>  // 標準輸入輸出
#include <stdlib.h>  // 標準函式庫
#include <windows.h>  // 控制視窗用
#include <math.h>  // 數學函式庫(三角函數、四捨五入等等)

int main(int argc, char *argv[])
{


    return 0;
}

繪製記憶體

第一步我們要設計的就是用來儲存要準備繪製在螢幕上的圖形的空間,
我們取名叫「繪製記憶體」,也就是renderMemory

這塊空間考量到螢幕是一個二維平面,由滿滿的字元組成,因此我們可以用char型態二維陣列來設計!

  1. 首先我們先建立一個"RenderMemory.h"檔以及"RenderMemory.c"檔
    https://ithelp.ithome.com.tw/upload/images/20190925/20111429EJmtWhJj2z.png

  2. 在"RenderMemory.h"檔以及"RenderMemory.c"檔中分別加入基本的定義與include(以後新增的檔案都大同小異)

/* File: RenderMemory.h */

#ifndef __RENDERMEMORY_H__  // 怕別的標頭檔的定義互撞而加註,習慣是寫標頭檔都會加。
#define __RENDERMEMORY_H__  // 命名潛規則:兩次底線+全大寫檔名+一次底線+大寫H+兩次底線



#endif // __RENDERMEMORY_H__
/* File: RenderMemory.c */

#include "RenderMemory.h"  // 注意是用引號「""」括住,非內建標頭的角括號「<>」
  1. 定義螢幕高與寬的常數,以及render memory本身、初始化用的函數
/* File: RenderMemory.h */

#ifndef __RENDERMEMORY_H__  // 怕別的標頭檔的定義互撞而加註,習慣是寫標頭檔都會加。
#define __RENDERMEMORY_H__  // 命名潛規則:兩次底線+全大寫檔名+一次底線+大寫H+兩次底線

// ------------新增部分-------------------

#define WIDTH_USER_SET 30  // 在這邊設置真正想要的高寬
#define HEIGHT_USER_SET 30
#define SCREEN_WIDTH (WIDTH_USER_SET + 1)  // 在文字介面中,「換行符」雖然無法被看到,
                                           // 卻占一格在那邊,所以必須將我們設定的值 + 1
#define SCREEN_HEIGHT (HEIGHT_USER_SET)

char render_memory[SCREEN_HEIGHT][SCREEN_WIDTH];  // char型態二維陣列作為繪製記憶體

void init_render_memory();  // 將render memory初始化用

// --------------------------------------

#endif // __RENDERMEMORY_H__
  1. 再來,就是實際定義init_render_memory函數,我們寫在"RenderMemory.c"檔
/* File: RenderMemory.c */

#include "RenderMemory.h"  // 注意是用引號「""」括住,非內建標頭的角括號「<>」

// ------------新增部分-------------------

void init_render_memory()
{
    int i = 0, j = 0;

    for(i=0;i<SCREEN_HEIGHT;i++)  // 雙重迴圈將memory內全部填上' ' (空白符)
    {
        for(j=0;j<SCREEN_WIDTH;j++)
        {
            if(j == SCREEN_WIDTH - 1)  // 此處就是為什麼需要將寬先加一,
            {                          // 若寬的部分在同一列的最後一格,則填換行('\n')
                render_memory[i][j] = '\n';
            }
            else                       // 反之就是空格
            {
                render_memory[i][j] = ' ';
            }
        }
    }
}
// --------------------------------------
  1. 這樣就設計好負責Render Memory的部分了,我們在main函數先加入標頭檔,並呼叫初始化函數!
/* File: main.c */

// .
// . <省略>
// .
#include <math.h>  // 數學函式庫(三角函數、四捨五入等等)

// ------------新增部分-------------------
#include "RenderMemory.h"  // 新增剛寫好的標頭檔
// --------------------------------------

int main(int argc, char *argv[])
{
// ------------新增部分-------------------
    init_render_memory();  // 先初始化memory
// --------------------------------------
    return 0;
}
  1. 然後就可以執行看看有無出錯了~ 當然什麼都還沒有,只要確認沒有出錯就沒問題了。
    https://ithelp.ithome.com.tw/upload/images/20190925/20111429doBzSnq37I.png

  2. 這樣我們就有了可以儲存螢幕繪製資訊的Render Memory了。


上一篇
[11屆鐵人賽Day10] 旋轉矩陣—C語言實作
下一篇
[11屆鐵人賽Day12] 3D引擎製作(二)
系列文
若沒有遊戲引擎、合作夥伴...做得出遊戲嗎? 不試試看不知道吧? [使用C語言]30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言