c++游戏编程(1)开发环境与工具函数

c++游戏编程(1)开发环境与工具函数


前言

这是我的第一篇博客😁

最近偷懒写了几个c++的游戏,想总结总结经验,就准备写几篇博客。


1.开发工具

开发语言自然是c++,c++的IDE有很多种,比如VScode、dev-c++等,这里给大家推荐一个ide——小熊猫dev-c++
这里不是做广告,实在是这个ide太好用了。
首先,他自动补全功能非常好用,写代码像飞了似的,
而且还有代码高亮,自动排版(有一个按钮一按,整个代码都重新排版)。
最重要的是,里面还自带了ege、海龟作图、raylib、freeglut、GLFW和GLEW等适合编程或者游戏开发入门者使用的库和项目模板,无需复杂的安装配置即可直接使用。
下载地址
官网地址
在这里插入图片描述

2.工具函数

2.1 windows.h

Windows.h它是一个综合性头文件,它里面包含了许多关于windows系统的头文件(里面有很多windowsAPI函数)。

注意:Linux系统下不能用这个头文件

2.1.1 _mkdir()

_mkdir()是一个用于创建目录的函数。在io.h 中,不过可以直接include<windows.h>

函数原型:

int _mkdir( const char *dirname ); 
//创建一个目录,目录名为dirname

具体用法:

#include<io.h>
using namespace std;
int main(){
	_mkdir("新建文件夹");
	return 0;
}

2.1.2 _rmdir()

_rmdir()是一个删除目录的函数。也在io.h 中。

函数原型:

int _rmdir( const char *dirname ); 
//删除一个目录,目录名为dirname

具体用法:

#include<io.h>
using namespace std;
int main(){
	_rmdir("新建文件夹");
	return 0;
}

其实上述两个函数都是可以用systerm()函数来使用,只不过用windows.h比较酷

2.1.3 mouse_event()

这个函数用来模拟鼠标事件,例如当你需要自动填表的时候,这个函数可以帮你自动按鼠标键(其实用python更容易

函数原型:

VOID mouse_event(
DWORD dwFlags,
DWORD dx,
DWORD dwFlags, 
OWORD dx, 
DWORD dy,
DWORD dwData, 
DWORD dwExtralnfo
);
//具体参数请见引用3的文章

2.1.4 keybd_event()

显而易见,这是用来模拟键盘事件的,你可以用它模拟ctrl+v,这样就能实现复制粘贴了……突然意识到这好懒

函数原型:

VOID keybd_event(
BYTE bVk,//一个虚据拟键码
BYTE bScan,//该键的硬件扫描码(填0就行)
DWORD dwFlags,//按下为0,弹起为2
DWORD dwExtralnfo//可以不指定,如果指定,就将被释放
);

2.1.5 SetCursorPos()

设置鼠标的位置,这个通常用于制造病毒,让鼠标四处乱动

函数原型:

BOOL SetCursorPos(int X,int Y);

函数实例:

#include<bits/stdc++.h> 
#include<windows.h>
int main()
{
	srand(time(0));
	int x,y;
	while(true)
	{
		x=rand()%1000+300; //x坐标的范围
		y=rand()%600+300;  //y坐标的范围
		SetCursorPos(x,y); //x,y可以换成两个固定的值 即可改成鼠标锁定 
	}
	return 0;
}

你以为我会告诉你,这个程序是干什么的吗?

2.1.6 MessageBox

这个函数是用来弹出窗口的,学过vb语言的应该会很熟悉。

函数原型:

#define MessageBox __AW_SUFFIXED__(MessageBox)
WINUSERAPI int WINAPI MessageBoxA (HWND, LPCSTR, LPCSTR, UINT);
WINUSERAPI int WINAPI MessageBoxW (HWND, LPCWSTR, LPCWSTR, UINT);

比较直观的函数原型:

MessageBox(//不用担心什么A或W,直接写MessageBox()就行了
HWND,//一般填NULL
LPCSTR, //窗口的文字
LPCSTR,//窗口标题的文字
UINT//窗口的类型
);

具体实例:

#include<windows.h>
using namespace std;
int main(){
	MessageBox(NULL,TEXT("一段文字"),TEXT("这是标题"),MB_YESNO);
	return 0;
}

效果:
在这里插入图片描述

2.1.7 Sleep()

Sleep()函数,在我看来是windows.h这个头文件里最有用的函数,功能是可以暂停一段时间。

函数原型:

void Sleep (DWORD);

注意,这个DWORD并不是以秒为单位的,而是以毫秒为单位的。譬如:Sleep(1000)是暂停1秒。
函数实例:

#include<bits/stdc++.h>
#include<windows.h>
using namespace std;
int main(){
	for(int i=1;i<=10;i++){
		cout<<"暂停"<<i<<"秒!\n";
		Sleep(i*1000);
	}
	return 0;
}

2.1.8 SetConsoleTextAttribute()

也是一个改变字体颜色的函数,但是与后文的 textbackground()不同,这个函数再各种IED上都可以使用。

函数原型:

WINAPI BOOL SetConsoleTextAttribute (HANDLE, WORD);
WINBASEAPI HANDLE WINAPI GetStdHandle (DWORD);

具体实例:

SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_BLUE|FOREGROUND_GREEN);
//设置为天蓝色字体
cout<<"天蓝色字体\n";

