-
2022-02-25 17:17:14
文章目录
前言
开摸!
3D动画的分类
动画在游戏中是Gameplay和玩家审美的重要因素,不可不品尝。
刚性层阶式动画
早期的动画方案,角色使用一堆独立的刚性物体组合而成,动画系统会驱动每一个刚性物体,从而实现动画效果。
刚性物体是指不会发生形变(包括缩放)的物体。使用刚性层阶式动画,技术简单,但是动画生硬、刚性物体链接处有接缝。顶点动画
顶点动画就是以顶点为最小单位制作的动画。可以制作高精度的动画,常用于捏脸系统、脸部动画。
缺点是数据存储量大,因为顶点一般特别多,每一个关键帧都要存一次,现在一般使用面部识别设备制作。骨骼蒙皮动画
这是现在游戏行业使用最广的动画,使用骨架(一系列关节以树状父子层级结构组成)来模拟人物,机械的运动。
通过“蒙皮(Skin)”这项操作绑定骨骼与模型。蒙皮要定义一个蒙皮顶点,也就是模型上的一个顶点,的位置、法线、UV、受哪些骨骼影响、以及受骨骼影响的权重。动画流转
动画融合(Blend)
很多时候,我们不为了每个动作都做一个动画,而是使用程序逻辑对几个动画进行动画融合来实现一系列动画。
当动画之间进行过度时,也要进行动画融合。动画状态机
利用状态机来控制动画,一个状态下播放一个或一系列动画,通过游戏逻辑层传来的信号判断转换条件来控制各个状态的切换。
万向锁
万向锁是欧拉角的一个缺陷,由于欧拉角有父子层级关系,当Y轴旋转90°时,X轴和Z轴将重合。
由于欧拉角的此项缺陷。引擎内部会使用四元数来表示旋转,四元数和欧拉角可以相互转换。程序动画
程序动画的用处
动画师的动画,往往在环境拟合上不能完全让人满意。比如角色走一个上坡,前脚要成什么样子,抬多高,这是动画师制作时无法考虑的问题,那么就需要程序动画来解决问题。
程序动画会加大性能开销,因为我们需要在运行时计算数据,计算量往往会变得很大,所以使用程序动画需要做好规划,避免大量使用。FK(Forward Kinematics)
设置关节的姿势和动画,移动关节时会影响该关节及其层次下方的任何关节。可以理解为通过父关节决定子关节的运动。
IK(Inverse Kinematics)
给定末端作用器的位置和方向,反向求出各节点的位置。可以理解为由子关节决定父关节位置,这个在游戏中大量使用。
更多相关内容 -
《Unity Animation Essentials》《Unity游戏动画设计》英文版 及 代码
2016-11-12 23:00:49《Unity Animation Essentials》《Unity游戏动画设计》英文版 及 代码 -
游戏动画素材
2012-05-17 11:50:24游戏动画素材 -
游戏开发入门(五)游戏动画系统
2018-01-30 18:11:38视频链接:游戏开发入门(五)游戏动画系统(8节课 时常:约2小时30分钟) PPT比视频要块一些 第二节与PPT对不上 视频中杂音太大,如果带耳机还听不清的话,建议直接看内容即可 笔记与总结(请先学习视频内容)...视频链接:游戏开发入门(五)游戏动画系统(8节课 时常:约2小时30分钟)
PPT比视频要块一些 第二节与PPT对不上 视频中杂音太大,如果带耳机还听不清的话,建议直接看内容即可
笔记与总结(请先学习视频内容):
1.游戏的发展史也是游戏动画的发展史
最初的2D动画是通过序列帧图片来完成的,和动画电影原理一样,将多张图片连到一起就形成了动画,表现力比较差。如今的3D动画其实原理相同,但是在各个细节的处理已经大大不同了,需要多个动画完美的衔接融合,与外界环境有着很好的交互。2.动画是关于时间的函数:
- 逐帧动画:随着时间的变化,去改变图片内容,常用于2D角色动画
- 刚体动画:随着时间变化,改变某个刚体的位移(或旋转,缩放),常用于游戏动画录制等
- 顶点动画:随着时间变化,改变模型顶点的位置,可用于简单的模型变换,捏脸,自定义角色等
- 骨骼动画:3D游戏必用,随着时间变化改变骨骼模型关节的旋转,进而驱动骨骼上的蒙皮,用来模拟角色动画
- UV动画:随着时间变化,改变模型上的贴图的UV数据,从而模拟其表面变化的效果,常用于水面的模拟
- 粒子动画:随着时间变化,改变粒子的轨迹与形态,用于加强场景的效果表现。
- 布料动画:随着时间变化,改变顶点或者骨骼关节的位置(本质上是顶点或者骨骼动画),用于模拟如衣服头发飘动的效果
3.骨骼动画的优势:
关节在局部空间运动,只有旋转数据(避免角色身体部分拉长),无论是性能还是表现都很优秀
骨骼动画理解:骨骼动画的变换是基于局部坐标空间系的,比如人体手腕关节在旋转时,他是基于其父关节点(小臂)的空间坐标系下进行变换的,而小臂的旋转又是基于他的父关节点(大臂)的,一直递推到根骨骼。所以,我们在世界坐标空间下更新骨骼动画时,只需要传入根骨骼的坐标(模型原点),对该坐标进行坐标变换,整个骨骼都会跟随这一起变换。4.粒子动画系统就是我们常见的发光特效,其组成包括一个发射器,一个效果器还有一个销毁器。
发射器可以绑定在某个对象上,随着对象移动,移动的同时发射粒子,效果器作用于发射出来的粒子,可以影响粒子的颜色,明暗,位置等属性。销毁器负责销毁粒子。5.布料动画采用的原理是弹簧质点模型,可以很好表现诸如头发衣服的飘动效果
6.游戏动画系统主要解决的问题:
- a.管理动画资源,在合适的时间合适的方式去读取合适的动画
- b.完美的更新当前需要表现的动画
- c.输出动画给其他模块去使用
7.动画数据处理模块:
存储了动画每帧(或固定某几帧)的状态与数据,可能是图片、矩阵、多个浮点数等注:由于存储空间的限制,我们不可能将连续动画所有帧(什么更精细)的数据全部存储下来。所以,美术在制作动画资源的时候只是对关键帧进行制作修改,我们需要也通过对一套动画资源采样来尽可能模拟动画。如果我们只进行逐帧采样,会导致动画不流畅。所以,我们考虑时间采样。时间采样需要解决一个问题,时间是连续的,动画资源是不连续的,所以需要对两个关键帧没有动画的地方处理,这个处理就是插值。插值是游戏制作里面一个非常基础而且重要的技巧。处理动画以外还用于更新摄像机位置,对顶点之间的渲染等。
游戏的互动性决定了动画不能是完整的一大段的,玩家可以随时终止或修改当前播放的动画
8.常见插值:
线性插值,样条线插值9.什么是帧?
帧的概念在游戏中比较混乱,有时人们可能认为他是时间单位,比如一秒有30帧。但实际上帧是指某个时间点的画面,一秒30帧指的是一秒内能渲染出30张静态的画面数据,帧数越高动画效果越流畅。10.关于切线空间:
参考一下知乎上的讲解 https://www.zhihu.com/question/2370693311.关于全局时钟与局部时钟的理解:
这是游戏引擎架构的一个例子。我这里做一个更为形象的描述,假如玩家有一个攻击动画一共3帧,NPC有一个受击动画也是3帧。如下图。当玩家在第N帧攻击的时候,播放攻击动画第一帧,但是由于NPC在这一帧已经更新完了,所以NPC接受攻击并播放动画只能在第N+1帧去播放。如果用局部时间,那么在N+1帧更新的时候,他更新的就是受击动画第0帧,然而这时候玩家播放的是攻击动画第二帧。很明显就不匹配了。
如果用全局时间,那么在玩家播放攻击动画的时候,全局时间一直在变化,这时候NPC其实应该开始计时并更新动画(不过在第N帧的时候没有机会更新了)。等到第N+1帧的时候,NPC就会按照全局时间更新,那效果就是与玩家同步的动画了,但是问题是NPC为了与玩家保持一致可能跳过了第一帧动画。12.IK
视频中神秘海域角色手能够牢牢抓住墙靠的其实就是IK技术。IK全称Inverse kinematics,意思是反向动力。我们通常角色的动画是靠身体根部的关节来驱动的,比如你在移动手臂的时候,是肩的位置开始通过手臂肌肉来完成的。但是这样在游戏中有个问题,我的攻击动画只考虑出拳,正常来说如果前面有障碍我的拳头遇到障碍就会停下来的。在没有任何处理的情况下,这个拳头遇到障碍并不会停下而是穿过去,所以我们需要根据拳头移动过程中遇到的障碍来改变拳头以及手臂的位置,从拳头改变并反向的影响玩家手臂的操作就是IK技术。 关于IK的文章链接:13.动画复杂性分析:
a.游戏中,玩家可以通过按键迅速改变角色的动作,那各种的动画切换如何处理?
美术在制作动画的时候,不可能任何两个动作都能完美的衔接,所以需要平滑的过渡处理。这里平滑其实就是前面提到的插值,比如从走路切换到跑步时,有一段时间两个动画同时更新,然后根据权重进行处理。根据插值的类型不同,分为普通圆滑过渡(线性,视频中为淡入淡出)与缓入缓出(贝塞尔曲线)两种过渡。b.角色在移动过程中可能还会有其他动作(如回头,举手),那如何根据参数选择并混合不同的动作?
如果角色在某个状态下只有一个动作,那可以直接播放该动画就可以,不过想同时表现两个动画就需要对动画进行混合了。- 一维线性混合:给一个参数b,根据b的大小确定一个区间。每个区间对应两个动画,在这个区间内根据权重对两个动画进行混合。
- 二维线性混合:一般来说至少需要准备4个动画,由两个参数决定二维平面上的一点,进而对多个动画进行混合。
- 其他混合:三角形二维线性插值混合(对三个片段形成的三角型构建重心坐标方程,这个重心不是我们常说的中线相交的,而是各个点有一定质量,然后求重心)泛华的二维线性插值混合(与三角形重心坐标类似,将多个片段每三个构成一个三角形再去建立重心坐标方程)
- 视频中还提到一个四面体的插值混合,个人觉得这个在动画混合中并不常见,因为一般二维的动画混合足以解决大部分的动画混合问题,三维混合只会增加操作成本。但是对于某些实际应用场景,该方法比较直观,比如空间中的一个顶点,需要通过插值确定他的颜色,这时候可以确定他所在的一个四面体,然后根据四面体四个顶点来插值(利用四面体插值公式)。
c.如何表现动画的多样性?
最简单的办法就是做更多的动画资源,但是这种方法会增加包的大小,而且美术的工作量几乎以指数爆炸的形式增长。
所以我们通过一些常见的办法来处理,如叠加混合。举例子来说,玩家在走路的时候可能会向左右观察,如果做成单个的资源,就要做一个普通走路,向左看走路,向右看走路,如果跑起来的话,又要做一套向左看跑,向右看跑。但是其实玩家在向左看的时候,除了头部以外,几乎没有其他动作,所以我们并不需要做了一个向左看走又做一个向左看跑的动作,只需要向左看的动画。然后,将向左看与走路(跑步)动画叠加混合就可以了。这个与前面b的差别是前面提到的混合是多个动画完全混合,这里的叠加混合属于局部空间混合,不过局部混合属于完全混合的一种,本质上一样的。另外一种就是,骨骼分部混合。他会对每个关节设置一个混合百分比,然后在制作动画的同时制作一个动画遮罩,在动画播放的时候设置部分关节的遮罩为1,这样就能达到混合效果了。但是,相比前面的叠加混合,骨骼混合属于动作取代,在表现上稍微逊色一些,有时候会造成动画动作不自然。
其他的方法:动画镜像,共享骨骼资源,IK等。
d.如何应对越来越复杂的动画逻辑?
前面基本上描述了动画播放的基本逻辑(动画是时间的函数),但是一个复杂的动画同时还可能需要其他方面逻辑的配合,比如声音,特效,特殊事件等。这些逻辑与动画可能非常紧密的交织在一起,很难拿出某个模块单独处理。所以,动画系统产生了一个动画轨来处理这些逻辑,我们可以把这些逻辑添加到动画某个特定帧的位置,这样基于动作我们就可以做很多的处理。e.如果构建一个足够灵活的动画系统?
动画运算树,附Unreal动画蓝图(本质上就是动画运算树)
动画状态机,传统的动作管理需要处理所有动画的衔接混合情况(任何两个动画都可能产生切换),而动画状态机可以以状态驱动的方式管理控制角色的动作以及各种情况(单个动画与一组混合后的动画)的过渡衔接。附Unreal状态机蓝图
上一篇:游戏开发入门(四)逻辑与脚本开发
下一篇:游戏开发入门(六)游戏物理引擎原文链接(转载请标明):http://blog.csdn.net/u012999985/article/details/79209161
-
Unity游戏动画 从入门到住院:动画状态机
2017-05-21 09:23:00好了,现在我们已经成功的导入了动画。接下来要玩的东西就很装13啦。因为大部分动画师是用不到这家伙的,需要掌握这个技能的,至少也是动画组长级别了。嗯。。。一个组只有你一个动画的,闭嘴!给你个同情的眼神。 ...好了,现在我们已经成功的导入了动画。接下来要玩的东西就很装13啦。因为大部分动画师是用不到这家伙的,需要掌握这个技能的,至少也是动画组长级别了。嗯。。。一个组只有你一个动画的,闭嘴!给你个同情的眼神。
这个装叉的东西就是动画状态机
嘛~肯定有不明真相的吃瓜群众要问, 这东西除了装B还能干嘛用。状态机嘛,提供了动画状态之间的切换功能、自带动画融合、能编辑动画播放的逻辑顺序、能设置随机播放、能设置行为树。现役动画状态机是在4.0版本问世的,他跟前代相比。那简直是bip骨骼跟bone骨骼的区别。
首先,我们要创建个新的状态机。在project面板下,点create 找到animator controller 点击创建状态机,按F2可从命名,双击它进入状态机面板。或在window窗口,找到animator打开状态机面板。
把做好的动画拖入状态机面板,或右键create state→empty创建空状态,在属性面板motion属性栏指定动画。
那么接下来介绍下灰色矩形状态机的inspector(属性面板)内容
命名 不解释
tag 标签
motion 前面说过 是指定动画的地方
speed 速度 动画的播放速度 单位是倍
mirror 镜像 跟动画系统那边的镜像没啥区别
cycle offset 循环抵消 额 貌似是循环次数设置
这三个参数都有parameter这个选项 这个勾选的话就是使用动画自带的参数设置
foot IK 脚部IK
write defaults 写入预设
创建了一系列灰色矩形状态,右键make transition可以给状态机之间指定连接关系
选中连线,会发现连线也是有属性设置的。毁誉参半的动作融合就是在这里设置
接受打断时间 勾选后要等当前动画播放完后,才会接下一个状态。不勾选的话 就允许动画播放一半时被打断。这里稍微介绍一下下面的参数,实际你再操作过程当中自然就理解是什么意思了……setings设置、exit time打断时间(从哪一帧开始逐渐降低当前动画的权重)、fixed duration固定持续时间(这其实是一个切换开关,切换是按照秒显示还是按照百分比显示)、transition duration过度持续时间 (过度有多长)、transition offset过度抵消(从下一个动画的什么位置开始播放)、interruption source中断来源 。
嘛 给大家看一个比较简单的动画状态机,这里橙色的待机动画是初始状态,其他状态都需要从这里出发,也都能回到这里。这是最没有要求的的策划宝宝想出的最简单粗暴状态逻辑了。每个灰色矩形的状态表示一种动画,箭头连线表示状态切换方向。比如待机和移动是可以互相切换过去的,但是待机能切换到死亡,死亡却不能切回待机。正所谓人死不能待机,说的就是这个道理。这里说个小瑕疵,就是我的状态机是为了演示方便所以起的中文名,你的话最好不要用中文。因为。。。
接下来以三连击为例,讲一个相对复杂一点的状态机关系。正常顺序为待机→攻击1→攻击2→攻击3→攻击3收招→待机,这是一套三连击打完的顺序,但是玩家操作的时候可能只按了一下攻击,那么状态机的顺序就是待机→攻击1→攻击1收招→待机。攻击2同理。这是一个有那么点要求的act或arpg策划大爷提出的合理要求。一个状态下会有两种支线状态,此时的状态机切换逻辑还是在一个小学毕业的理解水平,接下来我们说个初中毕业的。
在状态机窗口空白处右键,create sub-state machine 创建名为次级状态机的东西,恩,这么low鸡的名字我们肯定不会用的,我们管他叫灰色六边形状态机好了
这个状态机的作用是,他可以创建另外一套次级状态。举例来说,act游戏中角色站着的时候有站跑攻击防御,下蹲的时候则是另外一套站跑攻击防御。下蹲就是次级状态,因为下蹲跑,下蹲攻击这些动作都是基于下蹲这个状态,所以他们可以独立成为一个次级状态机。
双击灰色六边形状态机,进入次级状态机编辑页面。标题栏可以看到下蹲页签在基础层之下。这里简单罗列了几个下蹲的动画状态便于理解。这是一个比较有要求的策划老爷提出的高标准的要求,比如下蹲攻击防御被击,空中攻击防御被击,中毒状态下攻击防御被击,残血状态下攻击防御被击等等不同的次级状态。。。恩 恭喜你初中毕业,完成了九年义务教育成为了一个普通的动画师
现在到了高中的课程了,你遇到了一个有理想的策划爸爸,他向你提出了一个无理要求。当手柄摇杆轻轻向前推的时候角色缓慢的移动,全力向前推的时候角色快速跑动;当摇杆左右轻推的时候,角色小幅度的转向,全力左右推的时候,角色大幅度转向。放下那条狗,不要急着x它
。能解决无理要求,这就是你和普通动画师的区别。在别人日了狗日了整个动物园的时候,你完成了高中毕业。。。
选择“移动”这个灰色矩形状态机 create new blendtree in state 创建一个行为树。双击进入行为树编辑页面
为了满足这个有理想的策划爸爸,你需要做好以下动画,待机、待机小转、待机大转、走、走小转、走大转、跑、跑小转、跑大转。转弯的动画可以只做一侧,另一侧用镜像动画实现。然后把这些动画链接给行为树。属性面板,设置行为树属性为2D freedom cartesian,这里不一一介绍几个行为树属性标签,大家可以自行尝试一下,其他的标签都是在此基础上做减法很容易理解。
在motiom栏填好动画,posX、posY设置好坐标,时钟图标表示速度,小人图标表示动画镜像。
这里的坐标设置0,0原点是待机,直线向上是走,再向上是跑;原点横向位置,近距离的是小转动画,远距离的是大转动画,走跑也是如此。图中红色点表示当前角色的状态,因为在0和1之间有无限个数字,所以这个状态是无限的,他是多个状态的融合,最多可以同时获取四个动画状态而融合成为一个全新的中间态。做完这一步,就需要程序老爷帮忙将摇杆推动的幅度映射到这个平面上,就可以实现有理想的策划爸爸提出的需求了。到此,阁下高中毕业,是一个了不起的人才!但是我知道你没那么容易满足,接下来我们学习一点高中火箭提高班的课程吧。
刚刚那个有理想的策划爸爸一拍脑门忽然有了个绝妙的点子,当角色跑到最快的状态后,他可以爆气,进入狂暴状态,但是随着狂暴值减少,要逐渐变回正常跑。此时,我们要在跑步状态机下,加入一个线性行为树。是的没错,行为树的子级也可以是行为树,如果你的策划足够睿(bian)智(tai),行为树可以成为一个真正的,拥有无限分支的“树”。
最后,给大家看一个比较复杂的状态机,它包含了一个主状态,五个次级状态,N个状态机,还有一个行为树,恩,高中火箭提高班大抵如此……
科科,你不会以为真的结束了吧,我是那种只能教到高中水平的人么,咱给你来点大学的!嘛
层动画 看起来没有什么新鲜的 基本每个动画软件都会提供层动画 但是unity的层动画是在状态机这里 每加一个层 都可以配置一套全新的状态机!
终于迎来了这一天了。。。你战胜了有理想的策划爸爸,自以为从此天下无敌,纵横游戏研发界立于不败之地。没想到他还是出现了。
是的就是他,他叫做外行老板。。。
他提出了一个可实现的小目标,要你给每个动画配上表情。
一个跑步要有喜怒哀乐忧思恐各种表情,一个待机也要有喜怒哀乐忧思恐各种表情。你反抗说这样资源要多出N倍,他表示我们做的是精品高品质游戏,不在乎资源量。你狠狠地吸了一口利群,表示这样工作量也会翻倍,他表示如果你不行就直说,他不介意换人“不过是美工而已,到处都招的到啊”。在你的人生彷徨无助的时候,你的老朋友《unity游戏动画 从入门到住院》永远辣么坚挺的在你身后顶你!
不就是表情吗!新建一个动画层!搭建一套表情的状态机!然后做一套喜怒哀乐忧思恐的表情!注意!只要一套!然后丢给程序!让他写好调用逻辑!就可以完美实现每个动画都有各种表情了!
这时老板又提出了一点小想法,听说换装很赚钱,我们也要做换装!而且要每个衣服针对不同的动作都有对应的动画!什么?项目到中期了你才跟我说要加换装?
本宝宝捅死你哦
别急别急,我们可以!我们只需要新建一个衣服的层,创建与身体动画一一对应的状态机,然后把衣服的动画配置好就行了!恩这个方法是需要巨大的工作量和资源量。但是项目中期才提出换装需求的话,这几乎是唯一解!
至此,老板已经对你刮目相看!但是他昨晚喝酒的时候又想到了一件事!“我们这个游戏呢有各种战斗天使,有的长了两个翅膀,有的长了八个翅膀,最厉害的战斗天使大哥长了十六个翅膀,但是他们的身体动画都是一样的!小伙子你想想办法能让他们公用身体动画资源,然后每个人用各自的翅膀动画!这也是听你的想法节省资源嘛。”(别问我为什么还不辞职,因为你穷啊!)
好的,怎么做!我们要给每个角色新建一个状态机,每个状态机分两层。一层是身体动画,大家公用一套动作,一层是翅膀动画,大家用各自单独导出的动作。简单吗,就这么简单。呵呵呵呵嘤嘤嘤嘤 。。。我特么到底经历了什么才学会的这些啊!
layers页面下点击右侧加号新建层
点击每个层的齿轮可以设置层属性,由上到下分别是权重(这一层对动画影响的权重值)、遮罩(身体遮罩,用来遮盖身体各部分动画如表情动画需要遮盖掉头部以下所有部位)、混合模式(可选叠加或者覆盖,字面意思)
这里再给大家额外介绍一种override controller。就叫他加号状态机好了,创建它跟创建正常状态机一样。它相当于在一个原有的状态机外部加一个壳,这样我们就可以完美的继承下来原有状态机的所有配置,并且可以所以更改、从新指定原状态机任意位置的动画。
-
C++游戏之游戏动画的实现(三)
2015-03-16 03:26:21上一章,我们已经知道如何绘制图片与文字了,这节我们就来说说如何绘制游戏动画与透明贴图,所谓的游戏动画,其它是一帧一帧的帖上去的,原理和播放电影一样,比如我们有以下yi上一节,我们已经知道如何利用GDI在窗体上绘制图片和文字了,是不是很简单,那么现在如何利用GDI在游戏中实现动画效果呢?俗话说的好,2D游戏是贴图的艺术,3D是渲染的艺术,贴图嘛,也很简单,有两种方式,一种采用定时器,一种则是利用消息循环,目前都是采用的第二种绘制方式(消息循环),这里也只使用第二种,游戏中的动画都是一帧一帧的帖上去的,就像播放电影一样,如何实现呢?我们只需把上一节的代码拿过来稍作修改就行了。(本文内容均为个人理解与学习)
比如有以下怪物出现的动画(素材来自DNF)(
很简单,用一个数组把他们保存起来,然后依次播放就行了。
HBITMAP *image = new HBITMAP[29];//动画的图片句柄数组,28张图片,从0开始,所以数组为29
资源初始化函数
//初始化资源 void Game_Init(HWND hwnd) { g_hdc = GetDC(hwnd);//获取设备环境DC m_hdc = CreateCompatibleDC(g_hdc);//建立兼容的设备环境 wchar_t fileName[10];//文件名 //初始化图片数组 for (int i=0;i<29;i++) { ZeroMemory(fileName,wcslen(fileName));//初始化数组为0 swprintf_s(fileName,L"%d.bmp",i);//格式转换 image[i] = (HBITMAP)LoadImage(NULL,fileName,IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_DEFAULTSIZE);//加载位图到数组 } }
动画的绘制
//绘制图形 void Game_Paint(HWND hwnd) { /*根据下标绘制动画 其中(index = (++index)>=29?0:index)为简写等同于 index++; if(index>=29)//判断下班是否越界 { index=0; } */ SelectObject(m_hdc,image[index = (++index)>=29?0:index]); BitBlt(g_hdc,150,0,800,600,m_hdc,0,0,SRCCOPY);//拷贝到设备环境上 }
最后记得清理资源void Game_Clear(HWND hwnd) { ReleaseDC(hwnd,g_hdc); DeleteObject(hfont); delete [] image;//清理图片数组 DeleteObject(m_hdc); }
运行效果图:如果看起来不是很流畅,那是因为GIF动态本身的原因,非代码问题
看起来还不错哈,我们来加入点背景音乐,就更不错了,怎么添加呢?很简单,一句话搞定,不过这种方式貌似只能播放wav格式的音频哦。
#pragma comment(lib,"winmm.lib")//添加一个库文件
添加库文件后,调用PlaySound函数就行了
//第一个参数,文件路径 //第二参数,应用程序的实例句柄,除非pszSound的指向一个资源标识符,否则必须设置为NULL //第三个参数为标示,SND_LOOP重复播放,SND_ASYNC异步播放,SND_FILENAME来自硬盘文件 PlaySound(L"bg.wav",0,SND_LOOP | SND_ASYNC | SND_FILENAME);
完整源码:#include <Windows.h> #include <string> #pragma comment(lib,"winmm.lib") using namespace std; //窗体的过程函数 LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wparam,LPARAM lparam); HDC g_hdc;//设备环境 HDC m_hdc;//兼容的设备环境 HBITMAP *image = new HBITMAP[29];//绘制动画的图片位图数组 int index=0;//图片下标 wstring test=L"Hello Word";//绘制的字符串 HFONT hfont;//字体对象指针 //初始化资源,用于初始化设备环境和加载背景图片 void Game_Init(HWND hwnd); //绘制图形,正式绘制 void Game_Paint(HWND hwnd); //清理资源,程序退出时,释放资源 void Game_Clear(HWND hwnd); //WinMain主函数 INT WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrivInstance,LPSTR lpCmdLine,int nShowCmd) { //设计一个窗体 WNDCLASSEX wndClass = {0}; wndClass.style = CS_HREDRAW|CS_VREDRAW; wndClass.cbSize = sizeof(wndClass); wndClass.cbClsExtra = 0; wndClass.cbWndExtra = 0; wndClass.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH); wndClass.hCursor = ::LoadCursor(hInstance,IDC_ARROW); wndClass.hIcon = (HICON)::LoadImage(NULL,L"",IMAGE_ICON,0,0,LR_LOADFROMFILE|LR_DEFAULTSIZE); wndClass.hInstance = hInstance; wndClass.lpfnWndProc = WndProc; wndClass.lpszClassName = L"Test"; wndClass.lpszMenuName = 0; //注册窗体 if (!RegisterClassEx(&wndClass)) { return -1; } //创建窗体 HWND hwnd = CreateWindow(L"Test",L"GDI",WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,800,600,NULL,NULL,hInstance,NULL); if (hwnd == NULL) { return -1; } //初始化资源 Game_Init(hwnd); //显示与更新窗体 ShowWindow(hwnd,nShowCmd); UpdateWindow(hwnd); //消息队列 MSG msg = {0}; while (msg.message != WM_QUIT) { if (PeekMessage(&msg,0,0,0,PM_REMOVE))//读取消息 { TranslateMessage(&msg);//翻译消息 DispatchMessage(&msg);//发送消息 } else { Game_Paint(hwnd);//绘制函数 Sleep(50);//绘制间隙50毫秒 } } UnregisterClass(L"Test",hInstance); return 0; } //窗口过程函数 LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wparam,LPARAM lparam) { switch(message) { case WM_PAINT: ValidateRect(hwnd,NULL);//重绘整个窗体 break; case WM_DESTROY: Game_Clear(hwnd);//退出程序时,清理资源 PostQuitMessage(0); break; default: return DefWindowProc(hwnd,message,wparam,lparam); } return 0; } //初始化资源 void Game_Init(HWND hwnd) { g_hdc = GetDC(hwnd);//获取设备环境DC m_hdc = CreateCompatibleDC(g_hdc);//建立兼容的设备环境 wchar_t fileName[10];//保存文件名 //初始化图片数组 for (int i=0;i<29;i++) { ZeroMemory(fileName,wcslen(fileName)); swprintf_s(fileName,L"%d.bmp",i); image[i] = (HBITMAP)LoadImage(NULL,fileName,IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_DEFAULTSIZE); } //播放背景音乐 //第一个参数,文件路径 //第二参数,应用程序的实例句柄,除非pszSound的指向一个资源标识符(即fdwSound被定义为SND_RESOURCE),否则必须设置为NULL //第三个参数为标示,SND_LOOP重复播放,SND_ASYNC异步播放,SND_FILENAME来自硬盘文件 PlaySound(L"bg.wav",0,SND_LOOP | SND_ASYNC | SND_FILENAME); } //绘制图形 void Game_Paint(HWND hwnd) { /*根据下标绘制动画 其中(index = (++index)>=29?0:index)为简写等同于 index++; if(index>=29)//判断下班是否越界 { index=0; } */ SelectObject(m_hdc,image[index = (++index)>=29?0:index]); BitBlt(g_hdc,150,0,800,600,m_hdc,0,0,SRCCOPY);//拷贝到设备环境上 } //清理内存 void Game_Clear(HWND hwnd) { ReleaseDC(hwnd,g_hdc); DeleteObject(hfont); delete [] image; DeleteObject(m_hdc); }
代码本来很小的,结果资源却很大 = = ! 汗,CSND居然传不了,等级不够 = = !
源码及其资源下载:http://pan.baidu.com/s/1i3iU3Pj
-
Pixi.js 超快 HTML5 的 2D webGL Canvas 游戏动画渲染引擎
2022-03-09 14:34:15HTML5 的 2D webGL Canvas 游戏动画渲染引擎 Pixi.js中文网 快速 PixiJS的强项是速度。在2D渲染方面,PixiJS是最快的。 灵活 友好的、功能丰富的API让PixiJS轻松处理基本问题,同时您可以专注于生成令人难以置信跨平台... -
【Unity游戏开发】动画系统(二)2D动画
2021-12-07 16:14:22Unity2d简单动画 -
苹果mac 3D游戏动画开发软件:Unity Pro
2022-01-20 16:49:22想要一款功能强大的3D游戏动画开发工具?Unity 2019能够轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具。 -
《和平精英》动作设计解密 游戏动画岗位深度解读
2020-05-15 09:51:14近日,我们邀请到了腾讯光子工作室群S工作室《和平精英》动画负责人Steen,请他详细分享了游戏动画岗位的工作内容、行业现状和发展建议。Steen在2006年入行做动画,早期在影视行业参与过一些国外的外包动画项目,... -
【Unity游戏开发】动画系统(四)Unity3d动画基础
2021-12-14 21:57:19Unity3d动画基础 -
LSprite 手机游戏动画编辑器 个人版
2010-02-26 17:41:31LSprite 手机游戏动画编辑器有效的将程序和美工、策划的工作有序地分离开,美工、策划侧重于用编辑器拼接图片编辑动画,而程序完全不必关心这个过程,只需要得到编辑器生成BIN文件,也无需关心动画的运行机制,只需... -
手机游戏动画编辑器(手机游戏)
2009-05-19 13:01:29手机游戏动画编辑器 手机游戏动画编辑器 手机游戏动画编辑器 手机游戏动画编辑器 -
网页动画素材 跑酷小游戏(抖音资料)
2022-07-14 19:42:51网页动画素材 跑酷小游戏(抖音资料)网页动画素材 跑酷小游戏(抖音资料)网页动画素材 跑酷小游戏(抖音资料)网页动画素材 跑酷小游戏(抖音资料)网页动画素材 跑酷小游戏(抖音资料)网页动画素材 跑酷小游戏... -
第六章 DirectX 2D游戏和帧动画(上)
2021-10-23 11:03:522D游戏的本质就是图像游戏,2D游戏中的动画其实就是一系列连续动作的图像,称之为序列帧动画。这也是动画片制作的原理。在动画中,每一张图像就是一帧,为了让人们的眼睛感觉出这是一个连续的动作,需要在1秒钟之内... -
aa手机游戏动画编辑器
2008-10-30 13:55:27手机游戏动画编辑器手机游戏动画编辑器手机游戏动画编辑器 -
unity3d多人游戏动画同步
2017-12-24 08:23:58使用unity3d的unet制作一个局域网的局域网射击游戏,怎么去同步动画?? -
WPF与SL游戏动画教程ppt
2010-02-01 11:08:25作者:深蓝色右手,WPF与SL游戏动画教程。作者:深蓝色右手,WPF与SL游戏动画教程。作者:深蓝色右手,WPF与SL游戏动画教程。作者:深蓝色右手,WPF与SL游戏动画教程。作者:深蓝色右手,WPF与SL游戏动画教程。作者:深蓝... -
[unity实现在游戏暂停的时候播放动画不受影响]
2022-03-30 10:46:44比如赛车游戏要3,2,1,开始后游戏才继续。Time.timescale 不影响动画与特效。 事件 动画 动画添加事件,事件就是让游戏继续。 -
01.运动的小球,3dsmax游戏角色动画师教程
2020-04-29 01:38:34大家分享游戏动画的教程很少,中文版的就更少了。一起学习吧!!3DMAX游戏角色动画师教程(腾飞老师亲讲)【价值300元】3dsmax游戏角色动画师教程 -
在Unity中利用AnimationClip方便快捷的播放游戏动画
2020-02-22 22:13:08在Unity中我们一般要通过要通Animator类调用类中相应的触发方法,这样做的前提是必须要在动画属性面板中把这动画设置相应的触发条件(比如设置动画的触发条件为布尔值触发、数值触发等等),可以说是有点麻烦!... -
游戏的动画原理
2016-03-09 19:27:40游戏的动画原理 其实现在网上关于游戏编程的技术文章越来越多了,但是我发现关于最基本的了解游戏的文章还是比较少的。大多数文章是以 DirectX 作为开始教学起始的,因此,我觉得花点时间写下这篇文章还是... -
易语言动画框拼图游戏
2020-07-16 22:44:27易语言动画框拼图游戏源码,动画框拼图游戏,旋转图片 -
盘点:12种动画制作工具让游戏角色栩栩如生
2018-01-09 15:10:23这是一份顶尖游戏动画技术指南。 无缝衔接的角色动画是确保游戏代入感的重要因素,为了能帮助开发者创造出最逼真的动画角色,我们盘点了十二种动画制作工具。如果您有其它优秀的工具推荐,请告诉我们,我们会... -
游戏制作之路(3)Blender制作极简动画
2018-08-28 12:02:00在前面已经把Blender安装好,并且修改为中文显示了,接着下来,先不要做全面的了解,先来学习做一个简单的动画,来体验一下工具的威力,也体验自己辛苦安装之后的成果体现。你不用担心不会做动画,这里制作的都是极... -
零基础编程——块语言编程游戏攻略之动画篇
2018-11-06 18:38:21动画1 动画2 动画3 动画4 动画5 动画6 动画7 动画8 动画9 动画10 自由发挥 -
Python tkinter Canvas绘制动画桌面弹球游戏
2019-09-06 11:03:20其实前面程序中的高亮显示已经是动画效果了。...下面以一个简单的桌面弹球游戏来介绍使用 Canvas 绘制动画。在游戏界面上会有一个小球,该小球会在界面上滚动,遇到边界或用户挡板就会反弹。该程序涉及两... -
游戏动画技术的发展
2012-08-26 12:13:022d游戏中的动画,最简单直接的实现方式就是一帧一帧的静态图片依序播放,也被称作精灵动画(sprite)。 考虑到大量图片导致的内存消耗问题,发展出了一些2d动画精灵压缩方式。例如一个人物走动的动画,可以将... -
11个基于HTML/CSS/JS的情人节表白可爱小游戏、小动画
2021-02-14 23:01:44今天的文章就是给大家带来一些基于HTML/CSS/JS的情人节表白可爱小游戏、小动画。 1.小鹿亲嘴 这两个年轻的小鹿相爱。你可以帮助他们在一起吗? 使用Matter.js物理特性和自定义psuedo-rigging进行构建。已更新为固定...