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 來設置,達到類似發光物體的效果。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM