当前位置 : 主页 > 手机开发 > 其它 >

Cocos2d-x《雷电大战》(6) 一枪消灭一个侵略者

来源:互联网 收集:自由互联 发布时间:2021-06-13
现在有子弹了有敌机了 所以事情简单了,两者碰撞,都消失,真正做到一枪消灭一个侵略者 先重看一下完整的场景 var HelloWorldScene = cc.Scene.extend({ onEnter:function () { this._super(); //两个背景层

现在有子弹了有敌机了 所以事情简单了,两者碰撞,都消失,真正做到一枪消灭一个侵略者

先重看一下完整的场景

var HelloWorldScene = cc.Scene.extend({
  onEnter:function () {

    this._super();
    //两个背景层
    var layer = new BGLayer(res.BACK4_2,res.BACK4_1,-2);
    this.addChild(layer,100)

    var bg2= new  BGLayer(res.BACK3_1,res.BACK3_2,2);
    this.addChild(bg2,200);
    //敌人来了
    var  enemyLayer=new Enemy();
    this.addChild(enemyLayer,250);

    //可以飞了
    var airLayer=new Airplane();
    this.addChild(airLayer,300);
    airLayer.enemyLayer=enemyLayer;

  }
});

2更完整的airplane,其实与前面相比.只是多了一个update,用于碰撞检测

var Airplane = cc.Layer.extend({
    ctor:function (){
      var me=this;
      me._super();
      var size=cc.winSize;

      me.air=new cc.Sprite(res.AIRPLAN);
      me.air.setPosition(size.width/2,size.height/2);
      me.addChild(me.air);

      me.batchNode=new cc.SpriteBatchNode(res.BULLET1);
      me.batchNode.retain();
      me.bullteId=1;
      me.bullteSpeed=500;

      //有3种风格可以选择
      me.bulletStyle=0; //添加子弹风格,默认为0
      var menu=new cc.Menu(new cc.MenuItemFont("子弹风格",function(sender){
        this.bulletStyle+=1;
        if(this.bulletStyle>2){this.bulletStyle =0}
      },me));
      menu.setPosition(size.width - 100, 15);
      me.addChild(menu)

      cc.eventManager.addListener(cc.EventListener.create({
        event: cc.EventListener.TOUCH_ONE_BY_ONE,
        swallowTouches: true,
        onTouchBegan: me.onTouchBegan.bind(me),
        onTouchMoved: me.onTouchMoved.bind(me),
        onTouchEnded: me.onTouchEnded.bind(me),
      }), me);
      me.schedule(me.fire, 0.5);
      me.scheduleUpdate();
      return true;
    },

    update:function( dt){
      this.enemyLayer.children.forEach(function(enemy){
        this.children.forEach(function(bullet){
          var enemy=this;
          var eRect=enemy.getBoundingBox();
          var bRect=bullet.getBoundingBox();
          //本层中英雄没有tag,子弹有
          if(bullet.getTag()> 0 &&  cc.rectIntersectsRect(eRect,bRect)){
            bullet.removeFromParent();
            enemy.dropMe();
          }
        }.bind(enemy));
      }.bind(this));
    },
    onExit:function(){
      me.batchNode.release();
    },
    fire:function(dt){
      var me=this;
      var point=me.air.getPosition();

      var newbullet=function(px,py,dx){
        var sp=new cc.Sprite(this.batchNode.getTexture());
        sp.setPosition(px,py);
        var bid=this.bullteId++;
        sp.setTag(bid);
        this.addChild(sp,-1);
        var flyLen= cc.winSize.height - py;
        var duration = flyLen / this.bullteSpeed;
        var k= (cc.winSize.height-py)*dx
        var action=new cc.Sequence([
          new cc.MoveTo(duration,cc.p(px + k,cc.winSize.height )),
          new cc.CallFunc(function(bullet,id){
            this.removeChildByTag(id);
          },this,bid)
        ]);
        sp.runAction(action);
    
      }.bind(me);

      var px=point.x;
      var py=point.y + me.air.getContentSize().height + 20;
      switch(me.bulletStyle){
        case 1:
          newbullet(px-10,py,0);
          newbullet(px+10,py,0);
          break;
        case 2:
          newbullet(px-10,py,-0.2);
          newbullet(px,py,0);
          newbullet(px+10,py,0.2);
        default:
          newbullet(px,py,0);
      }
    },
    onTouchBegan:function(touch,e){
      var me=this;
      var size=me.air.getContentSize();
      var rect = cc.rect(0, 0, size.width, size.height);

      var point = me.air.convertToNodeSpace(touch.getLocation());
      if(cc.rectContainsPoint(rect,point)){
        me.started=true;
        return true;
      }
      return false;
    },
    onTouchMoved:function(touch,e){
      var me=this;
      var size=me.air.getContentSize();
      var point = me.convertToNodeSpace(touch.getLocation());
      if(!!me.started){
        var x=point.x;
        var y=point.y;
        var between=function(v,max,min){
          if(v<=min){return min;}
          else if(v >= max){return max;}
          else{return v;}
        };

        me.air.x=between(point.x,cc.winSize.width - size.width /2,size.width / 2);
        me.air.y=between(point.y,cc.winSize.height - size.height / 2,size.height / 2);
      }
    },
    onTouchEnded:function(t,e){
      this.started=false;
    }
});
网友评论