Cocos2d-x《雷电大战》(6) 智能敌机AI来袭–飞行路径算法设计与实现(上)

本文介绍了在Cocos2d-x游戏中,如何设计和实现智能敌机的AI系统,特别是循环出现的两种敌人的飞行路径算法。内容包括调试器的使用和敌人消灭机制的补偿措施。
摘要由CSDN通过智能技术生成

好象掉了单例 算了与cocos2d-x也没关系 最后我加上消灭敌人算补偿?

有两种敌人会定期的循环出现,现个调试器实现

1 资源

var res = {
//...
  AIR3:'res/air3.png',
  AIR4:'res/air4.png',
//....
  };
2 HelloWorldScene.onEnter

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

//....
    //敌人来了
    var  enemyLayer=new Enemy();
    this.addChild(enemyLayer,250);

//....

  }
});

3新的脚本资源project.json

    "jsList" : [
//..
        "src/enemy.js",
//..
    ]


4让我们实现敌人

var Enemy = cc.Layer.extend({
  flyEnemy:function(dt){
    var me=this;
    var newfly=function(sprite,p){
      var tag=this.enemyCount++;

      //加入到场景
      sprite.setPosition(p.x,p.y);
      sprite.setRotation(180);
      sprite.setScale(1.5);
      sprite.setTag(tag);

      this.addChild(sprite);

      //移动到底
      var speed=200;
      var height= sprite.getContentSize().height / 2;
      var duration= (p.y + height) / speed;
      var moveto=new cc.MoveTo(duration, cc.p(p.x,-height));
      sprite.dropMe=me.dropEnemy.bind(sprite);

      var dropMe=new cc.CallFunc(sprite.dropMe,sprite);
      sprite.runAction(new cc.Sequence([moveto,dropMe]));
    };
    var size=cc.winSize;
    var sprite=new cc.Sprite(this.air4SBN.getTexture());
    var spriteSize=sprite.getContentSize();
    newfly.call(me,sprite,cc.p(size.width/2,size.height-spriteSize.height));
    newfly.call(me,new cc.Sprite(this.air4SBN.getTexture()),cc.p(size.width/2-spriteSize.width * 2,size.height+spriteSize.height));
    newfly.call(me,new cc.Sprite(this.air4SBN.getTexture()),cc.p(size.width/2+spriteSize.width * 2,size.height+spriteSize.height));
  },
  dropEnemy:function(){
        var sp=this;
        var tag=sp.getTag();
        sp.removeFromParent();
        cc.log("remove enemy %d",tag);
  },
  newEnemy:function(dt){
    //加一架飞机
    var me=this;
    var enemy=new cc.Sprite(this.air3SBN.getTexture());
    var eid=me.enemyCount++;
    enemy.setRotation(90);
    var y=cc.winSize.height / 3 * 2;
    var x=cc.winSize.width / 2;
    enemy.setPosition(0, y);
    enemy.setScale(0.25);
    enemy.setTag(eid);
    me.addChild(enemy)

    //会动 p1:[250,300],p2:[180,150],p3[0,10]
    var bezierTo=new cc.BezierTo(3,[cc.p(x,y+100),cc.p(x,y / 2 -100),cc.p(0,y / 2)]);
    //会转
    var rotateBy=new cc.RotateBy(3,180);
    //同时
    var spawn=new cc.Spawn(bezierTo,rotateBy);
    //负责销毁自己
    enemy.dropMe=me.dropEnemy.bind(enemy);
    var dropMe=new cc.CallFunc(enemy.dropMe,enemy);

    var sequence=new cc.Sequence([ spawn,dropMe]);
    enemy.runAction(sequence);
  },
  ctor:function(){
    var me=this;
    me._super();

    me.enemyCount=1;
    me.air3SBN=new cc.SpriteBatchNode(res.AIR3);
    me.air3SBN.retain();
    me.air4SBN=new cc.SpriteBatchNode(res.AIR4);
    me.air4SBN.retain();
    //两种敌人
    me.schedule(me.newEnemy,0.5);
    me.schedule(me.flyEnemy,2);
    //ctor中两者都可以使用 onEnter中则只能使用后者了?
    //cc.director.getScheduler().schedule(me.newEnemy,me,0.5);
    return true;
  },

  onExit:function(){
    me.air3SBN.release();
    me.air4SBN.release();
  }

})



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值