<教程> 我的游戏专用头文件 —— game.h
HappyJaPhy · · 休闲·娱乐
这是一篇自制头文件的教程
目录
一、自制头文件
- 其实自制头文件就和打代码一样,写下你自己的函数或者引用另外的头文件
- 当然,不要在头文件里写
main 函数! - 创建头文件很简单,使用 *.h 的文件名即可(如game.h)
编写
- 头文件一般要包括下面的代码
#ifndef SDGS //判断是否#define SDGS过以防止多次引用 #define SDGS 1 //define SDGS来让上一条代码在多次访问时有用 /* 这里是你要写的内容 */ #endif //结束#ifndef的语句范围 - 注意,这里的 "SDGS" 是任意你随意取的名字,越古怪越好,至于为什么注释有讲解,也可以看这篇文章来学习一下宏定义:C/C++宏的基本使用方法附例子讲解)
- 头文件其实就是把代码的一部分移植到另一个文件中去而已,但是这样做可以节省你写大量重复代码的时间
(就像没人会自己打一遍 math.h 里的内容)使用
一般方法
- 自制的头文件要与编译的文件放在一个目录里,就像这样
\downarrow ├─我的游戏 │ ├─game.h │ ├─main.cpp │ ├─main.exe - main.cpp文件中用一下这行代码引用 game.h 头文件
#include "game.h"不走寻常路
- 把头文件放在你 DEV-C++ 的头文件库里就好,至于目录可以在“工具-编译选项-目录-c++包含文件”中找到
- main.cpp文件中用一下这行代码引用 game.h 头文件
#include <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]) //按键按下时的clock()值 #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]", "清除键"}; /* KD_check()是后台监视按键的函数 要在程序的开头使用下面的代码来使用它 thread test(KD_check); test.detach(); 注意,KEY_TIME和KEY_HOLD这两个函数必须配合KD_check才能正常使用 */ 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); } //角度制的sin float Sin(int a) { return sin(3.1416 * a / 180); } //角度制的cos float Cos(int a) { return cos(3.1416 * a / 180); } #endif- 其实就是把胎神大大常用的工具函数都复制进来了而已
(什么垃圾) - 当然,也有我自己的一些优化工具(这才对嘛!)
- 好啦,这篇文章也就到这里了,谢谢大家的观看!码字不易,留个赞呗~