2.1.9 SetConsoleCursorPosition()

字面意思,即移动命令行中光标的位置。这里要注意的是,每次调用这个函数都是默认从左上角开始偏移,而与当前光标停留的位置无关。

函数原型:

SetConsoleCursorPosition(
 _In_ HANDLE hConsoleOutput,
 _In_ COORD dwCursorPosition
);

我们可以自己写一个函数,用于改变光标位置。

#include <bits/stdc++.h>
#include <windows.h>

void gotoxy(int x, int y) {
	HANDLE hOut;
	hOut = GetStdHandle(STD_OUTPUT_HANDLE);//获取标注输出句柄
	COORD pos;
	pos.X = x;pos.Y = y;
	SetConsoleCursorPosition(hOut, pos);//偏移光标位置
}

然后再写主函数

int main(){
    gotoxy(5, 0);
    printf("(5,0)光标位置");
    gotoxy(3, 10);
    printf("(3,10)光标位置");
}

效果
在这里插入图片描述

2.2 conio.h

这个头文件很强大,尤其是getch()这个函数,几乎是游戏必备的。

2.2.1 getch()

getch()函数,用于获取键入的字符,操作简单,几乎所有游戏都得用到这个函数。

函数原型:

char getch(void);

这个函数会返回一个char类型的值,具体实例:

#include<conio.h>
#include<bits/stdc++.h>
using namespace std;
int main(){
	char c=getch();
	cout<<c;
	return 0;
}

操作非常简单,建议使用的时候可以用一个switch语句。

2.2.1 TC上的三个函数

以上三个函数只能再Turbo C上使用,其它ide的可以跳过

2.2.1.1 clrscr()

清屏函数,其实等于systerm("CLS")

函数实例:

#include<conio.h>
#include<bits/stdc++.h>
using namespace std;
int main(){
	for(int i=1;i<=100;i++) cout<<"hhh\n"; 
	system("pause")
	sclrscr();
}

效果(清屏前)
在这里插入图片描述
清屏后:
在这里插入图片描述

2.2.1.2 gotoxy()

