cocos2d-js 基本动作Action

一、原始动画

DrawNode

drawNode是一个画布节点,可以使用drawNode画出各种各样可以想象出来的轨迹.

var drawNode = new cc.DrawNode();
// drawNode.drawRect();
drawNode.setDrawColor(cc.color(255, 0, 255));
//画圆,参数: (圆心坐标,半径,....)
drawNode.drawCircle(cc.p(size.width / 2, size.height / 2), 50, 30, 30, true);
//画点,参数:(坐标点, 线条粗细程度,颜色)
drawNode.drawDot(cc.p(50,50), 1, cc.color(255, 0, 0));
//画正方形,对角线两个坐标点
drawNode.drawRect(cc.p(0,0), cc.p(100, 100));
this.addChild(drawNode);

二、基本动作

cocos2d-js封装有一些常用的基本动作,下面我们来一一介绍
首先创建一个节点

var size = cc.winSize;

var sprite = new cc.Sprite(res.HelloWorld_png);
sprite.x = size.width / 2;
sprite.y = size.height / 2;
this.addChild(sprite);

//动画时间
var duration = 1;

大部分动作都有一个To方法和By方法,比如moveTo/moveBy,scaleTo/scaleBy等等,他们的区别是什么呢?
To:绝对动作(坐标),相对于最开始的状态所做的动作;
By:相对动作(坐标),相对于当前的状态所做的动作;

移动效果moveTo/moveBy

moveTo/moveBy方法可以使节点Node移动到某个位置.

moveBy
//相对于当前坐标移动point(x, y)
var moveby = cc.moveBy(duration, cc.p( - size.width / 2, - size.height / 2));
sprite.runAction(moveby);
moveTo
//从当前坐标移动到point(x, y)
var moveto = cc.moveTo(duration, cc.p(size.width / 2, size.height / 2));
sprite.runAction(moveto);

缩放效果sacleTo/scaleBy

scaleBy
//根据节点原本大小缩放
//x 为横向拉伸倍数, y为纵向拉伸倍数
var scaleTo = cc.scaleTo(duration, 2, 2);
sprite.runAction(scaleTo);
scaleTo
//根据节点当前大小缩放
//x 为横向拉伸倍数, y为纵向拉伸倍数
var scaleBy = cc.scaleBy(duration, 0.5, 0.5);
sprite.runAction(scaleBy);

旋转效果rotateTo/rotateBy

rotateTo
//相对于节点初始角度(0,0)的旋转
var rotateTo = cc.rotateTo(duration, 30, 30);
sprite.runAction(rotateTo);   
rotateBy
//相对于节点当前角度的旋转
var rotateBy = cc.rotateBy(duration, -30, -30);
sprite.runAction(rotateBy);
例子
//旋转效果
//x 绕x轴旋转的角度
//y 绕y轴旋转的角度
//假设当前节点的角度为(30,30),节点想要运动到(60,60),则可以设置:
var rotateTo = cc.rotateTo(duration, 60, 60);
//或设置:
var rotateBy = cc.rotateBy(duration, 30, 30);

倾斜效果skewTo/skewBy

skewTo
//倾斜效果
//x 绕x轴倾斜的角度
//y 绕y轴倾斜的角度
//相对于节点初始角度的倾斜
var skewTo = cc.skewTo(duration, 0, 0);
sprite.runAction(skewTo);
skewBy
//倾斜效果
//x 绕x轴倾斜的角度
//y 绕y轴倾斜的角度
//相对于节点当前角度的倾斜
var skewBy = cc.skewBy(duration, 60, 60);
sprite.runAction(skewBy);

跳跃移动jumpTo/jumpBy

jumpTo
//以坐标原点为原点,移动到目标坐标
//参数: (时间duration,目标坐标point(x, y), 每次跳跃高度height, 跳跃次数count)
var jumpTo = cc.jumpTo(duration, cc.p(size.width / 2, size.height / 2), 50, 10);
sprite.runAction(jumpTo);
jumpBy
//以当前节点坐标为原点,移动目标坐标距离
//参数: (时间duration,目标坐标point(x, y), 每次跳跃高度height, 跳跃次数count)
var jumpBy = cc.jumpBy(duration, cc.p(size.width / 2 , size.height / 2), 50, 10);
sprite.runAction(jumpBy);

贝塞尔曲线bezierTo/bezierBy

bezierTo
//贝塞尔曲线
//参数:(时间duration, 坐标数组Array)
var pointArray = [cc.p(size.width, size.height),
                  cc.p(size.width, 0),
                  cc.p(0, 0),
                  cc.p(0, size.height),
                  cc.p(size.width / 2, size.height/ 2)];

//To方法运动后不会回到原点
//螺旋向外运动
var bezierTo = cc.bezierTo(duration, pointArray);
sprite.runAction(bezierTo);
bezierBy
//By方法会回到节点开始运动时的位置
var bezierBy = cc.bezierBy(duration, pointArray);
sprite.runAction(bezierBy);

淡入淡出效果fadeTo/fadeIn/fadeOut

