Re: [問題] 遊戲程式
看板C_and_CPP (C/C++)作者azureblaze (AzureBlaze)時間14年前 (2011/12/11 23:40)推噓1(1推 0噓 7→)留言8則, 5人參與討論串4/5 (看更多)
※ 引述《winston1215 (Winston)》之銘言:
考慮到難度我覺得用Console來做是最可行的
出來的效果大概是這樣
http://codepad.org/L5te3jaH
這是我以前拿來交作業的貪吃蛇(好孩子不要抄),
不過機械系的計程亂寫一通也不會有人管,所以寫
得連我現在也看不懂,看看就好了不建議去研究他
console的進階操作沒有標準所以會關係到你要在什
麼平台上跑。以下假設你要在windows上寫:
首先幾乎所有windows API(就是windows放出來給你
用的函數)都放在windows.h裡,所以:
#include <windows.h>
接著要對console進行操作
可是windows下同時可以開這麼多程式,一個程式也
可以開好幾個console出來,他怎麼知道你要操作哪
一個?這時候就要用GetStdHandle()
定義:
http://ppt.cc/wdi0
HANDLE WINAPI GetStdHandle(
__in DWORD nStdHandle
);
GetStdHandle()會傳回你目前程式預設console的HANDLE
傳回的型態HANDLE說穿了就是一個類似pointer的東
西,對console的操作都要透過這個HANDLE去辨別被
操作的東西。
WINAPI是什麼可以不用管他
MSDN中所有函數的參數都會標上 __in或是__out等來
表示他是輸入還是輸出用的,只是方便使用者閱讀實
際上沒有意義
DWORD這個資料型態實際上只是個unsigned int
nStdHandle的內容可以看一下說明,我們要的是輸出
到螢幕上,所以使用STD_OUTPUT_HANDLE
DWORD handle = GetStdHandle(STD_OUTPUT_HANDLE);
一般的console只能輸出到游標的位置,而且游標還不
能任意移動。要做遊戲就幾乎需要能夠輸出到螢幕上任
意位置了。這時候要用的是WriteConsoleOutputCharacter()
定義:
http://ppt.cc/q0db
BOOL WINAPI WriteConsoleOutputCharacter(
__in HANDLE hConsoleOutput,
__in LPCTSTR lpCharacter,
__in DWORD nLength,
__in COORD dwWriteCoord,
__out LPDWORD lpNumberOfCharsWritten
);
第一個hConsoleOutput就是我們剛剛從GetStdHandle()
那邊拿到的HANDLE,他才知道這些字是要寫到哪個console。
LPCTSTR就是Windows惡名昭彰的匈牙利命名法了,他的意思是
"Long Pointer to Constant TCHAR String"
L P C T STR
TCHAR是用來應付ascii和unicode差別用的Char Type
在一般ascii的環境下就只是個普通的char
所以LPCTSTR實際的意思就是const char*而已
這邊放的是你要寫進去的字串
nLength是你要寫進去字串的長度
COORD是WINAPI用的struct:
typedef struct _COORD {
SHORT X;
SHORT Y;
} COORD, *PCOORD;
也就是把xy座標包在一起
在dwWriteCoord這邊的意思是輸入字串開始的xy座標(左上角算起)
LPDWORD
"Long Pointer to DWORD"
L P DWORD
其實就是DWORD*,或是unsigned int*
lpNumberOfCharsWritten是用來傳回實際上寫入了幾個字元(寫到
這個指標指向的位址裡)
通常好像沒什麼用?
XP可以直接放個NULL給他,不過在Windows7下會當給你看所以要找
個東西接著。
COORD p1;
p1.X = 35;
p1.Y = 12;
char *str = "hello world!";
DWORD dummy;
WriteConsoleOutputCharacter(
handle,
str,
strlen(str),
p1,
&dummy
);
這樣會把"hello world"寫到螢幕大概中央的地方
順帶一題,console的預設大小是80*25(可以改)
如果想要花俏一點的話(黑白文字寶石方塊想到就覺得可怕)
可以用WriteConsoleOutputAttribute()替文字上色
定義:
http://ppt.cc/VYYm
BOOL WINAPI WriteConsoleOutputAttribute(
__in HANDLE hConsoleOutput,
__in const WORD *lpAttribute,
__in DWORD nLength,
__in COORD dwWriteCoord,
__out LPDWORD lpNumberOfAttrsWritten
);
除了寫入的lpAttribute以外基本上和剛剛的WriteConsoleOutputCharacter一樣
WORD這個東西和DWORD其實一樣
WriteConsoleOutputAttribute()會改變螢幕上某個位置的屬性
http://ppt.cc/EEWH
常用的屬性包括字的顏色、背景顏色
顏色的操作有RED GREEN BLUE INTENSITY四種可以組合
出來的結果有16色(就是一般BBS那些顏色)
效果要用| (bitwise OR)加在一起,像是:
WORD red = FOREGROUND_RED | FORGROUND_INTENSITY; //亮紅色字,黑背景
WORD darkCyan = FOREGROUND_GREEN | FOREGROUND_BLUE;//暗青色字,黑背景
WORD redBlue = FOREGROUND_RED | BACKGROUND_BLUE; //暗紅字,暗藍並景
可以自己組合看看
WriteConsoleOutputAttribute(
handle,
&red,
1,
p1,
&dummy
);
把剛剛hello world!的h弄成亮紅色
剩下其他功能可以參考MSDN裡旁邊那排函數
其他的:
聲音:
http://ppt.cc/Hu;~
BOOL WINAPI Beep(
__in DWORD dwFreq, //頻率
__in DWORD dwDuration //時間,千分之一秒
);
Beep(440,1000); //中央A,1秒
華麗的開頭動畫:
參考 telnet://towel.blinkenlights.nl
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 118.168.121.198
→
12/11 23:45, , 1F
12/11 23:45, 1F
→
12/12 00:50, , 2F
12/12 00:50, 2F
→
12/12 01:26, , 3F
12/12 01:26, 3F
→
12/12 01:28, , 4F
12/12 01:28, 4F
→
12/12 02:13, , 5F
12/12 02:13, 5F
→
12/12 09:17, , 6F
12/12 09:17, 6F
→
12/12 09:18, , 7F
12/12 09:18, 7F
推
12/12 12:46, , 8F
12/12 12:46, 8F
討論串 (同標題文章)
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章