cocos2d-js 开发基础练习代码(2)——使用事件管理器创建用户交互以及cocos精灵帧动画的js使用


cocos2d-js 开发基础练习代码(2)

首先通过使用cc.EventListener.create创建了一个Touch事件监听器touchListener,然后,通过cc.eventManager.addListener注册监听器到事件管理器。cc.EventListener.create扩展出一个用户监听器。event属性,定义这个监听器监听的类型。swallowTouches属性设置是否吃掉事件,事件被吃掉后不会递给下一层监听器。 onTouchBegan方法处理触摸点击按下事件,我们在这里可以获取到触摸点的坐标pos。event.getCurrentTarget()获取当前事件的接受者,并判断当前的是否点击到了SushiSprite。 在touch事件中,我们还可以添加onTouchMoved/onTouchEnded方法监听touch移动和结束的回调。如果onTouchBegan返回false后onTouchMoved/onTouchEnded不会执行。


在onTouchBegan方法中获取点击点的坐标pos,然后通过cc.rectContainsPoint(target.getBoundingBox(),pos)判断点击的点是否在SushiSprite上。

如果我们一张张的从磁盘读取加载,那会非常的慢,还浪费内存资源。还好Cocos2d-JS支持精灵表单(Spritesheet),使用TexturePacker工具,将多张帧图片打包成一张大图和一个.plist文件,通过加载大图可以提高读取速度,并减少内存消耗。Cocos2d-JS中提供了cc.spriteFrameCache管理精灵缓存,通过cc.spriteFrameCache可以方便的读取打包好的大图到内存,根据.plist文件中的信息可以方便获取到各帧图片。 cc.spriteFrameCache.getSpriteFrame(str)方法可以获取到各个精灵帧。

EnemyPlane.js:

/* 创建一个精灵 带有消失动画 :需要为该精灵添加一个属性disappearAction保存消失动画:
    Cocos2d-JS遵循Cocos2d-x的内存管理机制。创建的disappearAction是自动释放的,需要为它
    增加一次引用this.disappearAction.retain(),以避免它被回收,在我们不需要的时候对它执行
    release()方法,释放对它的引用,避免内存泄漏。在使用Cocos2d-JS的jsb模式时,部分情况是需要
    我们手动管理内存的。

    onEnter方法添加:retain();
    onExit方法添加:release();

*/

var SushiSprite = cc.Sprite.extend({
    disappearAction: null,
    onEnter:function() {
        this._super();

        /* 注册响应事件 */
        this.addTouchEventListener();

        /* 保存动画 */
        this.disappearAction = this.createDisapperAction();
        this.disappearAction.retain();
    },

    onExit:function() {

        /* 释放引用一次 */
        this.disappearAction.release();

        this._super();
    },

    /* 添加sprite响应事件 */
    addTouchEventListener:function() {
        this.touchListener = cc.EventListener.create({
            event: cc.EventListener.TOUCH_ONE_BY_ONE,
            //是否吞噬事件
            swallowTouches: true,
            //onTouchBegan event callback function
            onTouchBegan: function(touch, event){

                cc.log("Z.x: Enemy onTouchBegan");

                var pos = touch.getLocation();
                var target = event.getCurrentTarget();

                if(cc.rectContainsPoint(target.getBoundingBox(),pos)){
                    cc.log("Z.x: Enemy is clicked");

                    /*点中后处理逻辑B*/
                    //避免重复点击
                    target.removeTouchEventListenser;

                    target.stopAllActions();

                    var action = target.disappearAction;
                    var seqaction = cc.Sequence.create(action, cc.CallFunc.create(function(){
                        target.removeFromParent();
                    },target));

                    target.runAction(seqaction);

                    /*点中后处理逻辑E*/

                    return true;
                }
                //注意 onTouchBegan有返回值 和 c++类似
                return false;
            }
        });

        cc.eventManager.addListener(this.touchListener,this);
    },

    /* 消失动画 */
    createDisapperAction:function() {
        var frames = [];

        for(var i = 0; i < 6; i++){
            var frameStr = "enemy3_down"+(i+1)+".png";
            var frame = cc.spriteFrameCache.getSpriteFrame(frameStr);

            frames.push(frame);
        }

        var animation = new cc.Animation(frames,0.02);
        var action = new cc.Animate(animation);

        return action;
    }
});

使用如下:基础练习(1)中方法调用

addSushi: function() {

       // var sushi = new cc.Sprite(images_res.GameFlyBody_Image);
       var sushi = new SushiSprite(images_res.GameFlyBody_Image);

        var size = cc.winSize;

        var posX = sushi.width/2 + size.width/2*cc.random0To1();

        sushi.attr({
            x: posX,
            y: size.height - 30
        });

        this .addChild(sushi, 5);
        this.SushiSpritesMgr.push(sushi);

        /* action */
        var dorpAction = cc.MoveTo.create(4,cc.p(sushi.x, -30));
        sushi.runAction(dorpAction);
    },


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值