这是一篇自制头文件的教程
目录
一、自制头文件
- 其实自制头文件就和打代码一样,写下你自己的函数或者引用另外的头文件
- 当然,不要在头文件里写 函数!
- 创建头文件很简单,使用 *.h 的文件名即可(如game.h)
编写
| #ifndef SDGS |
| #define SDGS 1 |
| |
| |
| |
| #endif |
- 注意,这里的 "SDGS" 是任意你随意取的名字,越古怪越好,至于为什么注释有讲解,也可以看这篇文章来学习一下宏定义:C/C++宏的基本使用方法附例子讲解)
- 头文件其实就是把代码的一部分移植到另一个文件中去而已,但是这样做可以节省你写大量重复代码的时间
(就像没人会自己打一遍 math.h 里的内容)
使用
一般方法
- 自制的头文件要与编译的文件放在一个目录里,就像这样
| ├─我的游戏 |
| │ ├─game.h |
| │ ├─main.cpp |
| │ ├─main.exe |
- main.cpp文件中用一下这行代码引用 game.h 头文件
不走寻常路
- 把头文件放在你 DEV-C++ 的头文件库里就好,至于目录可以在“工具-编译选项-目录-c++包含文件”中找到
- main.cpp文件中用一下这行代码引用 game.h 头文件
二、我的游戏专用头文件
| #ifndef games |
| #define games 1 |
| #include <bits/stdc++.h> |
| #include <windows.h> |
| #include <stdio.h> |
| #include <conio.h> |
| #include <time.h> |
| #include <thread> |
| #define KEY_DOWN(a) ((GetAsyncKeyState(a) & 0x8000) ? 1 : 0) |
| #define KEY_TIME(a) (keyuped[a]) |
| #define KEY_HOLD(a) (keydownt[a]) |
| #define KEY_NAME(a) (keyname[a]) |
| using namespace std; |
| atomic_int keyuped[260], keydownt[260]; |
| |
| char keyname[260][20] = {"", "鼠标左键", "鼠标右键", "[Ctrl]+[Break]", |
| "鼠标中键", "X1 鼠标按钮", "X2 鼠标按钮", "", "[Backspace]", "[Tab]", "", "", |
| "[Clear]", "[Enter]", "", "", "[Shift]", "[Ctrl]", "[Alt]", "[Pause]", |
| "[CapsLock]", "", "", "", "", "", "", "[Esc]", "", "", "", "", "[Space]", |
| "[PageUp]", "[PageDown]", "[End]", "[Home]", "[Left]", "[Up]", "[Right]", |
| "[Down]", "[Select]", "[Print]", "[Execute]", "[PrintScreen]", "[Insert]", |
| "[Delete]", "[Help]", "[0]", "[1]", "[2]", "[3]", "[4]", "[5]", "[6]", "[7]", |
| "[8]", "[9]", "", "", "", "", "", "", "", "[A]", "[B]", "[C]", "[D]", "[E]", |
| "[F]", "[G]", "[H]", "[I]", "[J]", "[K]", "[L]", "[M]", "[N]", "[O]", "[p]", |
| "[Q]", "[R]", "[S]", "[T]", "[U]", "[V]", "[W]", "[X]", "[Y]", "[Z]", "左[Win]", |
| "右[Win]", "[App]", "", "[Sleep]", "小键盘[0]", "小键盘[1]", "小键盘[2]", |
| "小键盘[3]", "小键盘[4]", "小键盘[5]", "小键盘[6]", "小键盘[7]", "小键盘[8]", |
| "小键盘[9]", "[×]", "[+]", "[分隔符]", "[-]", "[Dec]", "[/]", "[F1]", "[F2]", |
| "[F3]", "[F4]", "[F5]", "[F6]", "[F7]", "[F8]", "[F9]", "[F10]", "[F11]", |
| "[F12]", "[F13]", "[F14]", "[F15]", "[F16]", "[F17]", "[F18]", "[F19]", "[F20]", |
| "[F21]", "[F22]", "[F23]", "[F24]", "", "", "", "", "", "", "", "", "[NumLock]", |
| "[ScrollLock]", "", "", "", "", "", "", "", "", "", "", "", "", "", "", |
| "左[Shift]", "右[Shift]", "左[Ctrl]", "右[Ctrl]", "左[Alt]", "右[Alt]", "", "", "", "", |
| "", "", "", "静音", "音量减小", "音量增加", "下一首", "上一首", "停止", "播放/暂停", |
| "启动邮件", "选择媒体", "启动应用程序_1", "启动应用程序_2", "", "", "[;]", |
| "[+]", "[,]", "[-]", "[.]", "[/]", "[~]", "", "", "", "", "", "", "", "", "", |
| "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "[{]", "[\\]", |
| "[}]", "[']", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", |
| "", "", "", "", "", "", "[Attn]", "[CrSel]", "[ExSel]", "[ErEOF]", "播放键", |
| "缩放键", "", "[PA1]", "清除键"}; |
| |
| |
| |
| |
| |
| |
| |
| void KD_check() { |
| memset(keyuped, -1, sizeof keyuped); |
| int clrrr = clock(); |
| while (1) { |
| if (clock() - clrrr > 5) { |
| for (int i = 1; i <= 254; i++) { |
| if (KEY_DOWN(i) && keyuped[i] == -1) { |
| keyuped[i] = clock(); |
| } else if (KEY_DOWN(i)) { |
| keydownt[i] = clock() - keyuped[i]; |
| } else if (~keyuped[i]) { |
| keyuped[i] = -1; |
| } |
| } |
| clrrr = clock(); |
| } |
| } |
| return ; |
| } |
| |
| void slp(int mt) { |
| int clnum = clock(); |
| while (1) { |
| if (clock() - clnum >= mt) { |
| break; |
| } |
| } |
| return ; |
| } |
| |
| void play_once(char f[]) { |
| char file1[100] = "pause ", file2[100] = "seek ", file3[100] = "play "; |
| strcat(file1, f); |
| strcat(file2, f); |
| strcat(file3, f); |
| strcat(file2, " to start"); |
| mciSendString(file1, NULL, 0, NULL); |
| mciSendString(file2, NULL, 0, NULL); |
| mciSendString(file3, NULL, 0, NULL); |
| return ; |
| } |
| |
| void set_volume(char filename[], int vol) { |
| char vo[20], file1[100] = "setaudio "; |
| strcat(file1, filename); |
| strcat(file1, " volume to "); |
| itoa(vol, vo, 10); |
| strcat(file1, vo); |
| mciSendString(file1, NULL, 0, NULL); |
| return ; |
| } |
| |
| void cancelclose() { |
| HWND hwnd = GetConsoleWindow(); |
| HMENU hmenu = GetSystemMenu(hwnd, false); |
| RemoveMenu(hmenu, SC_CLOSE, MF_BYCOMMAND); |
| LONG style = GetWindowLong(hwnd, GWL_STYLE); |
| style &= ~(WS_MINIMIZEBOX); |
| SetWindowLong(hwnd, GWL_STYLE, style); |
| SetWindowPos(hwnd, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); |
| ShowWindow(hwnd, SW_SHOWNORMAL); |
| DestroyMenu(hmenu); |
| ReleaseDC(hwnd, NULL); |
| return ; |
| } |
| |
| bool Is_File_Exist(const string &file_path) { |
| if (FILE *file = fopen(file_path.c_str(), "r")) { |
| fclose(file); |
| return 1; |
| } |
| return 0; |
| } |
| |
| void gto(int x, int y) { |
| COORD pos; |
| pos.X = y; |
| pos.Y = x; |
| SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos); |
| return ; |
| } |
| |
| void print(string s, int mt) { |
| int l = s.size(), clnum = clock(); |
| for (int i = 0; i < l; i++) { |
| while (1) { |
| if (clock() - clnum >= mt) { |
| putchar(s[i]); |
| clnum = clock(); |
| break; |
| } |
| } |
| } |
| return ; |
| } |
| |
| POINT Windowpos() { |
| POINT pt; |
| GetCursorPos(&pt); |
| HWND h = GetForegroundWindow(); |
| ScreenToClient(h, &pt); |
| pt.x >>= 3; |
| pt.y >>= 3; |
| return pt; |
| } |
| |
| void color(int a) { |
| SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), a); |
| } |
| |
| float Sin(int a) { |
| return sin(3.1416 * a / 180); |
| } |
| |
| float Cos(int a) { |
| return cos(3.1416 * a / 180); |
| } |
| #endif |
- 其实就是把胎神大大常用的工具函数都复制进来了而已
(什么垃圾)
- 当然,也有我自己的一些优化工具(这才对嘛!)
- 好啦,这篇文章也就到这里了,谢谢大家的观看!码字不易,留个赞呗~
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!