<教程> 我的游戏专用头文件 —— game.h

这是一篇自制头文件的教程

目录

一、自制头文件

  • 其实自制头文件就和打代码一样,写下你自己的函数或者引用另外的头文件
  • 当然,不要在头文件里写 \(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
  • 其实就是把胎神大大常用的工具函数都复制进来了而已 (什么垃圾)
  • 当然,也有我自己的一些优化工具(这才对嘛!)
  • 好啦,这篇文章也就到这里了,谢谢大家的观看!码字不易,留个赞呗~
posted @ 2024-02-27 19:41  wswwhcs  阅读(58)  评论(0编辑  收藏  举报