基于C++实现的捕鱼游戏

1.项目简介

语言:C++编辑器:VS2015渲染:D2D碰撞:obb和aabb编译选项:请选择Release x86 编译

2.项目文件目录说明

img 放游戏所使用的图片文件夹frame 放控制游戏场景相关的文件instance 放游戏窗口进程 游戏循环 工具类 碰撞类的文件render 放游戏渲染引擎的文件夹trigger 放对一些消息进行映射的文件夹

2.开发流程介绍

文件夹介绍 目录截图:

  • frame:放子弹对象,鱼对象,文件读取对象,鱼创建控制对象,金币对象,结构场景0,结构场景1,结构场景2的文件夹
  • img:放游戏需要的图片文件夹
  • instance:放创建窗口 ,流程控制,碰撞对象,工具类的文件夹
  • render:放渲染对象和精灵对象,场景对象,继断器对象的文件夹
  • trigger:放消息映射和放场景初始化结构的文件夹
  • Resource.h资源头文件
  • stdafx.h预编译头文件引入了大部分的库文件和依赖项

2.1项目开发流畅介绍:

  • 1.先将Direct2D封装为一个方便使用的渲染类 content.h
  • 2.然后再content.h渲染类的基础上封装一个显示对象类 DisplatObject.h
  • 3.然后再封装一个精灵类 sprite.h
  • 4.封装场景类 action.h
  • 5.封装继断器类 ticker.h
  • 6.封装窗口运行对象 DemoApp.h(这里是直接复制的一部分微软代码)
  • 7.编写消息映射和流程触发结构 createBefore.h
  • 8.在精灵对象(sprite.h)的基础上封装子弹类(bullet.h)
  • 9.在精灵对象(sprite.h)的基础上封装鱼类(fish.h)
  • 10.在精灵对象(sprite.h)的基础上封装金币类(gold.h)
  • 11.在鱼类(fish.h)的基础上封装创建鱼类(fishConfig.h)
  • 12.编写场景0结构(frame0.h)
  • 13.编写场景1结构(frame1.h)
  • 14.编写场景2结构(frame2.h)
  • 15.编写碰撞检查对象(colVec.h)
  • 16.编写工具类(utils.h)

项目运行截图:

这是我们要做的目标:

3.渲染类content.h的封装

3.1帧的概念

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

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

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

为什么取这个值:

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

3.2Direct2D说明:

开发公司:微软

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

3.3封装用到的Direct2D对象:

3.3.1渲染工厂类:

ID2D1Factory * m_fac;

提供:

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

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

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

3.3.2渲染目标类

ID2D1HwndRenderTarget * m_render

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

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

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

开始绘制 (BeginDraw)

结束绘制 (EndDraw)

填充矩形(FillRectangle)

设置变换 (SetTransform)

创建位图 (CreateBitmapFromWicBitmap)

绘制位图 (DrawBitmap)

创建位图画刷 (CreateBitmapBrush)

绘制文字 (DrawText)

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

ID2D1SolidColorBrush * pen

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

在封装中用到的方法:

content::drawText 绘制文本

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

content::strokeStyle 设置绘制的颜色

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

content::drawLine 绘制一根线条

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

ID2D1SolidColorBrush * brush

在封装中用到的方法:

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

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

content::fillRect() 填充矩形

content::fillArc() 填充圆形

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

ID2D1BitmapBrush * bitmapBrush

在封装中用到的方法:

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

3.3.6图像类(WIC类)

IWICImagingFactory * m_imgFac;

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

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

content.cpp

3.3.7文字工厂类:

IDWriteFactory * m_writeFac;

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

3.3.8文字样式类:

IDWriteTextFormat * m_forMat

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

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

content::drawText

3.3.9封装思路:

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

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

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

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

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

核心方法: content.cpp

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

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

核心方法:content.cpp

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

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

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

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

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

核心方法:

content.cpp

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

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

核心代码:content.cpp

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

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

核心代码:content.cpp

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();//将上一次变换的变换矩阵重新放出来渲染

<< · Back Index ·>>

发表回复

相关推荐

有关中国古代京剧常识

(一)京剧的形成 京剧是在18世纪下半叶经徽戏、秦腔、汉调的交融,并借鉴吸收昆曲、京腔之长而形成的。 徽剧是京剧的前身。 ...

· 1分钟前

营养不上火喝冬瓜汤, 教你做九道最受欢迎的冬瓜汤, 鲜嫩可口美味

冬瓜味甘、淡、性凉,入肺、大肠、小肠、膀胱经。有润肺生津,化痰止渴,利尿消肿,清热祛暑,解毒排脓。可用于暑热口渴,下 ...

· 2分钟前

易经的智慧:龙马负图

一、河图的内容 中华文化的根源在河洛,即黄河洛水,河洛文化的标志是“河图”“洛书”。“河图”指的是黄河出现的龙马负图,“洛书 ...

· 5分钟前

到底什么是当下?

真正的当下和“时间”、“空间”无关, 它是生命的“本来面目” 到底什么是当下? 对于头脑主义者来说,当下是指“此时”、“此地” ...

· 7分钟前

六位港片里著名“打星”,角色令人过目不忘,鲜有人知道他们真名

上世纪80-90年代,是香港电影黄金时代,当时香港作为亚洲电影中心,吸引了大批武术精英。

· 8分钟前