iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 12
1

勘誤:Day11中,「繪製記憶體」的第三點,其中

#define WIDTH_USER_SET 60  // 在這邊設置真正想要的高寬

原30應改為60較恰當,否則視窗會太小,很抱歉造成困擾!


引言

昨天我們完成了繪製記憶體的設計,今天則是來處理跟視窗有關的部分,我們叫「系統設定」。
首先來設計清空cmd輸出的函式,為什麼要清空呢?

因為3D引擎的任何動畫、動作,都是由一幀一幀的靜止畫面快速翻過而成的,
原理就如同翻書動畫,因此我們需要一個清空輸出的函式,再馬上填入新的畫面,
如此反覆進行,看起來就如同畫面在動了。

除了清空輸出外,我們也一併設計黑視窗的數值樣式,諸如長寬、標題等等。


System Setting

  1. 首先先創立:"SystemSetting.h"以及"SystemSetting.c"在專案中
  2. 先打上基礎定義與include:
/* 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"

  1. 宣告一些Windows型態的變數來存放東西
/* 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__
  1. 因為利用"cls"指令會造成遊戲很卡,我們必須寫個自己的清空指令
/* 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);  // 設置光標資訊
}
  1. 設置螢幕長寬、標題、位置
/* 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);  // 設定視窗位置
}
  1. 於main中呼叫setting_system、include新的標頭檔
/* 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;
}
  1. 完成SystemSetting檔案,進行測試
    https://ithelp.ithome.com.tw/upload/images/20190926/20111429vGv1k1kIjG.png

可以看到跟平常不同的客製化視窗,此例中寬度(Width)為60(+1),高度(Height)為30+16。
大家可以注意到一點,cmd視窗的高度一單位長寬度一單位長兩倍,這是因為一個文字設定上就是

高:寬 = 2 : 1

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

尚未有邦友留言

立即登入留言