• cocos2d-js引擎学习笔记


    cocos2d-js3.0实用语法

     1      /*初始化继承类*/
     2        var Enemy = cc.Sprite.extend({
     3             hp: 0,
     4             fileName: "enemy.png",
     5             ctor: function (arg) {
     6                 this._super(arg.pic);
     7                 this.hp = arg.hp;
     8             }
     9         });
    10         var enemy1 = new Enemy(100);
    11 
    12      /*动作*/
    13         var anAction = cc.sequence(
    14             cc.moveBy(2,cc.p(100,50)).easing(cc.easeIn(0.3)).repeat(5).speed(1.7),
    15             cc.rotateBy(2,110)
    16         ).repeatForever();
    17 
    18         enemy1.runAction(anAction);
    19 
    20         this.sprite.runAction(
    21             cc.sequence(
    22                 cc.rotateTo(2, 0),
    23                 cc.scaleTo(2, 1, 1)
    24             )
    25         );
    26         helloLabel.runAction(
    27             cc.spawn(
    28                 cc.moveBy(2.5, cc.p(0, size.height - 40)),
    29                 cc.tintTo(2.5,255,125,0)
    30             )
    31         );
    32 
    33      /*menuItem和winSize*/
    34         var size = cc.winSize;
    35 
    36         var closeItem = new cc.MenuItemImage(
    37             res.CloseNormal_png,
    38             res.CloseSelected_png,
    39             function () {
    40                 cc.log("Menu is clicked!");
    41             }, this);
    42         closeItem.attr({
    43             x: size.width - 20,
    44             y: 20,
    45             anchorX: 0.5,
    46             anchorY: 0.5
    47         });
    48 
    49         var menu = new cc.Menu(closeItem);
    50         menu.x = 0;
    51         menu.y = 0;
    52         this.addChild(menu, 1);

    Scale9Sprite

    在用Scale9Sprite.create的时候出现Uncaught TypeError: Cannot call method 'create' of undefined这个错误,

    后来发现在默认情况下,project.json里的modules只自带cocos2d模块,通过检查frameworks/cocos2d-html5/moduleConfig.json,可以看到cocos2d模块里并没有CCScale9Sprite.js这个类。

    它在GUI里,所以可以在modules里添加"GUI"这个模块,或者可以像我这样,在moduleConfig.json里写一个myNeedfulClass这样的模块,里面添加CCScale9Sprite.js这个类,这样只要在modules里添加"myNeedfulClass"就行。有个好处就是可以不用加载GUI里其他的类。测试代码如下

            var tmp = cc.Sprite.create(res.Block9);  
            var theSize = tmp.getContentSize();
            var fullRect = cc.rect(0,0,theSize.width,theSize.height);
            var insetRect = cc.rect(32,32,theSize.width-64,theSize.height-64);
            var scale9sprite = cc.Scale9Sprite.create(res.Block9,fullRect,insetRect);
            scale9sprite.setContentSize(theSize.width*3,theSize.height*2);
            scale9sprite.x  = size.width/2;
            scale9sprite.y = size.height/2;
            this.addChild(scale9sprite);

    原先图片:

    经过上述代码处理后的图片:

    效果是A,B,C,D四个角大小不变,top,bottom俩条边横向拉伸,left,right俩条边纵向拉伸,中间的center既横向又纵向拉伸。

    用在适配的地方比较多,譬如一个BUTTON精灵。

    下面是九宫格精灵用作按钮的代码。

            var size = cc.director.getWinSize();
    
            var tmp = cc.Sprite.create(res.Block9);
            var theSize = tmp.getContentSize();
            var fullRect = cc.rect(0,0,theSize.width,theSize.height);
            var insetRect = cc.rect(32,32,theSize.width-64,theSize.height-64);
            var scale9sprite = cc.Scale9Sprite.create(res.Block9,fullRect,insetRect);
            scale9sprite.setContentSize(theSize.width*2,theSize.height*2);
            var scale9sprite1 = cc.Scale9Sprite.create(res.Block9,fullRect,insetRect);
            scale9sprite1.setContentSize(theSize.width*2,theSize.height*2);
            var scale9sprite2 = cc.Scale9Sprite.create(res.Block9,fullRect,insetRect);
            scale9sprite2.setContentSize(theSize.width*2,theSize.height*2);
    
            var spriteNormal = cc.Sprite.create(res.Block9);
            var spriteSelected = cc.Sprite.create(res.Block9);
            var spriteDisabled = cc.Sprite.create(res.Block9);
            var item = cc.MenuItemSprite.create(scale9sprite, scale9sprite1, scale9sprite2, this.onMenuCallback3, this);
            var menu = cc.Menu.create(item);
            item.x = 100;
            item.y = 100;
            menu.setPosition(0,0);
            this.addChild(menu);

     ClippingNode

    设置模板的时候,模板一定要为有透明度为0的图,譬如PNG,否则没什么意义

    闪亮标题案例

    闪亮标题制作代码

            var size = cc.director.getWinSize();
    
            var clip = cc.ClippingNode.create();                      //创建模板
            var gameTitle = cc.Sprite.create(res.s_GameTitle);
            clip.setStencil(gameTitle);                               //创建标题模板
            clip.setAlphaThreshold(0);                                //给模板设置透明度阈值,这里为了达到标题外没有光晕的效果,模板透明度一定要为0,否则会把所有的光晕加进来,模板就不起作用了
    
            clip.addChild(gameTitle, 1);                             //先添加标题,会完全显示出来,因为跟模板一样大小
            var spark = cc.Sprite.create(res.s_Spark);
            spark.setPosition(-size.width,0);
            clip.addChild(spark,2);                                  //闪亮图片,会被裁减
    
            var moveAction = cc.MoveBy.create(0.6, cc.p(size.width*2, 0));    //闪亮图片做的动作
            var seq = cc.Sequence.create(moveAction, moveAction.reverse());
            var repeatAction = cc.RepeatForever.create(seq);
            spark.runAction(repeatAction);                           //进行左右移动的重复动作
    
            clip.setPosition(cc.p(size.width / 2, size.height / 2));  //clippingNode添加到layer上
            this.addChild(clip,4);

     子弹打靶案例

    代码

        ctor:function () {
            this._super();
            var size = cc.director.getWinSize();
    
            var clip = cc.ClippingNode.create();                  //创建clip节点
            var holes = cc.Node.create();                         //创建模板节点
            clip.setStencil(holes);                               //设置clip节点的模板为holes
            clip.setAlphaThreshold(0);                            //给模板的透明度阈值,因为只要取模板中有像素的部分来裁剪,所以要设置0,否则模板的裁剪效果为整个模板图,包括透明部分。
            clip.setInverted(true);                               //设置反转,显示模板以外的地方。
    
            var ba = cc.Sprite.create(res.s_ba);                  //
            ba.scale =2;
            clip.addChild(ba, 1);                                 //靶加载clip节点上
            clip.setPosition(cc.p(size.width / 4, 100));          //clippingNode添加到layer上
            this.addChild(clip);
    
            var baSize = ba.getContentSize();                     //确定ba在layer中的boundingBox
            var baRect = cc.rect(clip.x-baSize.width/2*ba.scale,clip.y-baSize.height/2*ba.scale,baSize.width*ba.scale,baSize.height*ba.scale);   //因为contentSize不会随scale的变化而变化,所以需要*ba.scale。
    
            if ('mouse' in cc.sys.capabilities )
                cc.eventManager.addListener({
                    event: cc.EventListener.MOUSE,
                    onMouseDown: function (event) {
                        if(cc.rectContainsPoint(baRect,event.getLocation())){
                            event.getCurrentTarget().fire(event.getLocation(),holes,clip);   //参数:1.鼠标点击位置 2.模板节点 3.clip节点
                        }
                    }
                }, this);
    
    
        },
        fire:function(position,nodes,clippingNode){
            var dian = cc.pSub(position,clippingNode.getPosition());  //因为洞和洞的修饰都是add在clip节点上的,所以坐标要进行换算。
    
            var hole = cc.Sprite.create(res.s_moban);     //洞,加在模板节点里
            hole.setPosition(dian);
            nodes.addChild(hole);
    
            var xiushi = cc.Sprite.create(res.s_xiushi);  //洞的修饰,加在clip节点上
            xiushi.setPosition(dian);
            clippingNode.addChild(xiushi,2);
        }

     骨骼动画

            var size = cc.director.getWinSize();
            ccs.armatureDataManager.addArmatureFileInfo(CocoStudio_index);
    
    
            var armature = ccs.Armature.create("DemoPlayer");
            armature.getAnimation().playWithIndex(1);
            armature.attr({
                anchorX:0.5,
                anchorY:0.5,
                scale:0.2,
                x:size.width/2,
                y:size.height/2
            });
            this.addChild(armature);
    
    //以下资源都要添加到g_resources里
    var CocoStudio_index = "res/DemoPlayer/DemoPlayer.ExportJson";
    var ab = "res/DemoPlayer/DemoPlayer0.plist";
    var ac = "res/DemoPlayer/DemoPlayer0.png";
    var ad = "res/DemoPlayer/Comet.plist";

     setBlendFunc

    这个方法其实是跟opengl绘制有关,默认是src:cc.SRC_ALPHA,dst:cc.ONE_MINUS_SRC_ALPHA,意思是如果上层图片的透明度为1,则不显示下层图片。

    为了提亮某张图片,可以用dst=cc.ONE 来设置,达到类似发光物体的效果。

  • 相关阅读:
    树莓派系统安装初始化
    CentOS7搭建配置SVN服务器
    搭建web定时任务管理平台
    Linux 内存清理
    使用kubeadm安装Kubernetes
    Web页面执行shell命令
    解决"libc.so.6: version `GLIBC_2.14' not found"问题
    crontab 任务带日期输出
    Linux 源码安装 Python3
    MongoDB 数据恢复与导出
  • 原文地址:https://www.cnblogs.com/rhythm2014/p/3867976.html
Copyright © 2020-2023  润新知