坦克动荡游戏开发知识点学习笔记
目录
1.定时器
2.GetTickCount() 函数
3.窗口风格
4.使用GDI+环境准备
(1)绘图库的引入
(2)绘图库初始化
5.HDC句柄
6.CRect类
7.CDC类
8.CBitmap类
9.Image类
10.抽象类、虚函数、纯虚函数
11.static_cast<float>
12.拷贝构造函数
13.重载赋值运算operator
14.sin()和cos()函数
15.<vector>动态数组-容器
16.tuple(元组)
17._stprintf_s和_stscanf_s
18.auto
19.GetAsyncKeyState(vk)键盘消息
20.碰撞检测
21.自动寻路算法
22.Cstring类
23.Rect和RectF类
1. 定时器
概念:定时器消息是一种系统消息,实现功能有更新数据、 定时控制功能、定时刷新等
组成:
(1)OnTimer(UINT_PTR nIDEvent)
(2)定时器ID-用来区分不同的定时器,ID是一个整型值,不规范的写法用1、2、3等数字作为ID,为了直观看清楚数字代表的意义,通常使用C++枚举enum来代替ID值
例:
enum ETimerId
{
ETimerIdGameLoop = 1
}//ETimerIdGameLoop为定时器的ID
(3)启动SetTimer()
SetTimer(ETimerIdGameLoop, 0, NULL);
(4)关闭KillTimer()
2.GetTickCount() 函数
该函数从0开始计时,返回自设备启动后的毫秒数
3.窗口风格(Window style)
CMainFrame::CMainFrame()
{
#define MY_STYLE (WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | \
WS_MINIMIZEBOX | FWS_ADDTOTITLE)
}
WS_CAPTION 必须和WS_BORDER风格配合,但不能与WS_DLGFRAME风格一起使用。指示窗口包含标题要部分。
WS_MINIMIZEBOX 创建一个具有最小化按钮的窗口。
WS_OVERLAPPED 创建一个重叠窗口。重叠窗口通常具有标题条和边界。
WS_SYSMENU 创建一个在标题条上具有控制菜单的窗口。仅对带标题条的窗口使用。
4.GDI+环境准备
4.1 绘图库的引入
(1)引入GDIplus库的头文件
(2)链接GDIplus库
(3)使用GDIplus命名空间
#include <gdiplus.h>
#pragma comment(lib, "Gdiplus.lib")//链接Gdiplus库
using namespace Gdiplus; // 使用Gdiplus命名空间
4.2 绘图库初始化
// 引入 GDIPlus 所需要的变量
ULONG_PTR m_tokenGdiplus;
Gdiplus::GdiplusStartupInput input;
Gdiplus::GdiplusStartupOutput output;
GdiplusStartup(&m_tokenGdiplus, &input, &output);//调用GDI+
5.HDC句柄
HDC是指窗体、控件的句柄,是长整类型,这是windows编程里很重要的一个类型,它唯一标识了一个对象 比如窗口,按钮,视图等,也就是一个代号
另外它和C++没有什么直接的关系,HDC是windows系统API中定义的一个数据类型
6.CRect类
CRect rc(a,b,c,d); a,b代表的是矩形区域的左上角的x和y坐标,c,d代表的是矩形区域的右下角的x和y坐标,每一个窗口对象都有一个GetClientRect函数,用来返回当前窗口的区域。
CRect rc; // 客户区的大小
GetClientRect(m_hWnd, &rc);
7.CDC类
MFC基础类库定义了设备环境对象类----CDC类,CDC类是一个较大的类,包括许多成员函数,如映射函数,绘画工具函数,区域函数等,通过CDC对象的成员函数可以完成所有的绘画工作(在使用CClientDC进行绘图时,一般要调用GetClientRect()函数来获取客户区域的大小),例如用GDI画矩形要Rectangle(hDC,…),而使用CDC则是dc.Rectangle(…),由此可见CDC主要是把原本需要HDC作为参数的GDI函数封装了一下,HDC成了它的一个成员变量。
子类:CClientDC:(客户区设备上下文)用于客户区的输出,与特定窗口关联,可以让开发者访问目标窗口中客户区,其 构造函数中包含了GetDC,析构函数中包含了ReleaseDC
8.CBitmap类
void CGame :: GameRunDraw()
{
CDC* dc = CClientDC::FromHandle(hdc);
CDC m_dcMemory; //定义一个内存dc对象 双缓冲绘图用
CBitmap bmp;
bmp.CreateCompatibleBitmap(dc, rc.Width(), rc.Height());//用一个位图初始化对象使之与指定设备兼容
m_dcMemory.CreateCompatibleDC(dc);//建立一个与窗口DC兼容的内存DC
CBitmap* pOldBitmap = m_dcMemory.SelectObject(&bmp);//将这个图放到内存DC中去
::BitBlt(hdc, 0, 0, rc.Width(), rc.Height(), // 拷贝到屏幕
m_dcMemory.GetSafeHdc(), 0, 0, SRCCOPY);
}
技术:双缓冲绘图技术概述 原理:将一般的在CDC中绘图改成在一内存设备中绘图(CDC型变量,一般命名为pMemDC),然后使用BitBlt()函数将pMemDC中的图像复制到CDC中;
步骤: ①创建内存设备CDC *pMemDC;关联设备CreateCompatibleDC();
②创建兼容位图 HBITMAP ::CreateCompatibleBitmap();
③选入设备内存设备(HBITMAP)::SelectObject(m_hDC,hBitmap);
④内存设备绘图
⑤复制到CDC,使用函数 BitBlt()
9.Image类
FromFile()函数作用:加载图片
①获取游戏窗口大小
②载入要绘制的图片
③画出图片DrawImage()->显示图片到窗口
// 获得 游戏窗口大小
CRect rc;
GetClientRect(m_hWnd, rc);
// 载入要绘制的图片
Gdiplus::Image* img = Image::FromFile(_T("menu_background.png"));
//画出图片
gh.DrawImage(img, rc.left, rc.top, rc.Width(), rc.Height());
在GDI+中,对图像的处理主要靠两个类,Image类和Bitmap类,Bitmap类是在Image类的基础上派生出来的。这里主要讲Image类的使用,Image类支持对BMP, GIF, JPEG, PNG, TIFF, 和 EMF,
10.抽象类、虚函数、纯虚函数
①抽象类
②虚函数
③纯虚函数:纯虚函数是在基类中声明的虚函数,它在基类中没有定义,但要求任何派生类都要定义自己的实现方法。在基类中实现纯虚函数的方法是在函数原型后加“=0”
virtual void funtion1()=0
虚函数和纯虚函数的区别_Hackbuteer1的专栏-CSDN博客_纯虚函数
11.static_cast<float>
用法:static_cast < type-id > ( expression ) 该运算符把expression转换为type-id类型
12.拷贝构造函数
13.重载赋值运算operator
14.sin()和 cos()函数
在C/C++ sin 的参数与我们平常数学三角函数理解的不一样,在C语言中 sin 的参数是 弧度,而不是角度. 所有我们计算一个角度的sin 值时,应先转成弧度值.,弧度 = 角度 * 3.1415926 / 180.0
#define PI (3.1415926f)
// 获得当前的角度(单位是 PI)
virtual float GetDirectionTurnArc() const
{
return PI * m_directionTurn / 180.0f;
}
15.<vector>动态数组-容器
- vector是向量类型,可以容纳许多类型的数据,因此也被称为容器
- (可以理解为动态数组,是封装好了的类)
- 进行
vector
操作前应添加头文件#include <vector>
16.tuple(元组)
把tuple(元组)当做一个通用的结构体来用,不需要创建结构体又获取结构体的特征,在某些情况下可以取代结构体使程序更简洁,直观。将多个不同类型的元素组成一个整体。
tuple和vector比较:
vector只能容纳同一种类型的数据,tuple可以容纳任意类型的数据;
#include <tuple>//元组(相当于结构体)
#include <vector>//动态数组
vector<tuple<Image*, RectF>> vImgInfoPtr;
17._stprintf_s和_stscanf_s
_stprintf_s和_stscanf_s是为适应不同编码而定义的两个宏
https://blog.csdn.net/zh516846937/article/details/6719008
18.auto
auto的原理就是根据后面的值,来自己推测前面的类型是什么。
c++ auto基本用法_lwgkzl的博客-CSDN博客_auto c++
19.GetAsyncKeyState(vk)键盘消息
确定用户当前是否按下了键盘上的一个键 SHORT GetAsyncKeyState(int vKey);
GetAsyncKeyState(vk) & 0x8000
//&在这里是按位与,0x8000是16进制数,用2进制表示为1000 0000 0000 0000, &是按位与,同样,如果键被按下,返回值最高位为1,则1xxx xxxx xxxx xxxx & 1000 0000 0000 0000得到的结果为1,否则为0,同样可以判断最高位的值。
按键判断之GetKeyState 和 GetAsyncKeyState 区别_xuqiang918的专栏-CSDN博客_getkeystate
20.碰撞检测
21.自动寻路算法
a*自动寻路算法详解_jialeheyeshu的博客-CSDN博客
22.Cstring类
Cstring是用来处理字符串的,既可以处理Unicode标准的字符串,也可以处理ANSI标准的字符串
Format()函数作用:为字符串的转换提供方便,如int、float等类型转换为字符类型
23.RectF类
作用:绘制矩形