如果想让一个游戏生动有趣,精灵的操作等相对应的知识就需要深入的学习。
其中一大块的内容就是动作(Action)。
上篇文章我们给精灵添加了一个跳跃的动作,让不会动的精灵跳跃到指定的位置。
这就让精灵看起来很有趣了,下面我们就开始学习吧!!
动作类对象通常不会单独存在。
动作类对象需要作用到精灵、图层等对象上才会发挥作用。
动作类包含很多类型,例如位移,缩放,旋转等;
动作类的分类
CCFiniteTimeAction分为瞬时动作和延时动作。
基础的瞬时动作有CCFlipX(X轴镜像翻转),CCFlipY(Y轴镜像翻转),
CCHide(隐藏),CCShow(显示)等。
//1生成动作对象
CCFlipX plifx = CCFlipX.action(true);
//2使用精灵对象执行动作
player.runAction(plifx);
//filpy和show的方法和这一样
CCHide hide = CCHide.action();
player.runAction(hide );
延时动作有CCMoveTo(移动至目标位置),CCRotateTo(旋转指定角度),
CCScaleTo(缩放至指定倍数),CCBlink(闪烁)等。
CGPoint pos = CGPoint.ccp(400,400);
CCMoveTo moveTo = CCMoveTo.action(3, pos);
player.runAction(moveTo);
CCRotateTo rotateTo = CCRotateTo.action(3, 180);//时间,角度(顺时针)
player.runAction(rotateTo);
其他的大家可以去试试。
游戏中向量的运用;
我们前文中提过CGpoint不仅可以用作点还可以用作向量 CGpoint的向量用法是什么呢 代码
CGPoint point = CGPoint.ccp(100, 100);
player.setPosition(point);
CGPoint deltapoint = CGPoint.ccp(0, 100);
CGPoint apiont = CGPoint.ccpAdd(point, deltapoint);
aplayer.setPosition(apiont);
创建了另一个精灵aplayer 他的位置是在apoint ,apoint是用了cppAdd方法得到的 。
添加到你的代码中看看有神马效果。当然也可以用cppSub试一试向量的减法,cppMult向量的乘法。
基于向量的MoveBy方法的运用
CGPoint movepoint = CGPoint.ccp(50, 50);
CCMoveBy moveBy = CCMoveBy.action(3, movepoint);
player.runAction(moveBy);
我们看到精灵是向着右上方运动而不是向着(50,50)这个点移动。
这就是MoveBy和MoveTo之间的区别。
下面的这几个ACTION不是具体动作而是一个逻辑
CCSequence的使用
代表的是一个队列,可以放很多的动作队形顺序执行。
例如旋转和移动,精灵执行时会先旋转然后移动
CGPoint point = CGPoint.ccp(100, 100);
player.setPosition(point);
CGPoint targetPoint = CGPoint.ccp(300, 300);
CCMoveTo moveTo = CCMoveTo.action(2, targetPoint);
CCRotateTo rotateTo = CCRotateTo.action(2, 180);
CCSequence seq = CCSequence.actions(moveTo, rotateTo);
player.runAction(seq);
当然开可以放进去更多其它的动作。
CCSpawn的使用
可以加入多个对象,不过这个不是顺序的去执行而是一块执行。
同样是移动和旋转,精灵执行时会在移动中旋转。
player = CCSprite.sprite("sprite.png");
CGPoint point = CGPoint.ccp(100, 100);
this.addChild(player);
player.setPosition(point);
CGPoint targetPoint = CGPoint.ccp(300, 300);
CCMoveTo moveTo = CCMoveTo.action(2, targetPoint);
CCRotateTo rotateTo = CCRotateTo.action(2, 180);
CCScaleTo scaleTo = CCScaleTo.action(2, 2);
CCSpawn spawn = CCSpawn.actions(scaleTo, rotateTo,moveTo);
player.runAction(spawn);
CCCallFuncN的使用
一个动画执行完后执行一个回调函数,一般情况下是和CCSequence一起使用。
player = CCSprite.sprite("sprite.png");
CGPoint point = CGPoint.ccp(100, 100);
this.addChild(player);
player.setPosition(point);
CGPoint targetPoint = CGPoint.ccp(300, 300);
CCMoveTo moveTo = CCMoveTo.action(2, targetPoint);
CCRotateTo rotateTo = CCRotateTo.action(2, 180);
CCScaleTo scaleTo = CCScaleTo.action(2, 2);
CCCallFuncN func = CCCallFuncN.action(this, "onActionFinished");
CCSequence seq = CCSequence.actions(moveTo, rotateTo,scaleTo,func);
player.runAction(seq);
public void onActionFinished(){
System.out.println("onActionFinished");
}
CCFollow的使用
一个精灵紧跟着另一个精灵的脚步移动,就是跟随动作。
其它一些动作的使用
CCFadeIn,CCFadeOut淡入淡出动画
player = CCSprite.sprite("sprite.png");
CGPoint point = CGPoint.ccp(100, 100);
this.addChild(player);
player.setPosition(point);
//CCFadeIn,CCFadeOut淡入淡出动画
CCFadeIn fadeIn = CCFadeIn.action(3);
player.runAction(fadeIn);
CCTintTo,CCTintBy颜色变化的动画
player = CCSprite.sprite("sprite.png");
CGPoint point = CGPoint.ccp(100, 100);
this.addChild(player);
player.setPosition(point);
//CCTintTo,CCTintBy颜色变化的动画
ccColor3B color3b = ccColor3B.ccc3(255, 0, 5);
CCTintTo tintTo = CCTintTo.action(3, color3b);
player.runAction(tintTo);
//CCTintBy原来的颜色加上指定的染色
ccColor3B color3b = ccColor3B.ccc3(-255, 250, 5);
CCTintBy tintBy = CCTintBy.action(3, color3b);
player.runAction(tintBy);
CCRepeat重复动画
player = CCSprite.sprite("sprite.png");
CGPoint point = CGPoint.ccp(100, 100);
this.addChild(player);
player.setPosition(point);
CGPoint targetPoint = CGPoint.ccp(400, 400);
CCMoveTo moveTo = CCMoveTo.action(2, targetPoint);
CCMoveTo moveTo2 = CCMoveTo.action(2, point);
CCRotateTo rotateTo = CCRotateTo.action(2, 180);
CCScaleTo scaleTo = CCScaleTo.action(2, 2);
CCCallFuncN func = CCCallFuncN.action(this, "onActionFinished");
CCSequence seq = CCSequence.actions(moveTo, rotateTo,scaleTo,moveTo2,func);
//重复执行3次seq动作
CCRepeat repeat = CCRepeat.action(seq, 3);
player.runAction(repeat);
CCRepeatForever无限重复动作
player = CCSprite.sprite("sprite.png");
CGPoint point = CGPoint.ccp(100, 100);
this.addChild(player);
player.setPosition(point);
CGPoint targetPoint = CGPoint.ccp(400, 400);
CCMoveTo moveTo = CCMoveTo.action(2, targetPoint);
CCMoveTo moveTo2 = CCMoveTo.action(2, point);
CCSequence seq = CCSequence.actions(moveTo, moveTo2);
CCRepeatForever forever = CCRepeatForever.action(seq);
player.runAction(forever);
这些都是在GameLayer中的下面是这个类的全部代码
public class GameLayer extends CCLayer{
//生命一个精灵对象
CCSprite player;
CCSprite aplayer;
public GameLayer(){
//初始化精灵对象
aplayer = CCSprite.sprite("sprite.png");
//将精灵对象添加之布景层当中
//设置精灵对象的位置
//player.setPosition(100, 100);
//CGPoint通常用于表示坐标或者向量
player = CCSprite.sprite("sprite.png");
CGPoint point = CGPoint.ccp(100, 100);
this.addChild(player);
player.setPosition(point);
//CCFadeIn,CCFadeOut淡入淡出动画
//CCFadeIn fadeIn = CCFadeIn.action(3);
//player.runAction(fadeIn);
//CCTintTo,CCTintBy颜色变化的动画
//ccColor3B color3b = ccColor3B.ccc3(-255, 250, 5);
//CCTintBy原来的颜色加上指定的染色值
//CCTintBy tintBy = CCTintBy.action(3, color3b);
//精灵的颜色变为制定值
//CCTintTo tintTo = CCTintTo.action(3, color3b);
//player.runAction(tintBy);
//CCRepeatForever无限重复,CCRepeat重复动画
//CCRepeatForever
CGPoint targetPoint = CGPoint.ccp(100, 400);
CCMoveTo moveTo = CCMoveTo.action(2, targetPoint);
CCMoveTo moveTo2 = CCMoveTo.action(2, point);
CCRotateTo rotateTo = CCRotateTo.action(2, 180);
CCRotateTo rotateTo2 = CCRotateTo.action(2, 360);
CCScaleTo scaleTo = CCScaleTo.action(2, 2);
CCScaleTo scaleTo2 = CCScaleTo.action(2, 1);
CCCallFuncN func = CCCallFuncN.action(this, "onActionFinished");
CCSpawn spawn = CCSpawn.actions(moveTo, rotateTo,scaleTo);
CCSpawn spawn2 = CCSpawn.actions(scaleTo2,rotateTo2,moveTo2);
CCSequence seq = CCSequence.actions(spawn,spawn2,func);
//重复执行3次seq动作
CCRepeat repeat = CCRepeat.action(seq, 3);
player.runAction(repeat);
//CCRepeatForever forever = CCRepeatForever.action(seq);
//player.runAction(forever);
//CCSpawn spawn = CCSpawn.actions(scaleTo, rotateTo,moveTo);
//player.runAction(spawn);
/* CGPoint deltapoint = CGPoint.ccp(0, 100);
CGPoint apiont = CGPoint.ccpAdd(point, deltapoint);
aplayer.setPosition(apiont);*/
/*CGPoint movepoint = CGPoint.ccp(50, 50);
CCMoveBy moveBy = CCMoveBy.action(3, movepoint);
player.runAction(moveBy);*/
/* CGPoint target = CGPoint.ccp(400, 100);
CCJumpTo jumpTo = CCJumpTo.action(1, target, 200, 2);//(动作执行的时间,跳到什么位置,跳多高,跳几次)
//使用精灵对象执行该动作
player.runAction(jumpTo);*/
/*CGPoint pos = CGPoint.ccp(400,400);
CCMoveTo moveTo = CCMoveTo.action(3, pos);
player.runAction(moveTo);
CCRotateTo rotateTo = CCRotateTo.action(5, 180);//时间,角度(顺时针)
aplayer.runAction(rotateTo);
CCBlink blink = CCBlink.action(5, 30);//闪烁间隔,次数
aplayer.runAction(blink);*/
}
public void onActionFinished(){
System.out.println("onActionFinished");
}
}
其中注释的是其它的动作对象,大家可以把注释去掉看看效果