COCOS敌人和AI制作

给宝宝做一个cocos免费游戏

第一章 背景和开发框架介绍
第二章 Node树和场景制作
第三章 UI、地图和关卡文本制作
第四章 摇杆、按键和角色动画制作
**第五章 敌人和AI制作**
第六章 角色和敌人行为互动脚本制作
第七章 游戏打包、发布和调试

提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档

COCOS敌人和AI制作

  • 给宝宝做一个cocos免费游戏
  • 前言
  • 一、行为和关联的技术实现
  • 二、具体实现步骤
    • 1.建立enemy的prefab
    • 2.AIJS.JS编写逻辑
      • 2.1添加预载体到Canvas节点的canvasjs.js组件:
      • 2.2 在装地图对象的JSON添加敌人
      • 2.3 在loadMapObj添加散布的方法(上几章预留了)
      • 2.4 在aijs.js添加AI逻辑吧
        • 2.4.1简单粗暴的距离AI逻辑
        • 2.4.2碰撞逻辑
  • 总结


前言

上一章制作了简单的摇杆控制角色的内容(交互和伤害运算放到下一章,由简单到复杂),今天开始做AI逻辑


一、行为和关联的技术实现

行为 剖析 涉及的cc技术
感知 感知一定范围闯进来了不同组的对象 1.使用碰撞事件,在碰撞进入的时候写代码2.在update方法直接判断距离
反应 感知进入范围后,执行的动作如跟随追赶等 1.使用碰撞的stay方法实现2.update上检查距离实现
采取行动 进入攻击范围,采取行动 运行技能释放逻辑,优先释放适当的技能
行动交互 双方执行行动后的交互行为如被攻击,防止穿透的反弹等等 同上
离开 闯入的对象离开一定范围,可以执行回到原来初始位置 1.碰撞事件end执行 2.update方法检查超过一定距离后执行

二、具体实现步骤

1.建立enemy的prefab

其实可以复制player的节点架构。然后建立prefab。当然,先砍掉太细的节点,不需要那么复杂的节点,提高下性能。原则如下:
(1)boss类:要绑定动作,可以考虑跟主角一致
(2)高级AI类:只保留可能加载动作的node
(3)低级AI类:只保留body和一两个运动的node
(4)物体AI类:只保留一个节点,靠碰撞产生伤害

在player节点右击复制,然后粘贴,重命名为eneboss,精简下减少性能支出,结果如下。
COCOS敌人和AI制作_第1张图片
给rarm、rleg、添加碰撞组件(毕竟动作都是在右边发出,head和body是承受伤害的,你懂…)
COCOS敌人和AI制作_第2张图片
添加aijs.js作为组件,方便执行AI逻辑,reacttype:enemy(敌人AI)。
COCOS敌人和AI制作_第3张图片

最后拖进去prefab文件夹成为prefab
COCOS敌人和AI制作_第4张图片

2.AIJS.JS编写逻辑

2.1添加预载体到Canvas节点的canvasjs.js组件:

COCOS敌人和AI制作_第5张图片

2.2 在装地图对象的JSON添加敌人

"mapobj" : [
{"sname":"mainMap","type":"enemis","name":"en1","posx":"300","posy":"100","rotation":"0"},
...
]

2.3 在loadMapObj添加散布的方法(上几章预留了)

COCOS敌人和AI制作_第6张图片

2.4 在aijs.js添加AI逻辑吧

2.4.1简单粗暴的距离AI逻辑

添加个距离参数吧

    properties: {
       reacttype:'guid', //guid-guid文本  dialog-对话 player-用户ai enemy-en的ai story-剧情(文本、动画)
       lv:10001,//章节最大9999个对话 不同的章节用20001 30001...
       feeldistance:200,
       actdistance:100,
       movespeed:3,
        },

update添加监控代码

    update (dt) {
        //通过距离判断
        switch(this.reacttype){
            case 'guid':break;
            case 'dialog':break;
            case 'player':break;
            case 'enemy':break;
                var player = this.node.parent.getChildByName('player');
                var pdis = this.node.position.sub(player.position);//有方向
                if(this.actdistance < pdis.mag() < this.feeldistance){
                      if(pdis > 0) {this.node.x += this.movespeed;} 
                      else if(pdis < 0){this.node.x -= this.movespeed;} //1d x轴运算即可
                }
                if(this.actdistance >= pdis.mag()){ //进入动作范围,可以执行动作攻击
                    //take actions
                      this.takeActions();
                }
                if(pdis.mag() > this.feeldistance){
                    cc.tween(this.node).to(2,{position:this.initpos}); //缓动回归原始位置
                }
            case 'story':break;
        }
    },
    takeActions:function(e){
        //random skill
        var an = this.node.getComponent(cc.Animation);
        var anstatus = this.node.getComponent(cc.Animation).AnimationStatus;
        if(an){an.play('att_lhit');};
        //check free

        //important level
    },

2.4.2碰撞逻辑

    //碰撞进入执行一次,避免接触后狂执行
    onCollisionEnter:function(other,self){
        switch(this.reacttype){
            case 'guid':break;
            case 'dialog':break;
            case 'player':break;
            case 'enemy':
                // -hp
                //action back
                var pdis = self.node.position.sub(other.node.position);
                if(pdis > 0 ){ self.node.setPotision(self.node.x + 3,self.node.y);}
                if(pdis < 0 ){ self.node.setPotision(self.node.x - 3,self.node.y);}
            break;
            case 'story':break;

        }
    },

总结

今天没啥好总结的,所用的技术都是前几章出现的。只是AI逻辑上面可以作为参考。更多精彩内容请看后面章节,后面再做交互方面的内容:地图阻挡(敌人和角色)、角色互动、角色和敌人互动…

你可能感兴趣的:(cocos,cocos2d,cocos2d-js,cocos-creator,游戏开发)