引言
經過了前面幾天的洗禮,我們就大致具備了製作一個簡易3D引擎所需的知識啦!
接下來我們將從0開始設計一個簡易3D引擎。
備註:以下程式碼最上方的
/* File: Xxxxx.h */
僅為註解,寫給讀者們方便辨識要把程式寫在哪個檔案用的,可不加。
準備
/* 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型態的二維陣列來設計!
首先我們先建立一個"RenderMemory.h"檔以及"RenderMemory.c"檔
在"RenderMemory.h"檔以及"RenderMemory.c"檔中分別加入基本的定義與include(以後新增的檔案都大同小異)
/* File: RenderMemory.h */
#ifndef __RENDERMEMORY_H__ // 怕別的標頭檔的定義互撞而加註,習慣是寫標頭檔都會加。
#define __RENDERMEMORY_H__ // 命名潛規則:兩次底線+全大寫檔名+一次底線+大寫H+兩次底線
#endif // __RENDERMEMORY_H__
/* File: RenderMemory.c */
#include "RenderMemory.h" // 注意是用引號「""」括住,非內建標頭的角括號「<>」
/* 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__
/* 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] = ' ';
}
}
}
}
// --------------------------------------
/* File: main.c */
// .
// . <省略>
// .
#include <math.h> // 數學函式庫(三角函數、四捨五入等等)
// ------------新增部分-------------------
#include "RenderMemory.h" // 新增剛寫好的標頭檔
// --------------------------------------
int main(int argc, char *argv[])
{
// ------------新增部分-------------------
init_render_memory(); // 先初始化memory
// --------------------------------------
return 0;
}
然後就可以執行看看有無出錯了~ 當然什麼都還沒有,只要確認沒有出錯就沒問題了。
這樣我們就有了可以儲存螢幕繪製資訊的Render Memory了。