• 2008-02-04

    2.0 fms A星寻路

    版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
    http://wxsr.blogbus.com/logs/14939427.html

    http://wxsr.blogbus.com/files/12020891200.swf  以前的东西文件忘了葛哪了~以后找到补发下

    http://www.xpathx.cn/map_move_3.swf连网版 好友X神的fms服务器~

    http://www.xpathx.cn/我的另一个空间~

     

    找到一个一开始写的草稿将就着看吧~有个整理好的类找不到阁哪了

    stop();
    change_btn.onPress = function() {
     grid_mc.removeMovieClip();
     var member_arr = [], open_arr = [], G = 0, H = 0, Open_arr = [], Close_arr = [], target_mc, Start_mc;
     var road_arr = [], kao = 0;
     spess == undefined ? spees=60 : spees=spees;
     spees_txt.text = spees;
     W_num = 25;
     H_num = 20;
     grid_func(W_num, H_num, int(za.text));
    };
    spees_btn.onPress = function() {
     var num = int(spees_txt.text);
     spees = Math.abs(num);
    };
    //_root._xscale = 150;
    //_root._yscale = 150;
    _root._y = 150;
    _root._x = 150;
    var member_arr = [], open_arr = [], G = 0, H = 0, Open_arr = [], Close_arr = [], target_mc, Start_mc;
    var road_arr = [], kao = 0;
    spess == undefined ? spees=60 : spees=spees;
    spees_txt.text = spees;
    W_num = 25;
    H_num = 20;
    grid_func(W_num, H_num, int(za.text));
    var intervalId, intervalId_2;
    onMouseUp = function () {
     if (grid_mc.hitTest(_xmouse, _ymouse, false)) {
      init(open_arr);
      clearInterval(intervalId);
      clearInterval(intervalId_2);
      if (Start_mc == undefined) {
       Start_mc = member_arr[man.pos._i][man.pos._j];
      }
      man._x = Start_mc._x;
      man._y = Start_mc._y;
      target_mc = set_target(open_arr, grid_mc);
      if (!target_mc.state_) {
       time.text = " 无路";
      } else {
       T = getTimer();
       intervalId = setInterval(this, "get_area", 1, W_num);
      }
     }
    };
    function set_target(arr, mc) {
     if (mc.hitTest(_xmouse, _ymouse, false)) {
      for (var i = 0; i<arr.length; i++) {
       if (arr[i].state_ == true) {
        if (arr[i].hitTest(_xmouse, _ymouse, false)) {
         return arr[i];
        }
       }
      }
     }
    }
    function get_area(w) {
     if (Start_mc.close_state != "close") {
      Close_arr.push({mc:Start_mc, G:0, F:0, dis:0, Parent:Start_mc});
      Start_mc.close_state = false;
     }
     var arr = [], _arr = [-1, 1, -1, 1];
     var from_arr = [member_arr[Start_mc.pos._i-1][Start_mc.pos._j], member_arr[Start_mc.pos._i+1][Start_mc.pos._j], member_arr[Start_mc.pos._i][Start_mc.pos._j-1], member_arr[Start_mc.pos._i][Start_mc.pos._j+1]];
     for (var k = 0; k<_arr.length; k++) {
      !from_arr[k].state_ ? _arr[k]=0 : "";
     }
     for (var i = _arr[0]; i<=_arr[1]; i++) {
      for (var j = _arr[2]; j<=_arr[3]; j++) {
       var obj = member_arr[Start_mc.pos._i+i][Start_mc.pos._j+j];
       if (obj.state_ && obj != undefined && obj != Start_mc && obj != member_arr[Start_mc.pos._i][Start_mc.pos._j]) {
        var dis = Math.ceil(Math.abs(obj.pos._i-target_mc.pos._i)+Math.abs(obj.pos._j-target_mc.pos._j))*10;
        obj.Parent == undefined ? obj.Parent=Start_mc : "";
        Math.abs(j) == 1 ? arr.push({mc:obj, _G:24, G:14+G, dis:dis, F:dis+24+G, Parent:obj.Parent}) : arr.push({mc:obj, _G:10, G:10+G, dis:dis, F:dis+10+G, Parent:obj.Parent});
        var mc_ = arr[arr.length-1];
        if (Open_arr.length<=0) {
         if (obj.close_state == undefined) {
          Open_arr.push(mc_);
          obj.close_state = "open";
         }
        } else {
         for (var u = 0; u<Open_arr.length; u++) {
          if (obj.close_state == undefined) {
           if (mc_.F<Open_arr[u].F) {
            obj.close_state = "open";
            Open_arr.splice(u, 0, mc_);
            break;
           } else if (u == Open_arr.length-1) {
            obj.close_state = "open";
            Open_arr.push(mc_);
           }
          }
         }
        }
       }
      }
     }
     Start_mc = Open_arr[0].mc;
     G = Open_arr[0].G;
     Start_mc.close_state = "close";
     Close_arr.push(Open_arr[0]);
     Open_arr.shift();
     if (Start_mc == target_mc || Start_mc == undefined) {
      trace("End="+(getTimer()-T)/1000+"秒");
      time.text = (getTimer()-T)/1000+"秒";
      Close_arr.push({mc:target_mc, G:0, F:0, dis:0, Parent:target_mc});
      target_mc.see._visible = true;
      target_mc.see.gotoAndStop(2);
      clearInterval(intervalId);
      intervalId_2 = setInterval(this, "go", spees, run_func());
     }
    }
    function go(arr) {
     man._x = road_arr[(road_arr.length-1)-kao]._x;
     man._y = road_arr[(road_arr.length-1)-kao]._y;
     man.pos = road_arr[(road_arr.length-1)-kao].pos;
     kao++;
     if (kao>=road_arr.length) {
      man._x = target_mc._x;
      man._y = target_mc._y;
      man.pos = target_mc.pos;
      clearInterval(intervalId_2);
      kao = 0;
     }
    }
    function run_func() {
     var tmp_mc_2 = Close_arr[0].mc;
     var tmp_mc = Close_arr[Close_arr.length-2].mc;
     road_arr = [];
     for (var r = 0; r<Close_arr.length; r++) {
      if (tmp_mc != tmp_mc.Parent) {
       road_arr.push(tmp_mc.Parent);
      }
      tmp_mc.Parent.see._visible = true;
      tmp_mc = tmp_mc.Parent;
      if (tmp_mc == tmp_mc_2) {
       return road_arr;
      } else if (Start_mc == undefined) {
       target_mc = Close_arr[0].mc;
       time.text = "无路";
       return road_arr;
      }
     }
    }
    function init(arr) {
     time.text = "";
     G = 0;
     H = 0;
     road_arr = [];
     kao = 0;
     Start_mc = member_arr[man.pos._i][man.pos._j];
     Open_arr = [];
     Close_arr = [];
     for (var i = 0; i<arr.length; i++) {
      arr[i].see._visible = false;
      arr[i].see.gotoAndStop(1);
      delete arr[i].Parent;
      delete arr[i].close_state;
     }
    }
    function grid_func(w, h, z) {
     var grid_mc = this.createEmptyMovieClip("grid_mc", this.getNextHighestDepth());
     grid_mc._x = 50;
     grid_mc._y = 50;
     var grid_arr = [];
     for (var i = 0; i<h; i++) {
      member_arr[i] = [];
      for (var j = 0; j<w; j++) {
       var depth = (i*w+(j+1));
       var grid = "mc"+depth;
       var mc = grid_mc.attachMovie("grid", grid, grid_mc.getNextHighestDepth());
       mc._x = 25*j;
       mc._y = 25*i;
       mc.id = depth;
       mc.pos = {_i:i, _j:j};
       grid_arr.push(mc);
       member_arr[i].push(mc);
       if (depth != 1 && depth%(random(100-z)+1) == 0) {
        mc.mc.gotoAndStop(2);
        mc.state_ = false;
       } else {
        mc.state_ = true;
        open_arr.push(mc);
       }
      }
     }
     _root.man = grid_mc.attachMovie("man", "man", grid_mc.getNextHighestDepth());
     _root.man.pos = {_i:0, _j:0};
     return grid_arr;
    }


    收藏到:Del.icio.us




    评论

  • 繁体??台湾朋友的博客??