Cocos2d_android你所需要知道的一切(下)

Cocos2d_android你所需要知道的一切(下),第1张

概述上一篇我们主要讲了Cocos2d_android一些布置游戏场景的知识,这一篇重点讲下Cocos2d_android的事件触发,没看过上一篇的可以先去看下。 对于本章我做了个demo,完成各种动画。先看下效果图。 点击不同的圣诞树会有不同的动画。因为屏幕有限演示的动画有限,但实现思路都是一样的。 一,Action的简介 Cocos2d_android的CCAction总共有四类子类,它们分别是CC

上一篇我们主要讲了Cocos2d_androID一些布置游戏场景的知识,这一篇重点讲下Cocos2d_androID的事件触发,没看过上一篇的可以先去看下。


对于本章我做了个demo,完成各种动画。先看下效果图。


点击不同的圣诞树会有不同的动画。因为屏幕有限演示的动画有限,但实现思路都是一样的。

一,Action的简介

Cocos2d_androID的CCAction总共有四类子类,它们分别是CCFiniteTimeAction,CCFollow,CCRepeatForever,CCSpeed。它们的含义如下:

CCFiniteTimeAction:表示 受时间限制的动作,这可以说是最常见的,因为通常动画都是需要一定时间来完成的。它有两个主要的子类, CCFiniteTimeAction和 CCIntervalAction,前者是瞬时动作,后者是延时动作。
CCFollow:表示不受时间限制的动作。 CCRepeatForever:表示序列帧播放,非常常用。 CCSpeed:用于控制游戏的速度。 二,CCIntervalAction常见动作 1.移动 移动是游戏中最常见的动作之一,如植物大战僵尸中的僵尸,子d等。而Cocos2d中设置移动也很简单,看以下代码:
CGPoint point = CGPoint.ccp(300,150);     CCSprite sprite = CCSprite.sprite("bg.img");     CCMoveto moveto = CCMoveto. action(1,point);     sprite.runAction(moveto);@H_404_98@     CGPoint.ccp就是初始化一个点,CCMoveto.action就是就是设置sprite通过1秒的时间移动到point上。很简单吧。最后runAction执行动作。   这里还关系到一个Moveto和MoveBy的区别。它们的区别有两点:    * 简单说Moveto就是移动到绝对位置,如上面的例子就是移动到(300,150)这个坐标点,而MoveBy就是相对位置,如果当前位置是(100,0),那执行上面的代码最终会移动到(400,150)的位置上,也就是相对当前位置的(300,150)所在的点。    * MoveBy中有一个reverse()方法,可以让动作反向执行,而Moveto没有。    MoveBy的代码与Moveto类似:      
CGPoint point = CGPoint.ccp(300,150);     CCSprite sprite = CCSprite.sprite("bg.img");     CCMoveBy moveBy = CCMoveBy. action(1,point);     sprite.runAction(moveBy);@H_404_98@     再看看调用   reverse()的情况,具体运动状态可以看我的demo的第四棵树。          
CGPoint point = CGPoint.ccp(300,point);@H_404_98@   
<pre name="code"  >CCMoveBy moveBy1 = moveBy.reverse() ;@H_404_98@ sprite.runAction(moveBy);   
@H_404_98@   由于By与To的代码很类似,下文就只贴一种类型的代码了。不然会累死,哈哈。    2.旋转旋转的实现也很简单,与Move类似,看下代码:      
CCRotateBy scaleBy = CCRotateBy.action(0.2f,360);//100是顺时针100度	sprite.runAction(scaleBy);@H_404_98@第一个参数依然是时间,第二个参数是度数。旋转是顺时针的。可以看demo的第二棵树。    这里By与To又有点不同,To比较懒,如果是大小180度,它会逆时间转,它的原则是尽量少转。By就比较老实,写多少度,它就转多少。    3.缩放    就是缩小放大这个动作,看我demo中的每一棵树,这树的动作并不是一次性的,而是像个心脏似的一起跳,这里就有两个问题,如何让放大缩小两个动作串联起来?如何使动作循环执行?先不急,后面会系统讲解,先带着这问题继续往下。缩放的代码:      
CCScaleBy scaleBy = CCScaleBy.action(0.2f,1.5f);     sprite.runAction(scaleBy);@H_404_98@  4.跳跃    玩过超级玛丽的都知道,小玛丽跳的高度和大玛丽跳的不一样,有些牛X的还能二连跳。其实这个实现起来也很方便,先看一连跳:      
CGPoint pos = CGPoint.ccp (300,150);            // 跳跃:启动;时间;目标点;高度:实际跳跃的高度(最高点);次数           CCJumpBy jumpBy = CCJumpBy. action(2,pos,100,1);           CCSprite sprite = getSprite();           sprite.runAction(jumpBy);@H_404_98@pos指定最终跳到的点,CCJumpBy.action第一个参数是时间,第二个参数是终点,第三个参数是跳到的高度(最高点),最后一个参数是指跳的次数,由此可见,二连跳就很简单了,只要把1修改为2就可以了。  
5贝叶斯曲线
这个听起来很高端,其实就是抛物线状。植物大战僵尸里的花吐出的阳光就走了一条抛物线。实现如下:
CCBezIErConfig c = new CCBezIErConfig();           c. controlPoint_1 = CGPoint. ccp(0,0);           c. controlPoint_2 = CGPoint. ccp(150,200);           c. endposition = CGPoint. ccp(300,0);           CCBezIErBy bezIErBy = CCBezIErBy. action(2,c);           getSprite().runAction(bezIErBy);@H_404_98@  6.渐快渐慢动作    这个经常用在打斗游戏中,一个怪快速跳到另一个怪身边,杀杀,然后再跳回来,就是一个渐快到渐慢的过程。看下它的代码:      
CGPoint pos = CGPoint.ccp (300,200);           CCMoveBy moveBy = CCMoveBy. action(2,pos);           CCEaseIn easeIn = CCEaseIn. action(moveBy,10);// 渐快:加速运动(加速度恒定)           CCEaSEOut eaSEOut = (CCEaSEOut) easeIn.reverse();           getSprite().runAction(                      CCRepeatForever.action(CCSequence.actions(easeIn,CCDelayTime. action(1),eaSEOut)));@H_404_98@可能上面的代码有几处地方不懂,下面会讲解。先总结下基本的运行方法:    移动动作:CCMoveBy  CCMoveto
缩放动作:CCScaleBy CCScaleto
旋转动作:CCRotateBy CCRotateto
跳跃动作:CCJumpBy CCJumpTo
贝赛尔曲线动作:CCBezIErBy CCBezIErTo
淡入淡出动作:CCFadeBy CCFadeIn CCFadeOut
三,组合动作 上部分分个讲了一些常见的动作,但真实游戏实现单个动作的比较少,一般都是串在一起实现的。所以组合动作再所难免。先来看几个常用的接口: CCSequence:用于将多个动作串联到一起。 CCRepeatForever:用于把一个动作循环执行。 CCDelayTime:设置延时时间。
CCSpawn:并行执行动画。
看到这,上面心跳的那个例子就可以实现了,如下:
CCScaleBy scaleBy = CCScaleBy.action(0.2f,1.5f);     CCSequence ccSequence = CCSequence. actions(scaleBy,scaleBy.reverse());     CCRepeatForever ccRepeatForever = CCRepeatForever.action(ccSequence);     sprite.runAction(ccRepeatForever);@H_404_98@接下来我们用以上几个接口来共同实现一个复杂动作,一棵树翻两个跟斗,具体可以看demo的第三棵树。先看代码:       
 // 跳跃:启动;时间;目标点;高度:实际跳跃的高度(最高点);次数   CCJumpBy jumpBy = CCJumpBy. action(2,2);     CCRotateBy scaleBy = CCRotateBy. action(0.2f,100);//100是顺时针100度     //并行执行动画     CCSpawn ccSpawn = CCSpawn. actions(jumpBy,scaleBy);     //每循环一次停一秒     CCSequence ccSequence = CCSequence. actions(ccSpawn,ccSpawn.reverse(),CCDelayTime.action(1));     CCRepeatForever ccRepeatForever = CCRepeatForever.action(ccSequence);   sprite.setAnchorPoint(0.5F,0.5F);   sprite.runAction(ccRepeatForever);@H_404_98@CCSpawn让跳和旋转两个动作同时执行,然后调用CCSequence再串联一个回来的动作,调用CCDelayTime停一秒后,再经CCRepeatForever继续循环执行动作。   
