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 文件输出流
ofstream
和ifstream
其实没什么区别
定义一个输出流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有个特点,就是对大小写不敏感。
也就是说,如果我写成CLS
和cls
效果是一样的。
引用文章
- 小熊猫devc++官网
- windows.h头文件
- C/C++ Windows.h 鼠标键盘操作
- C++ 坑人小程序(全集)
- C语言中clrscr()是什么意思?
- 关于textbackground的问题
- 百度百科gotoxy
- C++控制台指定颜色输出打印
- 【全网唯一 纯C++动画游戏编程指南】
- C++中SetConsoleCursorPosition()移动光标函数的用法大全
- windows命令行cmd窗口大小和缓冲区大小修改方法
- c++ 输入文件流ifstream用法详解
- c++中的clock()函数
c++游戏编程(1)开发环境与工具函数的更多相关文章
- PHP开发环境搭建工具有哪些?
对于php开发小白来说搭建一个php运行环境就是一道坎! 因为要做php开发,搭建一个能够运行php网站的服务器环境是第一步,传统的php环境软件非常复杂,好在很多公司开发了一键搭建php安装环境,一 ...
- Java开发环境及工具安装配置
Java开发环境及工具安装配置 Windows JDK 下载地址 https://www.oracle.com/java/technologies/javase-downloads.html 安装配置 ...
- 3D游戏编程大师技巧──环境搭建
刚开微博,想借助这个平台与大家交流,写下自己的学习记录,希望得到大家的批评指正. 好了,进入主题.这段时间对游戏编程很感兴趣,于是在网友的推荐下开始学习<3D游戏编程大师技巧>这本书.今天 ...
- C#开发COM组件供其他开发环境或工具调用介绍(转)
由于工作原因涉及到这一块的开发,由于之前并未接触过,所以本篇文章也是在参考了各种资料后,自己实现并通过通过测试之后所整理的备忘录以及一些个人观点. 希望对刚接触这类型开发的朋友有所帮助,若有不足之处还 ...
- android开发环境与工具使用相关备忘录
一.名称简介 1.ADT(Android Development Tools) 可以简单理解为在eclipse下开发安卓的插件或工具包. 查看当前ADT版本方法:help-> about ecl ...
- Forward团队-爬虫豆瓣top250项目-团队编程项目开发环境搭建过程
本次结对编程和团队项目我都需要用python环境,所以环境的搭建是一样的.(本文部分内容引用自己博客:http://www.cnblogs.com/xingyunqi/p/7527411.html) ...
- 【HDFS API编程】开发环境搭建
使用HDFS API的方式来操作HDFS文件系统 IDEA Java 使用Maven来管理项目 先打开IDEA,New Project 创建GAV然后next 默认使用的有idea内置的Maven,可 ...
- linux python 图形编程 qt开发环境搭建
我的系统是 ubuntu14.04 我们使用的是python2.7,建议安装qt4+pyqt4+eric4 eric是pyqt的界面设计器的代码生成软件. 1.安装sip 这个是python和qt之间 ...
- 前端开发 —— js 常用工具函数(utilities)
1. 时间 function getCurTime() { var date = new Date(); return date.toLocaleTimeString(); } date.toLoca ...
- 开始JAVA编程的敲门砖——JAVA开发环境搭建
从头开始的java编程--JAVA开发环境搭建 一.什么是java的开发环境? 顾名思义java的开发环境是提供并保证整个java程序开发运行的必要的环境,搭建java开发环境是开始java编程的敲门 ...
随机推荐
- node.js 历史版本下载
https://nodejs.org/zh-cn/download/releases/
- GPS地图生成03之数据获取
1. 引言¶ 六只脚是国内著名的户外网站,拥有大量的户外GPS轨迹路线,网址为:http://www.foooooot.com/ 2. 数据分析¶ 2.1 获取所有轨迹¶ 搜索关键 ...
- oracle快速将表缓存到内存
共有2种方法: 1) alter table fisher cache; 2) alter table fisher storage(buffer_pool keep); --取消缓存 1) alte ...
- python的常见问题解决
1.python库下载安装慢:用清华镜像 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple --trusted-host pypi.tun ...
- 如何将PDF文件中的部分信息隐藏或遮盖呢?
由于工作需要,总是需要对PDF文件中的内容进行部分隐藏.之前,作为VIP,可以使用某软件对PDF中的信息进行部分遮盖,现在,VIP到期了,我也不想继续花钱了(哭穷,嘻嘻) 在信息时代,只要会百 ...
- 关于el-popover的箭头颜色
因为会从四个方向不定弹出 所以需要写入4个方向: 注意弹出框是动态插入body中的,需写入根部样式中 如果有多个地方用到且颜色都不一样,可以用类名区分,elm提供了 然后把前面的 .el-popper ...
- ubuntu安装cuda、cudnn和nvidia-docker
目录 安装前的工作 要安装的cuda和cudnn版本说明 安装cuda 检查cuda的安装情况 安装cudnn 安装nvidia-docker 在红米book14上的实践 本文参考自Ubuntu18. ...
- vue项目跳转外部链接,替换链接地址参数信息
//修改url某个指定的参数 url 地址. paramName 参数. repalceValue替换的新值 replaceUrl( url, paramName, repalceValue){ ...
- java NIO原理和代码实践
一,先说java IO 1,线程阻塞:当线程调用write()或read()时,线程会被阻塞,直到有一些数据可用于读取或数据被完全写入. 2,面向流: 我们需要从流中读取一个或多个字节.它使用流来在数 ...
- supervisor+gunicorn+uvicorn部署fastapi项目
一.编写一个项目 本项目是在虚拟环境下的: 先启动虚拟环境:source .venv/bin/activate.(创建虚拟环境自己去找) 项目用于演示,所以非常简单, 在虚拟环境中安装需要的第三方库: ...