首页 > 其他分享 ><教程> 我的游戏专用头文件 —— game.h

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

时间:2024-02-27 19:44:48浏览次数:22  
标签:include return int 小键盘 game 专用 头文件 NULL

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

目录

一、自制头文件

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

标签:include,return,int,小键盘,game,专用,头文件,NULL
From: https://www.cnblogs.com/iloveoi/p/18037697

相关文章

  • HGAME 2024 WEEK3 crypto
    CRYPTOexRSA题目描述:RRRSAfromCrypto.Util.numberimport*fromsecretimportflagm=bytes_to_long(flag)p=getStrongPrime(1024)q=getStrongPrime(1024)phi=(p-1)*(q-1)e1=inverse(getPrime(768),phi)e2=inverse(getPrime(768),phi)e3=inverse(getPrime(768),phi)......
  • [ARC155D] Avoid Coprime Game 题解
    Description非负整数\(x,y\)的最大公约数记为\(\gcd(x,y)\),规定\(\gcd(x,0)=\gcd(0,x)=x\)。黑板上写了\(N\)个整数\(A_1,A_2,...,A_N\),这\(N\)个数的最大公约数是\(1\)。Takahashi和Aoki在玩游戏,有一个变量\(G\)初值为\(0\),他们轮流进行以下操作:从黑板上选择......
  • [ARC155D] Avoid Coprime Game
    考虑a的范围其实很小,只有2e5,也就代表着G最大只有2e5,不难发现对于G的质因数分解,一个质因子的幂次对G没有影响,而G最多只有6个本质不同质因子,也就是G最多只有\(2^6\)种考虑建出博弈论转移的DAG,首先对于G不变的操作(也就是选的数拥有G的所有类型的质因子),只有两种本质不同的状态:1.先......
  • MDS500-16-ASEMI工业电机专用MDST150-16
    编辑:llMDS500-16-ASEMI工业电机专用MDST150-16型号:MDS500-16品牌:ASEMI正向电流(Id):500A反向耐压(VRRM):1600V正向浪涌电流:600A正向电压(VF):1.38V引脚数量:5芯片个数:6芯片尺寸:MIL功率(Pd):大功率设备封装:M34工作温度:-40°C~125°C类型:整流模块、整流桥MDS500-16描述:ASEMI品......
  • games101_Homework1
    作业描述:本次作业的任务是填写一个旋转矩阵和一个透视投影矩阵。给定三维下三个点v0(2.0,0.0,−2.0),v1(0.0,2.0,−2.0),v2(−2.0,0.0,−2.0),你需要将这三个点的坐标变换为屏幕坐标,并在屏幕上绘制出对应的线框三角形(在代码框架中,我们已经提供了draw_triangl......
  • 最强非公来了!七彩虹iGame RTX 4070 Ti SUPER Vulcan OC评测:性能比公版强3%
    一、前言:来自七彩虹的顶级非公RTX4070TiSUPERNVIDIA发布了三款RTX40SUPER显卡,可以说RTX4070TiSUPER的性价比是最高的,它拥有完整的256Bit显存位宽和16GB大容量显存,性能全面强于RTX3090Ti同时起售价还维持6499元不变。与其他两款RTX40SUPER显卡不同,RTX4070TiSUPER......
  • games101_Homework0
    作业描述:给定一个点P=(2,1),将该点绕原点先逆时针旋转45◦,再平移(1,2),计算出变换后点的坐标(要求用齐次坐标进行计算)。作业解答:#include<cmath>#include<eigen3/Eigen/Core>#include<eigen3/Eigen/Dense>#include<iostream>intmain(){//definepoin......
  • USACO 2024 February Contest, Bronze Problem 1. Palindrome Game
    1.猜结论2.证明如果\(s<=9\)则\(Bessie\)必赢。如果\(s=10\)则\(Elsie\)必赢。如果\(10<s<=19\)则\(Bessie\)可以减去\(s-10\),使自己必赢。如果\(s=20\)则\(Bessie\)无论如何减去一个回文数都会离\(10\)差一个个位数,\(Elsie\)减去这个个位......
  • FUN GAME 一款普通的C++游戏
    凑合看吧,不是完整版。#include<bits/stdc++.h>#include<windows.h>#include<conio.h>usingnamespacestd;#defineptputs#definepfprintf#definepcputchar#definesfscanf#definegtgets#defineslSleepcharname[101];stack<int>gun;bo......
  • Pygame 播放背景音乐卡顿
    Pygame是常用的游戏开发库之一。然而在使用Pygame的过程中,却出现了播放背景音乐卡顿的问题。表现为咯咯咯的噪音。检查Pygame版本,为2.5.2。降级至1.9.6,此时代码报错:Traceback(mostrecentcalllast):File"D:\MyWork\Code_Learning\PythonLearning\Pygame\test2.py",line......