这是一篇自制头文件的教程
目录
一、自制头文件
- 其实自制头文件就和打代码一样,写下你自己的函数或者引用另外的头文件
- 当然,不要在头文件里写 \(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
- 其实就是把胎神大大常用的工具函数都复制进来了而已
(什么垃圾) - 当然,也有我自己的一些优化工具(这才对嘛!)
- 好啦,这篇文章也就到这里了,谢谢大家的观看!码字不易,留个赞呗~