-
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;
}随机文章:
基于哈希表数据源的A星寻路算法 2008-12-16as3.0 titleTips 2008-02-04as 3.0 事件 声明 2008-01-25wxsr 45度地图编辑器 总结 2009-05-30Adobe Media Player 2008-01-04
收藏到:Del.icio.us








评论