#define WIDTH_USER_SET 60 // 在這邊設置真正想要的高寬
引言
昨天我們完成了繪製記憶體的設計,今天則是來處理跟視窗有關的部分,我們叫「系統設定」。
首先來設計清空cmd輸出的函式,為什麼要清空呢?
因為3D引擎的任何動畫、動作,都是由一幀一幀的靜止畫面快速翻過而成的,
原理就如同翻書動畫,因此我們需要一個清空輸出的函式,再馬上填入新的畫面,
如此反覆進行,看起來就如同畫面在動了。
除了清空輸出外,我們也一併設計黑視窗的數值樣式,諸如長寬、標題等等。
System Setting
/* File: SystemSetting.h */
#ifndef __SYSTEMSETTING_H__
#define __SYSTEMSETTING_H__
#endif // __SYSTEMSETTING_H__
/* File: SystemSetting.c */
#include<stdio.h>
#include<windows.h>
#include"RenderMemory.h" // 需要用到繪製記憶體檔案中的變數,需含括進來
#include"SystemSetting.h"
/* File: SystemSetting.h */
#ifndef __SYSTEMSETTING_H__
#define __SYSTEMSETTING_H__
// ------------新增部分-------------------
HANDLE handler; // 控制視窗的變數,視為視窗的控制把手
COORD xyPoint; // Windows用的x, y座標型態
CONSOLE_CURSOR_INFO cursorInfo; // 有關光標的資訊構成的結構
void selfCls(); // 自行撰寫的清空螢幕
void setting_system(); // 對於cmd視窗的各種設定
// ---------------------------------------
#endif // __SYSTEMSETTING_H__
/* File: SystemSetting.c */
// 以下寫在include之下
void selfCls() // 此清空螢幕原理是直接將光標帶到最左上角,再直接複寫更新畫面
{
**System Setting**
handler = GetStdHandle(STD_OUTPUT_HANDLE); // 取得標準輸出的handle
xyPoint.X = 0; // 希望x, y座標都能到0的位置
xyPoint.Y = 0;
SetConsoleCursorPosition(handler, xyPoint); // 將座標設置到該位置
cursorInfo.bVisible = FALSE; // 光標設為不可見
cursorInfo.dwSize = 1; // 光標大小用不到,先設為1
SetConsoleCursorInfo(handler, &cursorInfo); // 設置光標資訊
}
/* File: SystemSetting.c */
// 以下寫在selfCls函數之下
void setting_system()
{
char system_command[50] = "";
char cols_str[8] = "";
sprintf(cols_str, "%d", SCREEN_WIDTH);
char lines_str[8] = "";
sprintf(lines_str, "%d", SCREEN_HEIGHT + 16); // 多出來的16列可以顯示座標資訊、角度資訊等等
strcat(system_command, "mode con:cols=");
strcat(system_command, cols_str); //
strcat(system_command, " lines="); // 將指令們拼接成文字,再送出給system
strcat(system_command, lines_str); //
system(system_command); // 由system將指令送給作業系統
system("@echo off"); // 關閉回顯
system("TITLE 3D Game"); // 設置標題
SetWindowPos(GetConsoleWindow(),HWND_TOPMOST,500,100,0,0,SWP_NOSIZE); // 設定視窗位置
}
/* File: main.c */
#include <stdio.h> // 標準輸入輸出
#include <stdlib.h> // 標準函式庫
#include <windows.h> // 控制視窗用
#include <math.h> // 數學函式庫(三角函數、四捨五入等等)
#include "RenderMemory.h" // 繪製記憶體
// ------------新增部分-------------------
#include "SystemSetting.h" // 系統設定
// --------------------------------------
int main(int argc, char *argv[])
{
init_render_memory(); // 先初始化memory
// ------------新增部分-------------------
setting_system(); // 設置視窗屬性
// --------------------------------------
return 0;
}
可以看到跟平常不同的客製化視窗,此例中寬度(Width)為60(+1),高度(Height)為30+16。
大家可以注意到一點,cmd視窗的高度一單位長是寬度一單位長的兩倍,這是因為一個文字設定上就是
高:寬 = 2 : 1