本文共 3271 字,大约阅读时间需要 10 分钟。
提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档
上一章制作了简单的摇杆控制角色的内容(交互和伤害运算放到下一章,由简单到复杂),今天开始做AI逻辑
行为 | 剖析 | 涉及的cc技术 |
---|---|---|
感知 | 感知一定范围闯进来了不同组的对象 | 1.使用碰撞事件,在碰撞进入的时候写代码2.在update方法直接判断距离 |
反应 | 感知进入范围后,执行的动作如跟随追赶等 | 1.使用碰撞的stay方法实现2.update上检查距离实现 |
采取行动 | 进入攻击范围,采取行动 | 运行技能释放逻辑,优先释放适当的技能 |
行动交互 | 双方执行行动后的交互行为如被攻击,防止穿透的反弹等等 | 同上 |
离开 | 闯入的对象离开一定范围,可以执行回到原来初始位置 | 1.碰撞事件end执行 2.update方法检查超过一定距离后执行 |
其实可以复制player的节点架构。然后建立prefab。当然,先砍掉太细的节点,不需要那么复杂的节点,提高下性能。原则如下:
(1)boss类:要绑定动作,可以考虑跟主角一致 (2)高级AI类:只保留可能加载动作的node (3)低级AI类:只保留body和一两个运动的node (4)物体AI类:只保留一个节点,靠碰撞产生伤害在player节点右击复制,然后粘贴,重命名为eneboss,精简下减少性能支出,结果如下。
给rarm、rleg、添加碰撞组件(毕竟动作都是在右边发出,head和body是承受伤害的,你懂…) 添加aijs.js作为组件,方便执行AI逻辑,reacttype:enemy(敌人AI)。最后拖进去prefab文件夹成为prefab
"mapobj" : [{ "sname":"mainMap","type":"enemis","name":"en1","posx":"300","posy":"100","rotation":"0"},...]
添加个距离参数吧
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 },
//碰撞进入执行一次,避免接触后狂执行 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逻辑上面可以作为参考。更多精彩内容请看后面章节,后面再做交互方面的内容:地图阻挡(敌人和角色)、角色互动、角色和敌人互动…
转载地址:http://gpcii.baihongyu.com/