到此已经可以完成很多复杂的动画了。在这里问一个问题,如果我想在某个动作结束后执行某个方法,该怎办?这里要强调的是,动画的执行是在多线程的,所以你直接把方法写在动作后面是行不通的。所以要通过CCCallFunc.action(this,"loadInfo")来调用自定义的方法,这里的方法名是loadInfo。代码如下:
CCSequence sequence = CCSequence.actions(CCDelayTime.action(1),CCCallFunc.action(this,"loadInfo"));		sprite.runAction(sequence);@H_404_98@   这是1秒后执行loadInfo方法。   
四 序列帧播放 什么时序列帧?就是一系列的图片连到一起组成一个动话,就叫序列帧。如一只怪的头点一下,就要有好几张图片串起来实现它的头慢慢下降。先看例子再进行讲解:
           CCSprite bar  = CCSprite.sprite("image/loading/loading_01.png");           bar.setAnchorPoint( cgSize. wIDth/2,25);            this.addChild(bar);            //以下是序列帧           List<CCSpriteFrame> frames = new ArrayList<CCSpriteFrame>();           String @R_301_6852@name = "image/loading/loading_%02d.png" ;//用占位符表示图片尾部,格式为两位数,如01,11。            for( int i = 1 ;i <= 9;i++){                CCSprite frame = CCSprite.sprite(String.format(@R_301_6852@name,i));                frames.add(frame.displayedFrame());           }                      CCAnimation animation = CCAnimation. animation("",0.2f,(ArrayList<CCSpriteFrame>)frames);           CCAnimate animate = CCAnimate.action(animation,false);//false表示只加载一次           bar.runAction(animate);@H_404_98@首先加载初始状态。把一系列的精灵转成CCSpriteFrame格式的转入到CCAnimation中,它就会自动播放。@R_301_6852@name中的%2d是规定了两位,d是点位符,传什么数进来就显示什么。比如,传1,就显示01,传11就显示11。最后CCAnmate.action中的false表示只加载一次,即动画只执行一次。如果要循环执行,就把它改为true。   
到这里,基础知识就介绍的差不多了,可以尝试去玩下植物大战僵尸,代码在上一篇博客中提供了。
源码下载 总结

以上是内存溢出为你收集整理的Cocos2d_android你所需要知道的一切(下)全部内容,希望文章能够帮你解决Cocos2d_android你所需要知道的一切(下)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1076237.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-26
下一篇 2022-05-26

发表评论

登录后才能评论

评论列表(0条)

保存