提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档
上一章制作了简单的摇杆控制角色的内容(交互和伤害运算放到下一章,由简单到复杂),今天开始做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)。
"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逻辑上面可以作为参考。更多精彩内容请看后面章节,后面再做交互方面的内容:地图阻挡(敌人和角色)、角色互动、角色和敌人互动…