cocoscreator怪物实时寻路AI

news2024/11/28 14:41:02

这章主要介绍怪物AI
1:环境
cococreator2.4.*

2:规则
当前规则很简单,就是跳上,跳下 一个土块

3:上代码

// Learn cc.Class:
//  - https://docs.cocos.com/creator/manual/en/scripting/class.html
// Learn Attribute:
//  - https://docs.cocos.com/creator/manual/en/scripting/reference/attributes.html
// Learn life-cycle callbacks:
//  - https://docs.cocos.com/creator/manual/en/scripting/life-cycle-callbacks.html

var MoveDir = require('utils');

cc.Class({
    extends: cc.Component,

    properties: {
        // foo: {
        //     // ATTRIBUTES:
        //     default: null,        // The default value will be used only when the component attaching
        //                           // to a node for the first time
        //     type: cc.SpriteFrame, // optional, default is typeof default
        //     serializable: true,   // optional, default is true
        // },
        // bar: {
        //     get () {
        //         return this._bar;
        //     },
        //     set (value) {
        //         this._bar = value;
        //     }
        // },

        curdir:{
            type:cc.Enum(MoveDir),
            default:MoveDir.DIR_X_SUB,
        },
        curmovespeed:32,  //1秒64 pix
        basejumpheight:128,
        curstate:0, // 0 idle, 1 walk  2 jump  3 work
        curpos:null,
        jumppos:null,
        curdt:0.0,
        node:null,
        modelgridwidth:0,
        modelgridheight:0,
        modelwidth:0,
        modelheight:0,

      //  delaycurdis:0,//pix
      //  delayopr:[0,0,0,0],//opr, disx,disy,jumpheight
        
    },

    // LIFE-CYCLE CALLBACKS:

     onLoad () {
        if(this.curstate == 1){
           let t1 =  this.node.getComponent(dragonBones.ArmatureDisplay);
           t1.playAnimation('walk', 0);
           this.checknextstep_20231019();
        }

     },

    start () {

    },

    update (dt) {
        const mingep = 0.02;
        this.curdt += dt ;
        if(this.curdt < mingep){
            return  ;
        }
        switch(this.curstate){
            case 0://idle 
            break;
            case 1:{ //walk
                this.walk(this.curdt);
                this.checknextstep_20231019();
            }
            break;
            case 2:{ //jump

            }
            break;
            case 3:{ //work
            
            }
            break;
            case 4://walk before jump 跳前的移动
            {
              this.walk(this.curdt);
            }
            break;
        }
       
        this.curdt = 0.0 ;
     },

     getparamsbydir:function(){
        switch(this.curdir){//{MIN,MAX}
            case MoveDir.DIR_X_ADD: return  [1,0 ]; break;
            case MoveDir.DIR_Y_ADD: return  [0,1] ; break;
            case MoveDir.DIR_X_SUB: return  [-1,0] ; break;
            case MoveDir.DIR_Y_SUB: return  [0,-1] ; break;
        }
        return [0,0];
     },

     changedir:function(){
        switch(this.curdir){
            case MoveDir.DIR_X_ADD: {this.curdir = MoveDir.DIR_X_SUB;this.node.scaleX = -this.node.scaleX;} break;
            case MoveDir.DIR_Y_ADD:{this.curdir = MoveDir.DIR_Y_SUB; this.node.scaleY = -this.node.scaleY; }break;
            case MoveDir.DIR_X_SUB:{this.curdir = MoveDir.DIR_X_ADD; this.node.scaleX = -this.node.scaleX;}break;
            case MoveDir.DIR_Y_SUB:{this.curdir = MoveDir.DIR_Y_ADD; this.node.scaleY = -this.node.scaleY;}break; 
        }
      

      //  this.node.scaleX = -this.node.scaleX; //左右翻转  scaleX Number 节点 X 轴缩放
     },

     walkandjump:function(usebodywidthpix,disx,disy,height){
        let [dirx,diry] = this.getparamsbydir();
        let t = usebodywidthpix/this.curmovespeed ;
        ///
        var arr = [];
        arr.push(cc.spawn(cc.moveBy(t, cc.v2(usebodywidthpix*dirx, 0)),cc.callFunc(function(){
          this.node.getComponent(dragonBones.ArmatureDisplay).playAnimation('walk', 0);
      },this)) );

    //   arr.push(cc.spawn(cc.delayTime(0.2),cc.callFunc(function(){
    //     this.node.getComponent(dragonBones.ArmatureDisplay).playAnimation('idle', 0);
    // },this)) );

      arr.push(cc.spawn(cc.jumpBy(0.8, disx, disy,height,1).easing(cc.easeCubicActionOut()),cc.callFunc(function(){
        this.node.getComponent(dragonBones.ArmatureDisplay).playAnimation('jump', 0);
    },this)) );

    arr.push(cc.callFunc(this.jumpEndAnimation, this));

     var act = cc.sequence(arr);
      this.node.runAction(act);
      this.curstate = 2 ; //jump
      //
      //  var actionTo = cc.moveBy(t, cc.v2(usebodywidthpix*dirx, 0));//.easing(cc.easeCubicActionOut());

      //  var walkAnimationCallBack = cc.callFunc(this.jumpEndAnimation, this);

      //   var actionJumpTO = cc.jumpBy(0.8, disx, disy,height,1).easing(cc.easeCubicActionOut()); //targetx 移动距离  targety 移动距离   jump高度  次数

      //   var tiaoAnimationCallBack = cc.callFunc(this.jumpEndAnimation, this);
      //   var animationQueue = cc.sequence(actionTo,actionJumpTO,tiaoAnimationCallBack);
      //   this.node.runAction(animationQueue)   //调用
      //   this.node.getComponent(dragonBones.ArmatureDisplay).playAnimation('walk', 0);
      //   this.curstate = 2 ; //jump

        /
      //   setJumpAction:function(){
      //     //跳跃上升
      //     var jumpUp=cc.moveBy(this.jumpDuration,cc.v2(0,this.jumpHeight)).easing(cc.easeCubicActionOut());
      //     //下落
      //     var jumpDown=cc.moveBy(this.jumpDuration,cc.v2(0,-this.jumpHeight)).easing(cc.easeCubicActionOut());
      //     //不断重复
      //     return cc.repeatForever(cc.sequence(jumpUp,jumpDown));
      // },
        
        
     },

     jumpanimation:function(){
      this.node.getComponent(dragonBones.ArmatureDisplay).playAnimation('jump', 0);
     },

     //跳结束动画 
    walkEndAnimation:function(){

      this.node.getComponent(dragonBones.ArmatureDisplay).playAnimation('jump', 0);
      this.curstate = 2 ; //walk
    //  let t1 =  this.node.getComponent(dragonBones.ArmatureDisplay);
     // t1.playAnimation('walk', 0);
   //   this.checknextstep();

  },

     jump:function(disx,disy,height){
        //向上移动
     //   var actionJumpTO = cc.jumpBy(2, -64, 128,128,1);
        var actionJumpTO = cc.jumpBy(0.8, disx, disy,height,1).easing(cc.easeCubicActionOut());; //targetx 移动距离  targety 移动距离   jump高度  次数
       // //向下移动
      //  var moveDown = cc.moveTo(0.7, cc.v2(-255, -152)).easing(cc.easeCubicActionIn());

        var tiaoAnimationCallBack = cc.callFunc(this.jumpEndAnimation, this);
        var animationQueue = cc.sequence(actionJumpTO,tiaoAnimationCallBack);
        this.node.runAction(animationQueue)   //调用
        this.node.getComponent(dragonBones.ArmatureDisplay).playAnimation('jump', 0);
        this.curstate = 2 ; //jump
     },

     //搞不定 目标坐标
     jumpto:function(gepsec,targetx,targety,height){
        //向上移动
     //   var actionJumpTO = cc.jumpBy(2, -64, 128,128,1);
        var actionJumpTO = cc.jumpto(gepsec, targetx, targety,height,1); //targetx 移动距离  targety 移动距离   jump高度  次数
       // //向下移动
      //  var moveDown = cc.moveTo(0.7, cc.v2(-255, -152)).easing(cc.easeCubicActionIn());

        var tiaoAnimationCallBack = cc.callFunc(this.jumpEndAnimation, this);
        var animationQueue = cc.sequence(actionJumpTO,tiaoAnimationCallBack);
        this.node.runAction(animationQueue)   //调用
        this.node.getComponent(dragonBones.ArmatureDisplay).playAnimation('jump', 0);
        this.curstate = 2 ; //jump
     },

     idle:function(delay,changedir){
        let t1 = this.node.getComponent(dragonBones.ArmatureDisplay);
        t1.playAnimation('idle', 0);
        this.curstate = 0 ; //idle
 
      //  const ms1 = new Date().getTime();
      //  console.log(ms1+" idle "+ t1.animationName);
        if(!!delay && !!changedir){
          var self = this;
           setTimeout(()=>{
            self.changedir();
              //  const ms2 = new Date().getTime();
             //   console.log(ms2+" walk");
                self.node.getComponent(dragonBones.ArmatureDisplay).playAnimation('walk', 0);
                self.curstate = 1 ; //jump
            }, delay*1000);
        }
     },

     //跳结束动画 
    jumpEndAnimation:function(){

      // var self = this;
      // self.node.getComponent(dragonBones.ArmatureDisplay).playAnimation('idle', 0);
      // self.curstate = 0;
      // setTimeout(()=>{
      //   self.node.getComponent(dragonBones.ArmatureDisplay).playAnimation('walk', 0);
      //   self.curstate = 1 ; //walk
      // }, 300);

         this.node.getComponent(dragonBones.ArmatureDisplay).playAnimation('walk', 0);
        this.curstate = 1 ; //walk
   
     //   this.checknextstep();

    },

    walk:function(dt){
        //由于Math函数接受的是孤度,所以我们先节节点的旋转转化为弧度
        // var angle = node.rotation / 180 * Math.PI;
        // //合成基于 X正方向的方向向量
        // var dir = cc.v2(Math.cos(angle),Math.sin(angle));
        // //单位化向量
        // dir.normalizeSelf();

        // //根据方向向量移动位置
        // var moveSpeed = -32;
        // node.x += dt * dir.x * moveSpeed;
        // node.y += dt * dir.y * moveSpeed; 直径 30CM  总高不到 70cm  自重17 KG

        // switch(this.curidr){
        //     case MoveDir.DIR_X_ADD:// 
        //     case MoveDir.DIR_Y_ADD:// 
        //     case MoveDir.DIR_X_SUB:// 
        //     case MoveDir.DIR_Y_SUB:// 
        //     break;
        // }
       // let t1 = this.getparamsbydir();
        if(dt > 1){
          dt = 1;
        }
        let [dirx,diry] = this.getparamsbydir();
        let newx = this.node.x + dt * dirx * this.curmovespeed;
        let newy = this.node.y + dt * diry * this.curmovespeed;
        this.node.x = Math.floor(newx) ;
        this.node.y = Math.floor(newy) ;

    },

    checknextstep_1:function(){
        if(this.curstate != 1) return ;
        let [dirx,diry] = this.getparamsbydir();
        let worldpos =  this.node.parent.convertToWorldSpaceAR(new cc.Vec2(this.node.x, this.node.y)); //convertToWorldSpaceAR
        let [gridx,gridy] = cc.map_js.getgridbypix(worldpos.x,worldpos.y);
        let nextgridx = gridx+1*dirx ;
        let newxgridy = gridy+1*diry ;

      //  let newx = worldpos.x + 2* dirx * this.curmovespeed;
      //  let newy = worldpos.y + 2 * diry * this.curmovespeed;
      const basegridsize = cc.map_js.getbasegridsize();
     // let bodywidthpix = this.modelgridwidth*basegridsize /2 ;
    //  let bodyheightpix = this.modelgridheight*basegridsize /2 ;

      let bodywidthpix = Math.ceil(this.modelwidth/2) ; //floor  向下取整  ceil 向上取整
      let bodyheightpix = Math.ceil(this.modelheight/2);

      let usebodywidthpix = bodywidthpix;//Math.min(bodywidthpix,basegridsize) ;//bodywidthpix;//

      let newx = worldpos.x + dirx * usebodywidthpix;
      let newy = worldpos.y + diry * bodyheightpix ;
      const mapwidth = cc.map_js.getmapwidth()
      const mapheight = cc.map_js.getmapheight()
      if(newx < 1  || newy < 1  || newx+1 >= mapwidth* basegridsize  || newy+1 >= mapheight* basegridsize){ //到边缘了
        this.idle(3,true);
        return ;
      }

      //  let gridx,gridy = cc.map_js.getgridbypix(worldpos.x,worldpos.y);
        let [newgridx,newgridy] = cc.map_js.getgridbypix(newx,newy);
        if(gridx != newgridx || gridy != newgridy){  //跨格子了
            let [nextopr,disx,disy] =  cc.map_js.findnextstep_x_jump_2_grid(newgridx,newgridy,dirx); //iscanwalk(newgridx,newgridy,dirx,diry)
            if(nextopr ==  0){
                return this.idle(2,true);
            }else if(nextopr == 2){
                //需要jump
               // let absdis = Math.abs(disy)*basegridsize ;
                let [jumpx,jumpy] = cc.map_js.getpixbygrid(gridx+disx,gridy+disy) //node worldpos 576 128
              //  let jumplocalpos =  this.node.getParent().convertToNodeSpaceAR(new cc.v2(jumpx+bodywidthpix, jumpy));
              //  this.jump(jumplocalpos.x-this.node.x+dirx*basegridsize,jumplocalpos.y-this.node.y,jumplocalpos.y>this.node.y?64:64);
              // let jumplocalpos =  this.node.getParent().convertToNodeSpaceAR(new cc.v2(jumpx+bodywidthpix, jumpy));
              // this.jump(jumplocalpos.x-this.node.x+dirx*basegridsize,jumplocalpos.y-this.node.y,jumplocalpos.y>this.node.y?64:32);

              
              let jumplocalpos =  this.node.getParent().convertToNodeSpaceAR(new cc.v2(jumpx, jumpy));//+usebodywidthpix
             // this.jump(jumplocalpos.x-this.node.x+dirx*basegridsize,jumplocalpos.y-this.node.y,jumplocalpos.y>this.node.y?64:32);//+dirx*basegridsize
             this.jump(jumplocalpos.x-this.node.x+dirx*basegridsize,jumplocalpos.y-this.node.y,jumplocalpos.y>this.node.y?64:32);
            //  if(dirx >= 0){
            //   this.jump(jumplocalpos.x-this.node.x+dirx*bodywidthpix+appendpix,jumplocalpos.y-this.node.y,jumplocalpos.y>this.node.y?64:32);
            //  }else{
            //   this.jump(jumplocalpos.x-this.node.x+dirx*basegridsize+appendpix,jumplocalpos.y-this.node.y,jumplocalpos.y>this.node.y?64:32);
            //  }
              
            }
        }else{
            //保持原有状态
        }
    },

    checknextstep_20231018:function(){
      //瞄点  x 0  往右移 半个 width  1  左移 半个   y   1向下移 半个高度   0 上移半个高度
      if(this.curstate != 1) return ;  
      let [dirx,diry] = this.getparamsbydir();
      let worldpos =  this.node.parent.convertToWorldSpaceAR(new cc.Vec2(this.node.x, this.node.y)); //convertToWorldSpaceAR
      let [gridx,gridy] = cc.map_js.getgridbypix(worldpos.x,worldpos.y);
      let nextgridx = gridx+1*dirx ;
      let newxgridy = gridy+1*diry ;

    //  let newx = worldpos.x + 2* dirx * this.curmovespeed;
    //  let newy = worldpos.y + 2 * diry * this.curmovespeed;
    const basegridsize = cc.map_js.getbasegridsize();
   // let bodywidthpix = this.modelgridwidth*basegridsize /2 ;
  //  let bodyheightpix = this.modelgridheight*basegridsize /2 ;

    let bodywidthpix = Math.ceil(this.modelwidth/2) ; //floor  向下取整  ceil 向上取整
    let bodyheightpix = Math.ceil(this.modelheight/2);

    let usebodywidthpix = Math.min(bodywidthpix,basegridsize) ;//bodywidthpix;//

    let newx = worldpos.x + dirx * usebodywidthpix;
    let newy = worldpos.y + diry * bodyheightpix ;
    const mapwidth = cc.map_js.getmapwidth()
    const mapheight = cc.map_js.getmapheight()
    if(newx < 1  || newy < 1  || newx+1 >= mapwidth* basegridsize  || newy+1 >= mapheight* basegridsize){ //到边缘了
      this.idle(3,true);
      return ;
    }

    //  let gridx,gridy = cc.map_js.getgridbypix(worldpos.x,worldpos.y);
      let [newgridx,newgridy] = cc.map_js.getgridbypix(newx,newy);
      if(gridx != newgridx || gridy != newgridy){  //跨格子了
          let [nextopr,disx,disy] =  cc.map_js.findnextstep_x_jump_2_grid(newgridx,newgridy,dirx); //iscanwalk(newgridx,newgridy,dirx,diry)
          if(nextopr ==  0){
              return this.idle(2,true);
          }else if(nextopr == 2){
              //需要jump
             // let absdis = Math.abs(disy)*basegridsize ;
              let [jumpx,jumpy] = cc.map_js.getpixbygrid(gridx+disx,gridy+disy) //node worldpos 576 128
            //  let jumplocalpos =  this.node.getParent().convertToNodeSpaceAR(new cc.v2(jumpx+bodywidthpix, jumpy));
            //  this.jump(jumplocalpos.x-this.node.x+dirx*basegridsize,jumplocalpos.y-this.node.y,jumplocalpos.y>this.node.y?64:64);
            // let jumplocalpos =  this.node.getParent().convertToNodeSpaceAR(new cc.v2(jumpx+bodywidthpix, jumpy));
            // this.jump(jumplocalpos.x-this.node.x+dirx*basegridsize,jumplocalpos.y-this.node.y,jumplocalpos.y>this.node.y?64:32);

            
            let jumplocalpos =  this.node.getParent().convertToNodeSpaceAR(new cc.v2(jumpx, jumpy));//+usebodywidthpix
           // this.jump(jumplocalpos.x-this.node.x+dirx*basegridsize,jumplocalpos.y-this.node.y,jumplocalpos.y>this.node.y?64:32);
            let jumpdir = disy >=0?1:(disy==0?0:-1);
            switch(jumpdir){
              case -1:{
                let defaultpix = basegridsize;
                  if(dirx < 0) defaultpix /= 2 ;
                  this.jump(jumplocalpos.x-this.node.x+dirx*(bodywidthpix+defaultpix),jumplocalpos.y-this.node.y,bodyheightpix);
              }
              break;
              case 0:{
                this.jump(jumplocalpos.x-this.node.x+dirx*basegridsize,jumplocalpos.y-this.node.y,jumplocalpos.y>this.node.y?64:32);
              } break;
              case 1:{
                this.jump(jumplocalpos.x-this.node.x+dirx*bodywidthpix,jumplocalpos.y-this.node.y,jumplocalpos.y>this.node.y?64:32);
              }
              break;
            }
            
          }
      }else{
          //保持原有状态
      }
  },
  checknextstep_20231019:function(){
    //瞄点  x 0  往右移 半个 width  1  左移 半个   y   1向下移 半个高度   0 上移半个高度
    if(this.curstate != 1) return ;  
    let [dirx,diry] = this.getparamsbydir();
    let worldpos =  this.node.parent.convertToWorldSpaceAR(new cc.Vec2(this.node.x, this.node.y)); //convertToWorldSpaceAR
    let [gridx,gridy] = cc.map_js.getgridbypix(worldpos.x,worldpos.y);
    let nextgridx = gridx+1*dirx ;
    let newxgridy = gridy+1*diry ;

    const basegridsize = cc.map_js.getbasegridsize();

    let bodywidthpix = Math.ceil(this.modelwidth/2) ; //floor  向下取整  ceil 向上取整
    let bodyheightpix = Math.ceil(this.modelheight/2);

    
    const mapwidth = cc.map_js.getmapwidth()
    const mapheight = cc.map_js.getmapheight()

    const halfmodelcount =  bodywidthpix > basegridsize ? 2:1;

    const usebodywidthpix = Math.min(bodywidthpix,basegridsize) ;//bodywidthpix;//
    
    const edge_x = worldpos.x + dirx * usebodywidthpix;
  // let edge_y = worldpos.y + diry * bodyheightpix ;
    
    if(edge_x < 1  || edge_x+1 >= mapwidth* basegridsize ){ //到边缘了 //只需要检查X 方向  || edge_y < 1 || edge_y+1 >= mapheight* basegridsize
      this.idle(3,true);
      return ;
    }

    let newx = worldpos.x + dirx * usebodywidthpix; //当前最多跨1格
    let newy = worldpos.y ;//+ diry * bodyheightpix ;

  //  let gridx,gridy = cc.map_js.getgridbypix(worldpos.x,worldpos.y);
    let [newgridx,newgridy] = cc.map_js.getgridbypix(newx,newy); //世界坐标变为格子坐标
    if(gridx != newgridx || gridy != newgridy){  //跨格子了
        let [nextopr,disx,disy] =  cc.map_js.findnextstep_x_jump_2_grid_bigmodel(newgridx,newgridy,dirx,halfmodelcount); //findnextstep_x_jump_2_grid
        if(nextopr ==  0){
            return this.idle(2,true);
        }else if(nextopr == 2){
            //需要jump
            let [jumpx,jumpy] = cc.map_js.getpixbygrid(gridx+disx,gridy+disy) //node worldpos 576 128
          //  let jumplocalpos =  this.node.getParent().convertToNodeSpaceAR(new cc.v2(jumpx+bodywidthpix, jumpy));
          //  this.jump(jumplocalpos.x-this.node.x+dirx*basegridsize,jumplocalpos.y-this.node.y,jumplocalpos.y>this.node.y?64:64);
          // let jumplocalpos =  this.node.getParent().convertToNodeSpaceAR(new cc.v2(jumpx+bodywidthpix, jumpy));
          // this.jump(jumplocalpos.x-this.node.x+dirx*basegridsize,jumplocalpos.y-this.node.y,jumplocalpos.y>this.node.y?64:32);

          
          let jumplocalpos =  this.node.getParent().convertToNodeSpaceAR(new cc.v2(jumpx, jumpy));//+usebodywidthpix
        //  this.jump(jumplocalpos.x-this.node.x+dirx*basegridsize,jumplocalpos.y-this.node.y,jumplocalpos.y>this.node.y?64:32);
         // this.walkandjump(usebodywidthpix,jumplocalpos.x-this.node.x,jumplocalpos.y-this.node.y,jumplocalpos.y>this.node.y?64:32);
          if(disy < 0 && dirx > 0){
            this.walkandjump(usebodywidthpix,jumplocalpos.x-this.node.x+dirx*usebodywidthpix,jumplocalpos.y-this.node.y,jumplocalpos.y>this.node.y?64:32);
          }else {
            let appendpix = 0;
            if(dirx > 0 && usebodywidthpix < basegridsize){
              appendpix = Math.floor(usebodywidthpix/2) ;
            }
            this.jump(jumplocalpos.x-this.node.x+dirx*usebodywidthpix+appendpix,jumplocalpos.y-this.node.y,jumplocalpos.y>this.node.y?64:32);
          }
          // let jumpdir = disy >=0?1:(disy==0?0:-1);
          // switch(jumpdir){
          //   case -1:{
          //     let defaultpix = basegridsize;
          //       if(dirx < 0) defaultpix /= 2 ;
          //       this.jump(jumplocalpos.x-this.node.x+dirx*(bodywidthpix+defaultpix),jumplocalpos.y-this.node.y,bodyheightpix);
          //   }
          //   break;
          //   case 0:{
          //     this.jump(jumplocalpos.x-this.node.x+dirx*basegridsize,jumplocalpos.y-this.node.y,jumplocalpos.y>this.node.y?64:32);
          //   } break;
          //   case 1:{
          //     this.jump(jumplocalpos.x-this.node.x+dirx*bodywidthpix,jumplocalpos.y-this.node.y,jumplocalpos.y>this.node.y?64:32);
          //   }
          //   break;
          // }
          
        }
    }else{
        //保持原有状态
    }
},
    born:function(x,y,dir,movespeed,jumpheigth){
        this.curpos = cc.v2(x,y);
        this.node.setPosition(x,y); //(i *128+128, -192);
      //  this.node.rotationY  = 90;  //rotationY
      //  this.node.scaleX = -this.node.scaleX; //左右翻转  scaleX Number 节点 X 轴缩放
        if(!!dir){
            this.curdir = dir ;
        }
      //  this.curmovespeed = 64;
        if(!!movespeed){
            this.curmovespeed = movespeed;
        }
        if(!!jumpheigth){
            this.basejumpheight = jumpheigth ;
        }


        this.modelwidth = this.node.width ;
        this.modelheight = this.node.height ;
        const basegridsize = cc.map_js.getbasegridsize();
        
        this.modelgridwidth = Math.floor((this.modelwidth+ basegridsize -1)/basegridsize);
        this.modelgridheight= Math.floor((this.modelheight+ basegridsize -1)/basegridsize);

     //   let t1= this.node.getComponent(dragonBones.ArmatureDisplay);
     //   t1.playAnimation('walk', 0);
       // t1._animationName = 
        //this.node.getComponent(dragonBones.ArmatureDisplay).playAnimation('walk', 0);
      //  t1.node.getComponent(dragonBones.ArmatureDisplay).playAnimation('walk', 0);
        this.curstate = 1; //walk
    //    this.checknextstep();
        //将红色方块局部位置转成世界位置
        // var worldPos = this.red.parent.convertToWorldSpaceAR(new cc.Vec2(this.red.x, this.red.y));
        // console.log(worldPos);  //(690,470)

      //  let t1 =  this.node.getComponent(dragonBones.ArmatureDisplay);
      //  let t3 = t1.armature();
      //  let t2 = t1._armature.getSlot("hand_l");
      //  console.log("11");

        //龙骨工厂实例
// let factory = dragonBones.CCFactory.getInstance();
// //通过插槽名称获取需要改变的骨骼插槽
// let needChangeSlot = needChangeArmature.armature().getSlot("changeSlotName");
// //替换插槽显示(需要改变的骨骼数据值,骨骼名称,插槽名称,显示名称,需要改变的插槽)
// factory.replaceSlotDisplay(toChangeArmature.getArmatureKey(), "armatureName", "slotName", "displayName", needChangeSlot);
        
    },

    findnextgrid:function(){
        //先知管X 方向
        const  maxgriddis  = 2 ; //最大2格 //后面可以传参数进来
        if(x>= 0 && x< this.groupwidth && y>= 0 && y<this.groupheight){
            
            if(y== 0){
                if(this.ground[y][x] ==0){
                    return [1,0,0];
                }
                return [0,0,0];
            }else if(this.ground[y][x] ==0 ){
                if(this.ground[y-1][x] == 1){
                    return [1,0,0];
                }else{

                }
               
            }else if(this.ground[y][x] ==0 ){}
            // if(this.ground[y][x] ==0  ){
            //     if(y == 0 ) return 1 ;
            //     if(this.ground[y-1][x] == 1){
            //         return  1; //可以走
            //     }else {
            //         //需要跳下 或飞几格
                    
            //     }
            // }
        }
        return [0,0,0];
    }

    /*
    https://blog.csdn.net/HYNN12/article/details/109220489
    https://blog.csdn.net/weixin_40968046/article/details/118683290
    */
});

/*
    onCastSpell(event){
        var animName = event.target.__meta;
        if(this._isSpelling){
            return;
        }
        this._isSpelling = true;
        var arr = [];
        //切换成冲刺动画,并移动到目标跟前  
 arr.push(cc.spawn(cc.moveTo(0.3,this.target.node.position.sub(cc.v2(120,0))),cc.callFunc(function(){
            this.hero.playAnim('rush');
        },this)) );
        //播放攻击动画
        arr.push(cc.callFunc(function(){
            this.hero.playAnim(animName);
        },this));
        var animInfo = AnimConfig.getRoleInfo(this.hero.roleId)[animName];
        var playTime = animInfo.frames / animInfo.fps;
        //等待攻击完成
        arr.push(cc.delayTime(0.5 + playTime));
        //移回原来位置
        arr.push(cc.moveTo(0.1,this.hero.node.position));
        arr.push(cc.callFunc(function(){
            this._isSpelling = false;
        },this));
 
        var act = cc.sequence(arr);
        this.hero.node.runAction(act);
    }
*/

4:运行结果
资源网上找的,使用的是龙骨骼
在这里插入图片描述
在这里插入图片描述
5:DEMO工程
有需要再上传
如果觉得有用,麻烦点个赞,加个收藏

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2060265.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++智能指针配合STL模板类

