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()函数

c++游戏编程(1)开发环境与工具函数的更多相关文章

  1. PHP开发环境搭建工具有哪些?

    对于php开发小白来说搭建一个php运行环境就是一道坎! 因为要做php开发,搭建一个能够运行php网站的服务器环境是第一步,传统的php环境软件非常复杂,好在很多公司开发了一键搭建php安装环境,一 ...

  2. Java开发环境及工具安装配置

    Java开发环境及工具安装配置 Windows JDK 下载地址 https://www.oracle.com/java/technologies/javase-downloads.html 安装配置 ...

  3. 3D游戏编程大师技巧──环境搭建

    刚开微博,想借助这个平台与大家交流,写下自己的学习记录,希望得到大家的批评指正. 好了,进入主题.这段时间对游戏编程很感兴趣,于是在网友的推荐下开始学习<3D游戏编程大师技巧>这本书.今天 ...

  4. C#开发COM组件供其他开发环境或工具调用介绍(转)

    由于工作原因涉及到这一块的开发,由于之前并未接触过,所以本篇文章也是在参考了各种资料后,自己实现并通过通过测试之后所整理的备忘录以及一些个人观点. 希望对刚接触这类型开发的朋友有所帮助,若有不足之处还 ...

  5. android开发环境与工具使用相关备忘录

    一.名称简介 1.ADT(Android Development Tools) 可以简单理解为在eclipse下开发安卓的插件或工具包. 查看当前ADT版本方法:help-> about ecl ...

  6. Forward团队-爬虫豆瓣top250项目-团队编程项目开发环境搭建过程

    本次结对编程和团队项目我都需要用python环境,所以环境的搭建是一样的.(本文部分内容引用自己博客:http://www.cnblogs.com/xingyunqi/p/7527411.html) ...

  7. 【HDFS API编程】开发环境搭建

    使用HDFS API的方式来操作HDFS文件系统 IDEA Java 使用Maven来管理项目 先打开IDEA,New Project 创建GAV然后next 默认使用的有idea内置的Maven,可 ...

  8. linux python 图形编程 qt开发环境搭建

    我的系统是 ubuntu14.04 我们使用的是python2.7,建议安装qt4+pyqt4+eric4 eric是pyqt的界面设计器的代码生成软件. 1.安装sip 这个是python和qt之间 ...

  9. 前端开发 —— js 常用工具函数(utilities)

    1. 时间 function getCurTime() { var date = new Date(); return date.toLocaleTimeString(); } date.toLoca ...

  10. 开始JAVA编程的敲门砖——JAVA开发环境搭建

    从头开始的java编程--JAVA开发环境搭建 一.什么是java的开发环境? 顾名思义java的开发环境是提供并保证整个java程序开发运行的必要的环境,搭建java开发环境是开始java编程的敲门 ...

随机推荐

  1. node.js 历史版本下载

    https://nodejs.org/zh-cn/download/releases/

  2. GPS地图生成03之数据获取

      1. 引言¶   六只脚是国内著名的户外网站,拥有大量的户外GPS轨迹路线,网址为:http://www.foooooot.com/   2. 数据分析¶   2.1 获取所有轨迹¶   搜索关键 ...

  3. oracle快速将表缓存到内存

    共有2种方法: 1) alter table fisher cache; 2) alter table fisher storage(buffer_pool keep); --取消缓存 1) alte ...

  4. python的常见问题解决

    1.python库下载安装慢:用清华镜像 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple --trusted-host pypi.tun ...

  5. 如何将PDF文件中的部分信息隐藏或遮盖呢?

      由于工作需要,总是需要对PDF文件中的内容进行部分隐藏.之前,作为VIP,可以使用某软件对PDF中的信息进行部分遮盖,现在,VIP到期了,我也不想继续花钱了(哭穷,嘻嘻)   在信息时代,只要会百 ...

  6. 关于el-popover的箭头颜色

    因为会从四个方向不定弹出 所以需要写入4个方向: 注意弹出框是动态插入body中的,需写入根部样式中 如果有多个地方用到且颜色都不一样,可以用类名区分,elm提供了 然后把前面的 .el-popper ...

  7. ubuntu安装cuda、cudnn和nvidia-docker

    目录 安装前的工作 要安装的cuda和cudnn版本说明 安装cuda 检查cuda的安装情况 安装cudnn 安装nvidia-docker 在红米book14上的实践 本文参考自Ubuntu18. ...

  8. vue项目跳转外部链接,替换链接地址参数信息

    //修改url某个指定的参数 url 地址. paramName 参数.   repalceValue替换的新值 replaceUrl( url, paramName, repalceValue){ ...

  9. java NIO原理和代码实践

    一,先说java IO 1,线程阻塞:当线程调用write()或read()时,线程会被阻塞,直到有一些数据可用于读取或数据被完全写入. 2,面向流: 我们需要从流中读取一个或多个字节.它使用流来在数 ...

  10. supervisor+gunicorn+uvicorn部署fastapi项目

    一.编写一个项目 本项目是在虚拟环境下的: 先启动虚拟环境:source .venv/bin/activate.(创建虚拟环境自己去找) 项目用于演示,所以非常简单, 在虚拟环境中安装需要的第三方库: ...