呼吸动画实现

前言

在游戏中,肯定会有很多动画,逐帧的或者代码实现的。我们今天讨论的呼吸动画就是代码实现的动画。
然而什么是呼吸动画呢?并不是呼吸的动画,而是指一个可视化物体(图片或者按钮)的整体在做呼吸的动作模拟,在开心消消乐和Candy Crush中就能看到类似的实现


气泡整体会做呼吸的动作,这种很舒服的动画增加了很高的用户体验!

原理解析

那么这种动画要怎样来实现呢?
当然,条条大路通罗马,实现的方式有很多种,但最终控制的其实就是对象的缩放属性而已,在egret中则是sacleXsacleY了。

实现1

一般做法是通过两个Tween来分别控制这两个属性,在1这个值上下徘徊,当scaleX变大的时候,scaleY变小,反之亦然,如此循环即可。
若要做得更逼真自然的话,两个Tween之间加个延时即可,再加上一个egret.Ease.CubicInOut缓动,基本能实现。

实现2

笔者在经历了众多游戏开发后,得出了一种更为“自然”的实现方法,就是借助三角函数的力量。

如果你已经把高中三角函数的知识全部还给你们体育老师了的话,那建议还是去复习一下吧!三角函数复习资料
通过对x的改变y会产生周期性的波动,这正是现实世界中的物体运动规律,通过这种函数,我们就能实现各种周期性的动画了!

 1 /**
 2  * Created by rockyl on 16/3/1.
 3  *
 4  * 呼吸图片类
 5  */
 6
 7 class BreathImage extends egret.Bitmap {
 8     private _duration:number;
 9     private _offset:number;
10
11     constructor(value:egret.BitmapData|egret.Texture, duration:number = 2000, offset:number = 0.05) {
12         super(value);
13
14         this._duration = duration;
15         this._offset = offset;
16
17         this.init();
18     }
19
20     private init():void {
21         this.anchorOffsetX = this.width / 2;
22         this.anchorOffsetY = this.height / 2;
23     }
24
25     play():void{
26         this.t = 0;
27         egret.Tween.get(this, {loop: true}).to({t: Math.PI * 2}, this._duration);
28     }
29
30     private _t:number;
31     get t():number{return this._t;}
32     set t(value:number){
33         this._t = value;
34         this.scaleX = Math.sin(value) * this._offset + 1;
35         this.scaleY = Math.sin(value - Math.PI / 2) * this._offset + 1;
36     }
37 }

从代码中可以看出,笔者仍是使用了一个Tween来实现动画的驱动(你也可以通过egretTicker来实现驱动),从0到2π之间循环播放。
再通过一个t属性的属性访问器来实现动画的实时“绘制”。
你可以通过锚点来控制缩放的中心位置。
核心就在set t()中:

1 set t(value:number){
2     this._t = value;
3     this.scaleX = Math.sin(value) * this._offset + 1;
4     this.scaleY = Math.sin(value - Math.PI / 2) * this._offset + 1;
5 }

Math.sin(value)在一个2π周期内会从0到1,然后到-1,最后回到0,offset属性就是波动幅度,最后一个1作为常量,这样就实现在-offsetoffset之间的波动。
如果你还是理解不了,可以画个图来帮助理解一下(其实和随机数的处理类似)。

总结

笔者个人还是推崇实现2的,也不知道是不是笔者首创,估计很多大神早就这么做了。
其实对于三角函数驱动的动画,呼吸只发挥了它的一点点功力,笔者已经实现了很多动画比如:跳跃、圆周轨迹、8字轨迹、N闭环轨迹、不规则轨迹……这里就不给代码了!
开发到一定的程度,你肯定会总结出一些经验,然而分享经验的同时,你也会有所收获!

时间: 2024-08-11 20:46:32

呼吸动画实现的相关文章

css3 呼吸动画按钮