gotoxy(int x, int y)是 Borland C 扩充函数库 conio.h 中声明的一个函数,功能是将光标移动到指定位置。在 Visual C++ 或 GCC 中可以自定义这个函数。(参照前文

函数原型:

void gotoxy(int x, int y)
2.2.1.3 textbackground()

函数textbackground()设置字符屏幕下文本背景颜色(或字符背景颜色)。

函数原型:

void textbackground(int bcolor);

函数实例(见这里

2.3 几个非常非常有用的函数

以下这几个函数,没有什么特殊的头文件(都在include<bits/stdc++.h里)

2.3.1 system()

相信很多人都知道这个函数,不知道也没关系。
systerm就是调取cmd(命令提示符)的指令。
cmd相信大家都用过。
如果你没有用过,那就win+r再输入cmd,打开后输入help,然后你就会了

在这里,我们只需要用到如下几个命令

2.3.1.1 cls

清屏,这个不用我多说了。

system("cls");
2.3.1.2 color

改变颜色(整个界面)
如果你再cmd里输入help color,他就会给你输出一堆介绍。(如图)
在这里插入图片描述
把它放到system里,就可以了。
例如color fc
在c++里就是:

#include <bits/stdc++.h>
using namespace std;
int main(){
	system("color fc");//注意函数内是char数组类型的
	cout<<"color fc的界面\n";
	return 0; 
}

效果:
在这里插入图片描述

2.3.1.3 pause

使用system("pause"),它会出来一个这样的东西:
在这里插入图片描述

2.3.1.4 title

用法:

system("title 一个标题)

效果:
在这里插入图片描述

2.3.1.5 设置大小
system("mode con cols=60 lines=40");//设置窗口大小120x40

效果:
在这里插入图片描述

2.3.2 fstream下的函数

fstream.h是一个文件操作的头文件,不过它包含在bits/stdc++.h中,里面主要有两个类:ifstream输入流和ofstream输出流(其实平时文件输入输出一般用freopen(),但是容易出错)。

2.3.2.1 文件输入流

首先,我们先定义一个输入流in

ifstream in;

如果要打开一个文件,那就使用:

in.open("a.txt");

或者也可以在定义时直接打开文件:

ifstream in("a.txt");

现在我们要输入一个数:

#include<bits/stdc++.h>
using namespace std;
int main(){
	ifstream in;//输入流 
	in.open("a.txt");//打开一个a.txt的文件
	int num;//一个数字
	in>>num;//从文件中读入这个数字
	cout<<num;//输出这个数字 
	in.close();//关闭这个文件流(好习惯) 
	return 0; 
}

如果a.txt中的数字是1,那么我们输出的就是1。
另外还有几个常用的函数

2.3.2.1.1 good()

用法:

ifstream in("a.txt");
if(in.good()) cout<<"打开成功!\n";
else cout<<"打开错误!\n";

这个函数用于返回文件是否打开成功(一般来说,打开失败的原因是文件名输错了)。

2.3.1.1.2 eof()

用法

int a[1010];
ifstream in("a.txt")int i=0;
while(!in.eof()) {
	i++;
	in>>a[i];
}
in.close();

也就是说,in.eof()返回文件是否到底。

2.3.1.1.3 getline()

getline()函数相信大家都不陌生,在文件流里的getline()也差不多,也就是读取一整行,函数原型:

istream& getline (char* s, streamsize n);

其中,第一个参数是一个char[]型的字符数组,第二个参数是最多能读入多少。
实例:

#include<bits/stdc++.h>
using namespace std;
int main(){
	ifstream in;//输入流 
	in.open("a.txt");//打开一个a.txt的文件
	char c[1010];
	in.getline(c,1010);//读取一整行 
	cout<<c;
	return 0; 
}

假如文件内是:

这 是 一整行 代码 要读入的 。
第二行  应该 不会 输入
的
吧
!!!

那么输出的就会是:

这 是 一整行 代码 要读入的 。

getline()只会读入一行,而且在这个实例中,最多只会读入1010个字符(一个汉字相当于两个字符
还有一种用法:

istream& getline (char* s, streamsize n, char delim);

这里面的delim是一个字符,读到这个字符就会截止。
例如:

char c[1010];
in.getline (c,1010,'@');
cout<<c;

假如a.txt内是:

这 是 一个 段落 @ 后面似乎不会 读入 吧 。

程序就会输出:

这 是 一个 段落
2.3.2.2 文件输出流

ofstreamifstream其实没什么区别
定义一个输出流out

ofstream out;

如果要打开一个文件,那就使用:

out.open("a.txt");

或者:

ofstream out("a.txt");

如果没有找到这个文件,那么系统就会自己创建这个文件
输入一个数:

ofstream out("a.txt");
out<<12345<<endl;
out.close()
2.3.2.2.1 clear()

clear()函数顾名思义就是清空整个文件。
例如:

ofstream out("a.txt");
out.clear();

2.3.3 clock()

clock()就是返回时间。
那么返回什么时间呢?

返回从“开启这个程序进程”到“程序中调用clock()函数”时之间的CPU时钟计时单元(clock tick)数,在MSDN中称之为挂钟时间(wal-clock)

通俗来讲,就是从运行这个程序后过的时间。
实验:

#include<bits/stdc++.h>
#include<windows.h>
using namespace std;
int main(){
	cout<<clock();
	return 0; 
}

我试了三次,第一次是3,第二次是8,第三次则是4,可能和我的CPU占用率有关……
不过这不要紧,至少我们知道了,它它的返回值大概相当于毫秒。
而这个返回值类型是clock_t
所以我们就可以写一个程序,如下:

clock_t begin=clock();
Sleep(1000);
cout<<(clock()-begin)/1000;

结果自然是1
当然,返回值只是近似为毫秒,所以我们最好这么写:

clock_t begin=clock();
Sleep(1000);
cout<<(clock()-begin)/CLOCKS_PER_SEC;

结果还是1,不过更加……精准了。


总结

这就是今天的内容(说实话有点少,以后再补上一些)
写这篇博客花了很长时间,也查阅了很多资料,感谢那些文章的作者🙇‍

有几点需要补充:

1.不知道为什么,安装360木马查杀后,只要一有systerm或者ifstream的程序就会被当成病毒查杀,大家点一下恢复和信任就可以了.
2. cmd有个特点,就是对大小写不敏感。
也就是说,如果我写成CLScls效果是一样的。

引用文章

  1. 小熊猫devc++官网
  2. windows.h头文件
  3. C/C++ Windows.h 鼠标键盘操作
  4. C++ 坑人小程序(全集)
  5. C语言中clrscr()是什么意思?
  6. 关于textbackground的问题
  7. 百度百科gotoxy
  8. C++控制台指定颜色输出打印
  9. 【全网唯一 纯C++动画游戏编程指南】
  10. C++中SetConsoleCursorPosition()移动光标函数的用法大全
  11. windows命令行cmd窗口大小和缓冲区大小修改方法
  12. c++ 输入文件流ifstream用法详解
  13. c++中的clock()函数
  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【为什么还需要学习C++?】 你是否接触很多语言,但从来没有了解过编程语言的本质?你是否想成为一名资深开发人员,想开发别人做不了的高性能程序?你是否经常想要窥探大型企业级开发工程的思路,但苦于没有基础只能望洋兴叹? 那么C++就是你个人能力提升,职业之路进阶的不二之选。【课程特色】 1.课程共19大章节,239课时内容,涵盖数据结构、函数、类、指针、标准库全部知识体系。2.带你从知识与思想的层面从0构建C++知识框架,分析大型项目实践思路,为你打下坚实的基础。3.李宁老师结合4大国外顶级C++著作的精华为大家推出的《征服C++11》课程。【学完后我将达到什么水平?】 1.对C++的各个知识能够熟练配置、开发、部署;2.吊打一切关于C++的笔试面试题;3.面向物联网的“嵌入式”和面向大型化的“分布式”开发,掌握职业钥匙,把握行业先机。【面向人群】 1.希望一站式快速入门的C++初学者; 2.希望快速学习 C++、掌握编程要义、修炼内功的开发者; 3.有志于挑战更高级的开发项目,成为资深开发的工程师。 【课程设计】 本课程包含3大模块基础篇本篇主要讲解c++的基础概念,包含数据类型、运算符等基本语法,数组、指针、字符串等基本词法,循环、函数、类等基本句法等。进阶篇本篇主要讲解编程中常用的一些技能,包含类的高级技术、类的继承、编译链接和命名空间等。提升篇:本篇可以帮助学员更加高效的进行c++开发,其中包含类型转换、文件操作、异常处理、代码重用等内容。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值