ios CAAnimation动画实践和SceneKit飞机小游戏

简介

这篇主要介绍CAKeyframeAnimation关键帧动画和CATransform3D的简单使用,scenekit实现的飞机游戏在下一篇详细介绍。传送门

先看看实现的动画效果,下面在逐个分析。git项目地址

总体效果图.gif

动画分析和实现

1. 摇钱树

yqs.gif

这是我第一个app中的一个动画,看到需求后一头雾水,由于当时才接触ios,简直无从下手,经过各种百度后才找到一些头绪。从监听手机震动,到树干摇晃,最后掉落元宝,逐步理清了各个对象需要执行的行为动作。下面我会贴一些代码,具体的还请去项目中查看,代码注释也写得很详细。
手机摇晃监听

- (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event
{
    NSLog(@"%@",NSStringFromSelector(_cmd));
}

- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event
{
    NSLog(@"%@",NSStringFromSelector(_cmd));
    AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);//系统震动
    
    [self ybAnimation];
    [self shakeYQS:yqsImage];
}

摇晃树干

- (void)shakeYQS:(UIImageView *)view
{
    //表示以z坐标轴为中心轴旋转
    CAKeyframeAnimation *animation = [CAKeyframeAnimation animationWithKeyPath:@"transform.rotation.z"];
    animation.values = @[@(0),@(-M_PI_4/2),@(0),@(M_PI_4/2),@(0),
                         @(-M_PI_4/3),@(0),@(M_PI_4/3),@(0),
                         @(-M_PI_4/4),@(0),@(M_PI_4/4),@(0),
                         @(-M_PI_4/5),@(0),@(M_PI_4/6),@(0)];//设置树的摇晃幅度,分母变大表示摇晃幅度越来越小,不断h衰减至0。
    animation.repeatCount = 1;
    animation.duration = 1;
    [view.layer addAnimation:animation forKey:@"shake"];
    
}

这里要理解keypath的意思,从代码中可以很直观的看出监听的是z轴旋转属性,判断旋转方向可以用握手定则,用手握住坐标轴,大拇指指向坐标轴方向,其余四指为旋转的方向,至于顺逆时针,需要视情况而定。

至于元宝掉落,就是简单的一个平移动画

//元宝掉落
- (void)ybAnimation
{
    for (int i = 0; i< ybArray.count; i++) {
        
        UIImageView * yb = ybArray[i];
        
        int x = rand()%215;
        int y = rand()%60 + 60;
        yb.frame = CGRectMake(x + MinX(yqsImage), y + MinY(yqsImage), yb.frame.size.width, yb.frame.size.height);
        
        yb.hidden = NO;
        CAKeyframeAnimation *animation = [CAKeyframeAnimation animationWithKeyPath:@"position.y"];
        animation.delegate = self;
        animation.values = @[@(yb.frame.origin.y), @(yb.frame.origin.y+200)];
        
        float startTime = 0;
        
        animation.repeatCount = 1;
        
        float endTime = (float)(arc4random()%100) / 100 + 0.5;
        
        animation.keyTimes = @[@(startTime), @(endTime)];
        animation.duration = endTime;
        animation.fillMode = kCAFillModeForwards;
        animation.removedOnCompletion = NO;
        [animation setValue:@"ybDrop" forKey:@"ybAnimation"];
        [animation setValue:yb forKey:@"animationView"];
        [yb.layer addAnimation:animation forKey:@"ybAnimation"];
    }
}

其实拿到一个动画需求后,首先要理清的就是整个动画过程中,每个对象执行了哪些行为。分析好后,然后就往基本动画上套就行了,比如,平移,缩放,旋转这些,再复杂点可能会加入路径,3D场景变换等等,当然这些也需要一定的知识积累。下面两个简单动画,我就不贴代码了,只写一些分析思路。

2. 唱片动画

recordCD.gif

从图中知道,唱针和唱片执行的都是旋转动画,不同在于,唱针只旋转了几十度,而唱片却是旋转的360度,然后一直循环执行。

3. 闪烁动画

flashing.gif

这里中间的头像在不断放大缩小,明显头像执行的是缩放动画。然后使用了贝塞尔曲线画了两个圈,一个静止,另一个在执行一个组合动画,即在扩大过程中,颜色逐渐变淡。这里我模仿的是抖音直播时,头像的闪烁动画。

4. 扇形统计图

sectorChart.gif

这个稍微复杂一点,从画出扇形,到动画执行,最后计算每个扇形的点击范围并做出偏移。

首先,使用UIBezierPath和CAShapeLayer,画出扇形。光画出来还是比较简单,然后是动画执行。怎样才会产生上图那种类似扫描的效果?先来看看圆形进度条动画


progress1.gif

progress2.gif

想象一下,如果把边界的宽度一点点扩大达到圆的半径的长度,是不是就会出现扇形图扫描一样的动画了。

图形画好后,还要判断点击范围,这里采用的数学公式计算。首先判断该点是否在圆内,即点到圆心的距离是否大于半径;然后是触摸点跟圆心连成的直线和起始边形成的夹角是在哪个扇形区域类,都能通过公式计算出来。最后点击扇形执行偏移事件。(具体的计算公式请结合项目中的代码查看理解)

5. 飞机游戏
飞机游戏的实现其实并不如想象中困难,主要基于SceneKit实现的,SceneKit中封装了很多对象,使其从建立模型到执行动画行为,操作起来都简单易懂,感觉比较适合做一些小游戏开发。我会在下一篇文章中写出我的开发思路。传送门

6. 使用View构造一个立方体

3DViewLayout.gif

这里主要使用了CATransform3D属性,该属性封装了layer层的3D旋转,平移,缩放等操作。这里通过对6个view的平移和旋转实现的立方体显示。

7. 视图的3d旋转

dragAndRotateView.gif

用Pan手势实现的,手指拖动图片时计算出向量坐标,然后通过CATransform3DRotate来实现旋转。主要逻辑代码就几行,详细注释请在项目查看。

完结

感兴趣的可以去项目地址下载下来看看。git项目地址

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,016评论 4 62
  • 冰心先生说:“童年,是梦中的真,是真中的梦,是回忆时含泪的微笑。” 六一儿童节,孩子们盼望已久的节日,今天孩子们过...
    王翠连阅读 149评论 0 1
  • 今天和孩子玩了一回角色扮演。有时候,别人(熟人)跟她打招呼,她的表情很奇怪,噘嘴加翻白眼,因为她每天接触很多陌生人...
    曾萍萍阅读 164评论 0 0
  • 知道要过年了,5岁的小朋友异常兴奋,一直问:什么时候过年?还有几天?得到答案也不满意。隔天醒来就问:今天就过年了吗...
    九月露水阅读 285评论 1 8
  • 欢迎来到小于的王者地盘,小于已经更新了王者峡谷73位英雄全新的推荐出装以及铭文搭配,大家关注小于之后只需回复英雄名...
    王者小于帮阅读 212评论 0 2