代码 #include <unordered_map> #include <set> #include <memory> class ResID { public:using SP std::shared_ptr<ResID>;ResID() default;ResID(const std::string& id, const std::string& type): m_id(id), m_type(type){}public:~Re…

SAM 2——视频和图像实时实例分割的全新开源模型

引言 源码地址&#xff1a;https://github.com/facebookresearch/segment-anything-2 过去几年&#xff0c;人工智能领域在文本处理的基础人工智能方面取得了显著进步&#xff0c;这些进步改变了从客户服务到法律分析等各个行业。然而&#xff0c;在图像处理方面&#xff0c;我…

Python高手如何做到一键更新代码?

声明&#xff1a;此篇为 ai123.cn 原创文章&#xff0c;转载请标明出处链接&#xff1a;https://ai123.cn/2186.html ​Hey&#xff0c;Python搞手们&#xff0c;&#x1f44b;&#xff0c;你们是否也头疼代码维护的重重难关&#xff1f;别担心&#xff0c;今天就给你们带来一手…

【功能】Lua层的全局事件管理系统

1.EventManager 全局的管理类 2.EventType 事件类型 3..Lua层Common工具目录去require对应文件目录的脚本文件 --事件类型 local EventType {TestMsg 1&#xff0c; }return EventType local EventManager class(); EventManager.msgMap {}local function HaveSameFunc(…

Linux 搜索历史命令Ctrl+R

最近使用CtrlR来搜索历史命令&#xff0c;对比速度比history 快一下&#xff0c;且看起来高级。记录如下&#xff1a;命令1&#xff1a;history 功能&#xff1a;显示当前Linux终端输入过的历史命令。案例&#xff1a;使用history 出来的结果很多&#xff0c;通常和grep 过滤&a…

抗菌肽LL-37;LLGDFFRKSKEKIGKEFKRIVQRIKDFLRNLVPRTES;CAS:154947-66-7

【抗菌肽LL-37 简介】 LL-37是一种由37个氨基酸残基组成的抗菌肽&#xff0c;它是人类cathelicidin家族中的唯一成员。LL-37具有广泛的抗菌活性&#xff0c;能够对抗革兰氏阳性菌和革兰氏阴性菌&#xff0c;以及真菌和病毒。除了直接的抗菌作用&#xff0c;LL-37还具有免疫调节…

你是如何克服编程学习中的挫折感的?(-@-^-0-)

在编程学习中遇到挫折感是极为常见且正常的现象&#xff0c;因为编程往往涉及解决复杂问题、理解抽象概念以及不断试错的过程。 以下是一些建议&#xff0c;帮助你在面对挫折时调整心态&#xff0c;继续前行&#xff1a; 接受失败是成长的一部分&#xff1a;首先要认识到&#…

linux之网络子系统-tcpdump 原理

一、tcpdump 的用途 tcpdump是Linux系统抓包工具&#xff0c;tcpdump基于libpcap库&#xff0c;根据使用者的定义对网络上的数据包进行截获&#xff0c;tcpdump可以将网络中传送的数据包中的"头"完全截获下来提供分析&#xff0c;支持针对网络层、协议、主机、网络或…

刷题篇 - 03

题目一&#xff1a; 203. 移除链表元素 - 力扣&#xff08;LeetCode&#xff09; public ListNode removeElements(ListNode head, int val) {//1. 如果链表为null&#xff0c;直接返回headif (head null) {return head;}//2. 定义快慢指针ListNode pre head;ListNode del …

工业数据采集网关简介-天拓四方

随着工业4.0和物联网&#xff08;IoT&#xff09;技术的深入发展&#xff0c;工业数据采集网关作为连接现场设备与上层管理系统的关键节点&#xff0c;其在智能工厂中的作用愈发凸显。本文将深入探讨工业数据采集网关的功能、特点、应用场景及其实操性&#xff0c;以期为读者提…

【JPCS出版】第三届机械、航天技术与材料应用国际学术会议 (MATMA 2024)

第三届机械、航天技术与材料应用国际学术会议(MATMA 2024)定于2024年08月30-9月1日在中国呼和浩特隆重举行。 本会议由内蒙古工业大学主办&#xff0c;主要围绕“机械工程”、“航天技术”与“材料应用”等最新研究领域展开研讨&#xff0c;为来自国内外高等院校、科学研究所、…

【SpringCloud】(一文通)SpringCloud 环境和工程搭建

目 录 一. 开发环境安装二. 案例介绍2.1 需求2.2 服务拆分 三. 数据准备四. 工程搭建4.1 构建父子工程4.1.1 创建父工程4.1.2 创建子项目-订单服务4.1.3 创建子项目-商品服务 4.2 完善订单服务4.2.1 完善启动类, 配置文件4.2.2 业务代码4.2.3 测试 4.3 完善商品服务4.3.1 完善启…

Cesium实现单个无人机飞行

通过一组坐标&#xff0c;实现平滑的无人机飞行效果 测试步骤&#xff1a; 1、手动填写坐标并记录坐标(可通过点击球面查看坐标信息) 2、点击初始化&#xff0c;载入相应的坐标信息 3、点击漫游&#xff0c;镜头会平滑演进 低配置云服务器&#xff0c;首次加载速度较慢&…

设备状态图表-甘特图

1.背景&#xff1a;设备状态监控图表&#xff0c;监控不同状态的时间段&#xff0c;可以使用甘特图来展示效果 鼠标经过时的数据提示框 2、代码实现 <template><divref"ganttChartRefs":style"{ height: 6.2rem, width: 100% }"class"bg…

利用ai写作软件,一键智能改写文案很简单

在当今快节奏的时代&#xff0c;科技的发展日新月异&#xff0c;人工智能&#xff08;AI&#xff09;已经逐渐融入到我们生活的各个方面。其中&#xff0c;AI写作工具的出现为文案创作带来了极大的便利&#xff0c;让一键智能改写文案变得简单而高效。 AI写作工具利用先进的算法…

项目技巧1

目录 创建项目工程的技巧 示例&#xff1a;创建父工程 第一步&#xff1a;初始化maven项目 第二步&#xff1a;使用标签 抽取依赖的资源版本号&#xff0c;方便后续调整 第三步&#xff1a;配置父工程锁定的版本&#xff0c;使用 该标签的作用&#xff1a;锁定资源的版本号&…

初探Raft算法

在分布式系统有一个经典的CAP理论&#xff0c;C&#xff1a;一致性&#xff0c;即集群中所有节点都应该是一致的。A&#xff1a;可用性&#xff0c;集群一直处于可用状态。P&#xff1a;分区容错性&#xff1a;即复制所有数据到集群的所有节点&#xff0c;保证即使出现网络分区…

TQRFSOC开发板47DR,LMK04832更新配置

在利用RFSOC开发板进行项目开发时&#xff0c;面对多样化的时钟需求&#xff0c;巧妙地配置LMK04832时钟管理芯片以输出精确的时钟信号显得尤为重要。本期内容将讲解如何通过ZYNQ更新LMK04832的配置&#xff0c;以满足您的特定时钟需求。 每次配置成功后&#xff0c;配置文件都…

电路笔记(PCB):JLC PCB布局和走线基础教程笔记

对立创EDA 四层板PCB设计保姆级教程的笔记看完才发现是个虚假的教程&#xff0c;除了没教四层板咋画其它教了&#xff08;中间的两层全是GND的作用&#xff09; PCB布局 转换原理图 使用USB模块&#xff08;3.0集线器&#xff09;中的原理图。设计- - -》更新/转换原理图到P…

CSP内容安全策略

目录 CSP内容安全策略 一、引入 二、CSP内容安全策略 1、通过 HTTP 响应头信息的 Content-Security-Policy 的字段 2、通过网页的 meta 标签 3、在security的read.php页面&#xff0c;增加以下响应头 4、report-uri安全报告 5、其他安全配置 6、Web服务器全局配置 三…