上一篇我们主要讲了Cocos2d_android一些布置游戏场景的知识,这一篇重点讲下Cocos2d_android的事件触发,没看过上一篇的可以先去看下。
Cocos2d_android你所需要知道的一切
对于本章我做了个demo,完成各种动画。先看下效果图。
点击不同的圣诞树会有不同的动画。因为屏幕有限演示的动画有限,但实现思路都是一样的。
Cocos2d_android的CCAction总共有四类子类,它们分别是CCFiniteTimeAction,CCFollow,CCRepeatForever,CCSpeed。它们的含义如下:
CGPoint point = CGPoint.ccp(300, 150); CCSprite sprite = CCSprite.sprite("bg.img"); CCMoveTo moveTo = CCMoveTo. action(1, point); sprite.runAction(moveTo);
CGPoint point = CGPoint.ccp(300, 150); CCSprite sprite = CCSprite.sprite("bg.img"); CCMoveBy moveBy = CCMoveBy. action(1, point); sprite.runAction(moveBy);
CGPoint point = CGPoint.ccp(300, 150); CCSprite sprite = CCSprite.sprite("bg.img"); CCMoveBy moveBy = CCMoveBy. action(1, point);
<pre name="code" class="java" style="font-size: 16px; orphans: 2; widows: 2;">CCMoveBy moveBy1 = moveBy.reverse() ;sprite.runAction(moveBy);
CCRotateBy scaleBy = CCRotateBy.action(0.2f, 360);//100是顺时针100度 sprite.runAction(scaleBy);第一个参数依然是时间,第二个参数是度数。旋转是顺时针的。可以看demo的第二棵树。
CCScaleBy scaleBy = CCScaleBy.action(0.2f, 1.5f); sprite.runAction(scaleBy);4.跳跃
CGPoint pos = CGPoint.ccp (300, 150); // 跳跃:启动;时间;目标点;高度:实际跳跃的高度(最高点);次数 CCJumpBy jumpBy = CCJumpBy. action(2, pos, 100, 1); CCSprite sprite = getSprite(); sprite.runAction(jumpBy);pos指定最终跳到的点,CCJumpBy.action第一个参数是时间,第二个参数是终点,第三个参数是跳到的高度(最高点),最后一个参数是指跳的次数,由此可见,二连跳就很简单了,只要把1修改为2就可以了。
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);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)));可能上面的代码有几处地方不懂,下面会讲解。先总结下基本的运行方法:
CCScaleBy scaleBy = CCScaleBy.action(0.2f, 1.5f); CCSequence ccSequence = CCSequence. actions(scaleBy, scaleBy.reverse()); CCRepeatForever ccRepeatForever = CCRepeatForever.action(ccSequence); sprite.runAction(ccRepeatForever);接下来我们用以上几个接口来共同实现一个复杂动作,一棵树翻两个跟斗,具体可以看demo的第三棵树。先看代码:
// 跳跃:启动;时间;目标点;高度:实际跳跃的高度(最高点);次数 CCJumpBy jumpBy = CCJumpBy. action(2, pos, 100, 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);CCSpawn让跳和旋转两个动作同时执行,然后调用CCSequence再串联一个回来的动作,调用CCDelayTime停一秒后,再经CCRepeatForever继续循环执行动作。
CCSequence sequence = CCSequence.actions(CCDelayTime.action(1), CCCallFunc.action(this, "loadInfo")); sprite.runAction(sequence);这是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 fileName = "image/loading/loading_%02d.png" ;//用占位符表示图片尾部,格式为两位数,如01,11。 for( int i = 1 ;i <= 9;i++){ CCSprite frame = CCSprite.sprite(String.format(fileName, i)); frames.add(frame.displayedFrame()); } CCAnimation animation = CCAnimation. animation("", 0.2f,(ArrayList<CCSpriteFrame>)frames); CCAnimate animate = CCAnimate.action(animation,false);//false表示只加载一次 bar.runAction(animate);首先加载初始状态。把一系列的精灵转成CCSpriteFrame格式的转入到CCAnimation中,它就会自动播放。fileName中的%2d是规定了两位,d是点位符,传什么数进来就显示什么。比如,传1,就显示01,传11就显示11。最后CCAnmate.action中的false表示只加载一次,即动画只执行一次。如果要循环执行,就把它改为true。