4.Direct2D 捕鱼游戏开发-精灵对象sprite.h的封装

环境:

编辑器:VS2015

系统:win10 专业版

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

渲染:direct2d

精灵的概念:

精灵:一种可以操作的对象该对象拥有 视图,坐标,变换。

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

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

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

为什么取这个值:

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

封装思路:

根据概念我们把sprite对象通过displatObject继承过来这样sprite就有一个坐标和变换了但是目前的精灵还没有视图(img)那么我们就要扩展一个属性img将精灵的视图信息储存起来

主要重写方法render

下面对源码进行详细说明:

由于精灵的类型分为非常多,又因为我们的代码并不是非编译性语言所以我们这里的精灵就新增了一个属性

spriteType这个属性就将当前精灵的类型进行了区别

(这里也是为什么很多游戏在写好引擎的时候还要再封装一个脚本语言来编写的原因 因为脚本语言不需要编译 且在脚本语言里面可以加入hashtable等类来方便操作);

普通精灵(default):

精灵的属性:spriteType为default

封装思路:

在render方法里面普通精灵的渲染是这样做的:

按照流程我们先将目前的变换矩阵给保存起来app->content->save()然后我们再在后面用app->content->restore()来将变换重置具体可以查看https://blog.csdn.net/baidu_38766085/article/details/83513339渲染引擎类的封装

sprite.cpp

在这个代码里面我们可以看到当精灵的属性spriteType为default的时候我们做的就是普通的绘制图片的操作

然后在后面的部分我们就将当前精灵的子精灵进行一个递归绘制;

动画精灵(animateSprite):

精灵的属性:spriteType为animateSprite

封装思路:

一个动画就是一个连续的帧那么我们就需要一个帧数组frameArr,当前动画处于那一帧nowFrame,动画每一帧的时间间隔speedTime,动画当前帧播放的当前时间speedNowTime,动画的循环播放次数loop,动画循环播放结束的回调函数amtEnd

属性代码:sprite.h

下面对封装代码进行说明:

源码文件:sprite.cpp

渲染流程(render)说明

这里的思路是我们先判断精灵的类型是不是animateSprite类型如果是那么我们就要进行判断了

这里我们先判断我们动画的当前帧的显示时间是不是能够进行下一帧的展示

这里我们就将当前帧的时间(this->speedNowTime)加上渲染循环的时间间隔(app->msTime)并判断这个时间是不是大于了一帧的显示时间如果是那么我们就要对我们的当前显示帧(this->nowFrame)进行操作并将speedNowTime修改为0方便下一帧的判断

在这里我们进行的主要操作是如果下一帧已经到了最终帧了那么我们就将loop属性进行减一当loop减小到0的时候我们就调用回调函数的amtEnd方法并把当前的精灵对象传过去

 

这里操作完成过后我们就把精灵的显示矩形位置修改为帧数组中的一个矩形变量结构

这里是矩形变量结构我们的帧数组也是储存的矩形变量结构

填充精灵说明(fillSprite):

精灵的属性:spriteType为fillSprite

封装思路:

在填充精灵的渲染中我们调用的是渲染引擎的fillImage方法这个方法就是将图片做为背景渲染具体可以查看

https://blog.csdn.net/baidu_38766085/article/details/83513339渲染引擎类的封装

sprite.cpp

渲染流程(render)说明:

这种类型的精灵并没有什么特殊的属性

文字精灵说明(textSprite):

精灵的属性:spriteType为textSprite

封装思路:

一个文字精灵的封装应该拥有储存文字的属性txt,描述文字颜色的属性rgb和描述颜色透明度的属性alpha获取当前绘制文字高度的方法getTxtHeight获取当前文字宽度的方法getTxtWidth

属性代码:

sprite.h

源码说明:

渲染流程(render)说明

这里我们先将文字的颜色给设置好然后我们再绘制文字可以

获取绘制文字的宽度(getTxtWidth)与高度(getTxtHeight)的方法说明

我们是直接调用渲染引擎类的方法先将文字的高度和宽度获取到变量size中然后再return到外面具体的可以查看https://blog.csdn.net/baidu_38766085/article/details/83513339渲染引擎类的封装

这是我们要做的目标:

项目开源地址:

https://github.com/yinhui1129754/fishing

游戏开发交流群:

859055710

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值