fadeTo
//第二个参数为透明度,透明区间(0, 1)
var fadeTo = cc.fadeTo(duration, 0.5);
sprite.runAction(fadeTo);
fadeIn
//淡入效果
var fadeIn = cc.fadeIn(duration);
sprite.runAction(fadeIn);
fadeOut
//淡出效果
var fadeOut = cc.fadeOut(duration);
sprite.runAction(fadeOut);

闪烁效果blink

//闪烁效果
//第二个参数为duration时间内闪烁次数
var blink = cc.blink(duration, 5);
sprite.runAction(blink);

改变色调tintTo

//改变色调效果
var tintTo = cc.tintTo(duration, 255, 127.5, 0);
sprite.runAction(tintTo);

cc.tintTo(duration, r, g, b)方法中,之所以能够改变色调,是因为tintTo方法,将sprite的每一个像素点的R、G、B通道分别做了图像处理;
这里假设原来的像素点的色值是RGB(oldRed, oldGreen, oldBlue),则通过tintTo方法以后:

newRed = oldRed * (r / 255.0);
newGreen = oldGreen * (g / 255.0);
newBlue = oldBlue * (b / 255.0);

假设r=g=b=255.0,则新的RGB通道的颜色相对于旧RGB通道,颜色并没有变化;
假设r=g=b=0,则新的RGB通道的颜色相对于旧RGB通道,变成了RGB(0, 0, 0),颜色为黑色;

延迟执行delayTime

var delayTime = cc.delayTime(duration);

此动作多用于组合动作中,单独使用并无效果

三、组合动作

顺序执行sequence

//顺序执行当前添加的所有动作
var sequence = cc.sequence(moveby, moveto, scaleTo, scaleBy, fadeTo, fadeOut, fadeIn, blink, tintTo,
                        rotateTo, rotateBy, skewBy, skewTo, jumpBy, jumpTo, bezierTo, bezierBy);
sprite.runAction(sequence);

重复repeat/repeatForever

repeat
//重复执行
//参数: (action,执行次数)
var repeat = cc.repeat(sequence, 3);
sprite.runAction(repeat);
repeatForever
//无限重复
var repeatForever = cc.repeatForever(sequence);
sprite.runAction(repeatForever);

同时执行spawn

//spawn 同时执行
var spawn = cc.spawn(moveby, scaleTo, blink, tintTo);
sprite.runAction(spawn);

反向执行reverse/reverseTime

reverseTime

不建议使用

//反向执行
var reverseTime = cc.reverseTime(sequence);
sprite.runAction(reverseTime);
reverse

反向执行只支持基本动作中的By方法,
即:moveBy,scaleBy,rotateBy,jumpBy,skewBy,bezierBy及这几种方法的组合方法,还有fadeIn/fadeOut,blink

//反向执行,基本动作
var reverse = bezierBy.reverse();
var sequence = cc.sequence(bezierBy, reverse);
sprite.runAction(sequence);
//反向执行,组合动作
var sequence1 = cc.sequence(jumpBy, scaleBy, bezierBy, tintTo);
var reverse2 = sequence1.reverse();
var sequence2 = cc.sequence(sequence1, reverse2);
sprite.runAction(sequence2);

不支持To方法,包括fadeTo,tintTo
若使用To方法,则浏览器可能会报错:"Uncaught TypeError: Cannot read property 'x' of undefined"

error.png

结论

直接上代码

