cocos2d-js引擎学习笔记

时间:2023-02-08 19:53:32

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);

原先图片:cocos2d-js引擎学习笔记

经过上述代码处理后的图片:cocos2d-js引擎学习笔记

效果是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,否则没什么意义

闪亮标题案例

cocos2d-js引擎学习笔记

闪亮标题制作代码

        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);

 子弹打靶案例

cocos2d-js引擎学习笔记

代码

    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 来设置,达到类似发光物体的效果。