2.Direct2D 捕鱼游戏开发-渲染类content.h的封装

环境:

编辑器:VS2015

系统:win10 专业版

碰撞:aabb obb盒模型(obb采用分离轴进行判断)

渲染:direct2d

帧的概念

帧:在一个动画里面我们把每个画面叫做帧

动画:一个连续不间断的帧就是一个动画(这里可以理解到后面封装动画精灵的时候会用到)

帧的间隔:两个帧之间的间隔就表示一个帧的间隔 我们游戏里面的帧的间隔为1000/60ms即我们游戏所用到的帧为一秒60帧

为什么取这个值:

因为人眼看到的最大帧就是60帧再大也是和这个帧一样

Direct2D说明:

开发公司:微软

主要功能:通过调用gpu实现的非常快的图形渲染相对于gdi与gdi+来说d2d的渲染是非常快的

封装用到的Direct2D对象:

渲染工厂类:

ID2D1Factory * m_fac;

提供:

创建渲染目标类方法(可以是窗口为渲染目标,位图为渲染目标) CreateHwndRenderTarget

创建边框样式类方法 (让绘制的路径是虚线还是实线) CreateStrokeStyle

创建路径绘制类方法(绘制圆形,矩形,椭圆,不规则形状) CreatePathGeometry,CreateEllipseGeometry

渲染目标类

ID2D1HwndRenderTarget * m_render

提供各种绘制方法的一个类

绘制不规则路径的方法 (DrawGeometry)

填充不规则路径的方法(FillGeometry)

开始绘制 (BeginDraw)

结束绘制 (EndDraw)

填充矩形(FillRectangle)

设置变换 (SetTransform)

创建位图 (CreateBitmapFromWicBitmap)

绘制位图 (DrawBitmap)

创建位图画刷 (CreateBitmapBrush)

绘制文字 (DrawText)

画刷画线的类(我们这里定义pen的作用为画线的)

ID2D1SolidColorBrush * pen

一切画线的方法都会用到这个画刷

在封装中用到的方法:

content::drawText 绘制文本

content::stroke 将我们的beginPath和closePath的路径绘制为不规则图形

content::strokeStyle 设置绘制的颜色

content::drawArc 绘制没有背景颜色的圆形

content::drawLine 绘制一根线条

 

画刷画背景的类(我们这里定义brush的作用为画线的)

ID2D1SolidColorBrush * brush

在封装中用到的方法:

content::fill() 将我们的beginPath和closePath的路径填充为有背景颜色的不规则图形

content::fillStyle() 设置填充的颜色

content::fillRect() 填充矩形

content::fillArc() 填充圆形

画刷画背景图的类(我们这里定义bitmapBrush的作用为画背景图的)

ID2D1BitmapBrush * bitmapBrush

在封装中用到的方法:

content::fillImage 填充背景 这里主要是绘制重复的背景用的

 

图像类(WIC类)

IWICImagingFactory * m_imgFac;

提供读取图像的方法(这里只是将图片读取了还不是能用的位图) CreateDecoderFromFilename

我们需要对读取的内容进行转码具体看下面代码

content.cpp

2.Direct2D 捕鱼游戏开发-渲染类content.h的封装_第1张图片

文字工厂类:

IDWriteFactory * m_writeFac;

提供创建文字绘制对象的方法 CreateTextFormat

文字样式类:

IDWriteTextFormat * m_forMat

这个类主要用于绘制文字的字体和大小

在我们的封装里面主要用于

content::drawText

封装思路:

我们这里就不详细介绍direct2d的各种api了因为api(提供程序调用的方法)估计得有好几千个

我们这里就说一下这个捕鱼游戏需要的渲染工具(即这个程序用到的direct2D对象)

1.图片绘制方法 content::drawImage

思路:这里我们重写了多种参数但是最主要的目的还是要让图片通过一个路径直接绘制出来

我们的getSource方法会将传入的参数进行缓存起来 当下一次调用的时候就不需要再去调用com组件来处理图片了

核心方法: content.cpp

2.Direct2D 捕鱼游戏开发-渲染类content.h的封装_第2张图片

2.重复图形绘制方法 content::fillImage

思路:这里我们在填充矩形的时候通过调用位图画刷进行绘制这样就会填充多个图片了

核心方法:content.cpp

setExtendmodeX是设置x轴的填充重复模式

setExtendmodeY是设置y轴的填充重复模式

2.Direct2D 捕鱼游戏开发-渲染类content.h的封装_第3张图片

3.获取图片资源方法 content::getSoucre 

思路:这里我们通过两个数组 一个位图vector另一个string vector进行缓存

我们先检索string里面是否有重复的 如果有我们就直接返回缓存的位图资源 如果没有我们就加载并且将加载好的存在数组里面

核心方法:

content.cpp

2.Direct2D 捕鱼游戏开发-渲染类content.h的封装_第4张图片

4.绘制文字的方法 content::drawText //

思路:我们通过非常简单的传入文字和坐标就绘制文字

核心代码:content.cpp

5.获取文字宽度与高度的方法 content::getTextInfo

思路:通过传入的字符串将当前绘制环境的字符串绘制宽度与高度缓存到第二个参数里面

核心代码:content.cpp

2.Direct2D 捕鱼游戏开发-渲染类content.h的封装_第5张图片

6.变换相关的方法

        content::rotate(int angle,int x =0,int y = 0); //提供旋转变换的方法
        content::scale(int zoom, int x = 0, int y = 0);//提供缩放变换的方法
        content::skew(int angleX, int angleY, int x = 0, int y = 0);//提供扭曲(倾斜)变换的方法
        content::trisition(int x, int y);//提供位移变换的方法
        content::save();//将上一次变换的变换矩阵保存到内存中
        content::restore();//将上一次变换的变换矩阵重新放出来渲染

思路:这里我们要储存两个矩阵变量

    D2D1_MATRIX_3X2_F m1;
    D2D1_MATRIX_3X2_F bufM1;

我们在调用save方法的时候我们就将bufM1的值设置为m1

然后我们在调用restore的时候我们将缓存的矩阵变量释放出来 这样我们在save和resore之间就可以进行任意的变换从而不用担心在绘制之后不能绘制其他的图形

核心代码:content.cpp

2.Direct2D 捕鱼游戏开发-渲染类content.h的封装_第6张图片

7.开始一帧的绘制 content::beginDraw

思路:beginDraw开始一帧的绘制

8.结束一帧的绘制 content::closeDraw

思路:closeDraw结束一帧的绘制

closeDraw和beginDraw在消息循环的时候进过测试貌似是已经有一个时间间隔了间隔为1000/60ms即60帧

因为我手动在peekmessage里面加了sleep就出现了画面闪烁的问题

这里就不详细说其他在这个游戏里面没有用到的方法了

drawImage:

可以看到在源码里面我们重写了非常多的参数情况

content.h

2.Direct2D 捕鱼游戏开发-渲染类content.h的封装_第7张图片

因为这个方法非常常用所以我们会重写这么多

 

 

这是我们要做的目标:

项目开源地址:

https://github.com/yinhui1129754/fishing

游戏开发交流群:

859055710

你可能感兴趣的:(游戏流程开发,Direct2D,C,游戏开发,游戏案列,游戏设计,windows2D游戏开发)