var ActionLayer = cc.Layer.extend({
    ctor: function () {
        this._super();

        var size = cc.winSize;

        var sprite = new cc.Sprite(res.HelloWorld_png);
        sprite.x = size.width / 2;
        sprite.y = size.height / 2;
        this.addChild(sprite);

        //动画时间
        var duration = 1;

        //相对于当前坐标移动point(x, y)
        var moveby = cc.moveBy(duration, cc.p( - size.width / 2, - size.height / 2));
        // sprite.runAction(moveby);

        //从当前坐标移动到point(x, y)
        var moveto = cc.moveTo(duration, cc.p(size.width / 2, size.height / 2));
        // sprite.runAction(moveto);

        //根据节点原本大小缩放
        //x 为横向拉伸倍数, y为纵向拉伸倍数
        var scaleTo = cc.scaleTo(duration, 2, 2);
        // sprite.runAction(scaleTo);

        //根据节点当前大小缩放
        var scaleBy = cc.scaleBy(duration, 0.5, 0.5);
        // sprite.runAction(scaleBy);

        //淡入淡出效果
        //第二个参数为透明度,透明区间(0, 1)
        var fadeTo = cc.fadeTo(duration, 0.5);
        // sprite.runAction(fadeTo);

        //淡出效果
        var fadeOut = cc.fadeOut(duration);
        // sprite.runAction(fadeOut);

        //淡入效果
        var fadeIn = cc.fadeIn(duration);
        // sprite.runAction(fadeIn);

        //闪烁效果
        //第二个参数为duration时间内闪烁次数
        var blink = cc.blink(duration, 5);
        // sprite.runAction(blink);

        //改变色调效果
        var tintTo = cc.tintTo(duration, 255, 127.5, 0);
        // sprite.runAction(tintTo);

        //旋转效果
        //x 绕x轴旋转的角度
        //y 绕y轴旋转的角度

        //假设当前节点的角度为(30,30),节点想要运动到(60,60),则可以设置:
        //var rotateTo = cc.rotateTo(duration, 60, 60);
        //或设置:
        //var rotateBy = cc.rotateBy(duration, 30, 30);


        //相对于节点初始角度(0,0)的旋转
        var rotateTo = cc.rotateTo(duration, 30, 30);
        // sprite.runAction(rotateTo);

        //相对于节点当前角度的旋转
        var rotateBy = cc.rotateBy(duration, -30, -30);
        // sprite.runAction(rotateBy);

        //倾斜效果
        //x 绕x轴倾斜的角度
        //y 绕y轴倾斜的角度

        //相对于节点当前角度的倾斜
        var skewBy = cc.skewBy(duration, 60, 60);
        // sprite.runAction(skewBy);

        //相对于节点初始角度的倾斜
        var skewTo = cc.skewTo(duration, 0, 0);
        // sprite.runAction(skewTo);


        //跳跃移动效果
        //参数意义: (时间duration,目标坐标point(x, y), 每次跳跃高度height, 跳跃次数count)

        //以当前节点坐标为原点,移动目标坐标距离
        var jumpBy = cc.jumpBy(duration, cc.p(size.width / 2 , size.height / 2), 50, 10);
        // sprite.runAction(jumpBy);

        //以坐标原点为原点,移动到目标坐标
        var jumpTo = cc.jumpTo(duration, cc.p(size.width / 2, size.height / 2), 50, 10);
        // sprite.runAction(jumpTo);

        //贝塞尔曲线
        //参数:(时间duration, 坐标数组Array)
        var pointArray = [cc.p(size.width, size.height),
                        cc.p(size.width, 0),
                        cc.p(0, 0),
                        cc.p(0, size.height),
                        cc.p(size.width / 2, size.height/ 2)];

        //不会回到原点
        //谁知道它怎么跑的...
        var bezierTo = cc.bezierTo(duration, pointArray);
        // sprite.runAction(bezierTo);

        //会回到节点开始运动时的位置
        var bezierBy = cc.bezierBy(duration, pointArray);
        // sprite.runAction(bezierBy);

        //////////////////////////////////////////////////////////////////////////////////
        //////////////////////////////////////组合动作//////////////////////////////////////
        //////////////////////////////////////////////////////////////////////////////////
        //顺序执行当前添加的所有动作
        var sequence = cc.sequence(moveby, moveto, scaleTo, scaleBy, fadeTo, fadeOut, fadeIn, blink, tintTo,
                        rotateTo, rotateBy, skewBy, skewTo, jumpBy, jumpTo, bezierTo, bezierBy);
        // sprite.runAction(sequence);

        //重复执行
        //action,执行次数
        var repeat = cc.repeat(sequence, 3);
        // sprite.runAction(repeat);

        //无限重复
        var repeatForever = cc.repeatForever(sequence);
        // sprite.runAction(repeatForever);
        // //反向执行一次
        // var reverseTime = cc.reverseTime(sequence);
        // sprite.runAction(reverseTime);
        //spawn 同时执行
        var spawn = cc.spawn(moveby, scaleTo, blink, tintTo);
        // sprite.runAction(spawn);

        //反向执行
        //反向执行只支持基本动作中的By方法,
        // 即:moveBy,scaleBy,rotateBy,jumpBy,skewBy,bezierBy及这几种方法的组合方法,还有fadeIn/fadeOut,blink
        //不支持To方法,包括fadeTo,tintTo
        //若使用To方法,则浏览器可能会报错:"Uncaught TypeError: Cannot read property 'x' of undefined"
        // var reverse = bezierBy.reverse();
        // var sequence3 = cc.sequence(bezierBy, reverse);
        // sprite.runAction(sequence3);

        var sequence1 = cc.sequence(jumpBy, scaleBy, bezierBy, tintTo);
        var reverse2 = sequence1.reverse();
        var delayTime = cc.delayTime(duration);
        var sequence2 = cc.sequence(sequence1, delayTime, reverse2);
        sprite.runAction(sequence2);




        return true;
    }
});

暂时先写这么多,组合动作回头再加

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

推荐阅读更多精彩内容

  • 通过jQuery,您可以选取(查询,query)HTML元素,并对它们执行“操作”(actions)。 jQuer...
    枇杷树8824阅读 648评论 0 3
  • 工具介绍:apktool作用:资源文件获取,可以提取出图片文件和布局文件进行使用查看dex2jar作用:将apk反...
    aserbao阅读 899评论 3 7
  • 那国外的谁谁谁曾经说过:天才自有出路,笨蛋无可救药。于是他得出结论,教育的重点是中间这部分人。天才和笨蛋都是少数,...
    最大的野心是自由地生活阅读 399评论 0 1
  • 由于一个偶像,开始一部电影, 由于几句台词,引发些许感悟! 方木,影片中的主人公,擅长心理分析的...
    LY冰千仪阅读 429评论 0 1