<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> <style type="text/css"> html,body{ height: 100%; width: 100%; padding: 0; margin: 0; } .circle{ width: 160px; height: 160px;

IOS-简单动画

iOS那些简单的动画(不定期更新) 字数669 阅读1118 评论16 喜欢59 关于 Core Animation Core Animation是一组非常强大的动画处理API,使用它能做出很多优雅的动画效果.能用的动画类有4个子类:CABasicAnimation.CAKeyframeAnimation.CATransition.CAAnimationGroup 开发步骤: 初始化一个动画对象(CAAnimation)并设置一些动画相关属性. 添加动画对象到层(CALayer)中,开始执行动画

unity 对Animator动画系统的研究

unity的新动画系统叫Mecanim,使用Animator来取代旧系统Animation,按Unity文档的惯例:知识点主要分2部分:unity manual和unity script,读者可以边看文章边查阅文档,最好能动手测试. 文章的开始之前,先讲几个基本的知识的: 1.创建动画的一个基本步骤是设置一个unity3d可理解的简化后的骨骼到骨架中实际骨骼的映射:在Mecanim的术语中,这个映射称为Avatar,即avatar是骨骼到骨架的映射. (图片来自网) Avatar主要用于类人骨骼

一个类似于QQ语音聊天时的拖拽移动悬浮小球

闲来无事,分享一个最近在某个地方借鉴的一个demo(原谅我真的忘了在哪里看到的了,不然也就贴地址了)这个demo的逻辑思路并不是很难,推敲一下,很快就能理解,只是觉得这样的一个组合控件用起来蛮能增色自己的APP的,所以也就记下了. 先给你们看一下效果图. 这里的悬浮小球其实是一个组合控件,可以在上面加上其他效果.之后我会上传demo.如果要做成QQ语音的那种,可以把图片移除,换上一个label,在label上加上时间久可以了,用的时候,可以直接把这个类拖进工程,直接加到想要添加的仕途上就可以啦.

宣传页项目开发(三)

网页交互效果的实现 滚动条高度的获取以及设置:document.body.scrollTop || document.documentElement.scrollTop .split()  把字符串分割成数组 .join()  把数组转为字符串 .replace( /\s+/g, " ")  正则全局替换,把多个空格符替换为一个空格符 综合效果 index.html <!DOCTYPE html> <html lang="en"> <h

CSS 动画之九-会呼吸的信封

新年已经到来,各个网站都举办着各种不同类型的活动,'会呼吸的信封'有可能就是你遇到的其中一种.其实就是一个信封的样式,在封口处加上开合开合的动画效果,吸引用户去打开这个信封,点击后可能会送红包,优惠券或介绍其他相关的活动内容. 动画原理非常简单:先写出信封的样式,然后将封口处的元素使用rotateX旋转.这其中用到的技术就是3D transform的运用. 1. 先看截图 2. 代码实现思路 2.1写出信封的样式. 利用样式实现三角形的形状一般有两种做法:一是使用边框,二是使用方形的元素旋转.第

CSS动画总结与呼吸灯效果

首先,先介绍一下主要用到的css属性:animation,text-shadow. text-shadow就不再介绍了,上一篇已经详细介绍了用法.这里先介绍一下animation属性. 1.animation animation是css3的属性,主要有以下几项: 属性 描述   @keyframes 规定动画.   animation 所有动画属性的简写属性,除了 animation-play-state 属性.   animation-name 规定 @keyframes 动画的名称.   a

如何按顺序执行两个动画

问题: 假如:需要按顺序执行两个动画A.B,B动画需要在A动画执行完毕后再执行.两个动画的执行不能有时间间隔,即A动画执行完毕立即执行B动画. 实现方案: 事先已经导入了Facebook的pop框架,并#import <POP.h> 1.设置A动画的动画时间,执行A动画 2.创建NSTimer定时器timer,设置时间间隔为A动画的动画时间.并把timer添加到主运行循环. 3.把B动画添加到timer调用的的selector方法中. - (void)touchesBegan:(NSSet *

[New learn]动画-基于UIView

原文:https://developer.apple.com/library/ios/documentation/WindowsViews/Conceptual/ViewPG_iPhoneOS/AnimatingViews/AnimatingViews.html 代码:https://github.com/xufeng79x/ViewBaseAnimation 1.简介 Animation,源于拉丁语,意为给无生命的物体注入灵魂. 动画可以为app应用增色不少,提高用户体验. 我们一般使用UIK