坦克动荡游戏开发知识点学习笔记

本文档详细介绍了坦克游戏开发过程中的关键技术和知识点,包括定时器的使用、绘图环境搭建、GDI+绘图库应用、设备上下文管理、位图处理及双缓冲绘图技术等,并探讨了抽象类、虚函数、纯虚函数的概念及其在游戏开发中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

坦克动荡游戏开发知识点学习笔记

目录

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类

作用:绘制矩形

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值