Orochy
%Europe/Berlin %833 %2009, 21:00
Hallo allemaal,
Ik heb een pathfinding script geschreven en nu vraag ik me af of jullie hem zouden willen testen. het gaat mij vooral er om of hij snel de weg laat zien. ik heb een vrij snelle pc en wil graag weten of hij het ook snel berekend op minder snelle pc's. ik swf is kwa resolutie vrij groot 1200*800 dit komt door level5. opslaan als om de swf te downloaden.
build = map maken(combobox) en refreshen
start = startpunt, klik op een tile om hem neer tezetten
end = eindpunt, klik op een tile om hem neer tezetten
find = zoek de weg
Orochy
Jan
%Europe/Berlin %918 %2009, 23:02
Even getest op een oudere laptop (256RAM, 2Ghz) en yep, werkt goed. :)
Met goed bedoel ik minder dan een (halve) seconde voor het langste pad dat ik op het eerste zicht kon bedenken.
Groeten,
Jan
Orochy
%Europe/Berlin %936 %2009, 23:29
bedank Jan,
Mijn buildmap functie werkt met een x,y,z
de level is een object die een area en een name bevat bv.
level = {area : [[0,1,1,1,1,0,0,0],
` [0,1,1,0,1,1,0,0],
[1,1,0,0,1,1,0,0],
[1,1,0,0,1,1,1,0],
[1,1,1,0,0,1,0,0],
[0,1,1,0,1,1,0,0],
[0,1,1,1,1,0,0,0]],
name : "level 1"}
als je een movieclip het pad wil laten volgen zal je de makemap functie aan moeten passen want deze word nu gemaakt van het eind tot het begin inplaats van anders om.
//buildmap
function buildmap(){
level_T.text = level.name
trace("BuildMap")
_root.createEmptyMovieClip("game", 1);
game.createEmptyMovieClip("Map",1)
game.createEmptyMovieClip("grid", 2);
grid = game.grid
grid._x = grid._width/2+60;
grid._y = grid._height/2;
for (i = 0; i<level.area.length; i++) {
for ( j = 0; j<level.area[0].length; j++) {
if(level.area[i][j]==1){
x = Math.round((level.area.length) - (j+i/2)+2)
y = Math.round(level.area.length - (j-i/2))
z = i
name = "t_"+x+"_"+y+"_"+z
grid.createEmptyMovieClip(name, (i*100+j*2));
tile = game.grid[name]
tile.attachMovie("Tile", "tile", 1);
tile._x = i*(tile._width/2*1.5)
tile._y = j*tile._height - (i%2*20)
tile.name = name
tile.x = x
tile.y = y
tile.z = z
tile.walkable = true
tile.visited = false
}
}
}
grid._xscale = grid._xscale*2
game._x = (Stage.width/2) - (grid._width/2) - 10
game._y = (Stage.height/2) - (grid._height/2)+35
game.Map._x = grid._x+(grid._width/2)-45
game.Map._y = grid._y+(grid._height/2)-40
}
//findpath
function findpath(start,end){
surcost = [10,10,14,14,14,14]
range = [[1,1,0],[0,1,1],[-1,0,1],[-1,-1,0],[0,-1,-1],[1,0,-1]]
path ={opennods:[],closednods:[],done:false,nods:{}}
path.opennods.push(start)
path.nods[start] = {name:start,parent:undefined,h:0,g:0,f:0}
grid[start].visited = true
while(path.opennods.length>0){
if(best == end){
path.done = true
}
calculatebest()
}
if(path.opennods.length == 0){
if(path.done==true){
makepath()
}else{
trace("no path")
}
}
}
//calculatebest
function calculatebest(){
best = ""
f = Infinity
for(i=0;i<path.opennods.length;i++){
if(path.nods[path.opennods[i]].f<f){
best = path.opennods[i]
f = path.nods[path.opennods[i]].f
}
}
surroundingtiles(best)
}
//surroundingtiles
function surroundingtiles(best){
for(i=0;i<6;i++){
x = grid[best].x +range[i][0]
y = grid[best].y +range[i][1]
z = grid[best].z +range[i][2]
name = "t_"+x+"_"+y+"_"+z
if(grid[name].walkable == true){
hx = grid[name].x - grid[end].x
hy = grid[name].y - grid[end].y
hz = grid[name].z - grid[end].z
h = Math.sqrt((hx*hx)+(hy*hy)+(hz*hz))
g = path.nods[best].g + surcost[i]
f = g+h
if(grid[name].visited == false){
path.nods[name] = {name:name,parent:best,h:h,g:g,f:f}
path.opennods.push(name)
grid[name].visited = true
}
}
}
for(i=0;i<path.opennods.length;i++){
if(path.opennods[i] == best){
path.opennods.splice(i,1)
}
}
}
//makepath
function makepath(){
grid[end].tile.gotoAndStop(2)
active = path.nods[end].parent
while(active !=start){
grid[active].tile.gotoAndStop(2)
active = path.nods[active].parent
}
grid[start].tile.gotoAndStop(2)
}
.fla zit in de rar opslaan als en met winrar uitpakken.
Orochy
%Europe/Berlin %586 %2009, 15:05
k ben weer wat verder level 3 heeft tile cost en level 6 is 18*31
gewoon ergens op de kaart klikken om de weg te zoeken.
vBulletin® v3.8.1, Copyright ©2000-2012, Jelsoft Enterprises Ltd.