Zurück   Flashforum > Flash > ActionScript > Spielkonzepte und Spieleprogrammierung

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 24-11-2006, 01:29   #1 (permalink)
Meep!
 
Registriert seit: Sep 2005
Beiträge: 146
Labyrinth dynamisch erstellen

ich habe folgende methode zum dynamischen erstellen eines zufälligen Pfades ohne überschneidung auf meinem raster...
ActionScript:
  1. public function randomConnect(x1,y1,x2,y2, t)
  2.     {
  3.         var s1 = arr.getStein(x1,y1);
  4.         var s2 = arr.getStein(x2,y2);
  5.         var dbg = 0;
  6.         while(s1 != s2 && dbg < 10000)
  7.         {
  8.             s1.setType(t);
  9.             dbg++;
  10.             var a = arr.getNeighboursOfType(s1,1);
  11.             var hca:Array = new Array(4);
  12.             for(var i = 0; i<a.length; i++)
  13.             {
  14.                 hca[i] = arr.countNeighboursOfType(a[i],1);
  15.             }
  16.             trace(hca);
  17.             //getting the highest value:
  18.             var hc = 0;
  19.             for(var i = 0; i<hca.length; i++)
  20.             {
  21.                 if(hca[i] > hc)
  22.                     hc = hca[i];
  23.             }
  24.             //breaking if it cant continue...
  25.             if(hc<=0)
  26.             {
  27.                 trace("error!");
  28.                 break;
  29.             }
  30.             //collecting fields with highest value:
  31.             var hca2:Array = new Array();
  32.             for(var i = 0; i<hca.length; i++)
  33.             {
  34.                 if(hca[i] == hc)
  35.                     hca2.push(i);
  36.             }
  37.             //randoming a field:
  38.             var f = Math.floor(Math.random()*hca2.length);
  39.             //trace(hca2.length);
  40.             s1 = a[hca2[f]];
  41.             trace(f);
  42.             trace(hca2);
  43.                
  44.                
  45.         }
  46.            
  47.                
  48.     }

nun endet das ganze aber zu 99% in einer sackgasse und erreicht nie den endpunkt. ich habe mir schon überlegt, dass ich vorher ein paar "zwischenziele" generiere und dann die "bewegung" immer zum zielpunkt hinsteuere. Nun weis ich aber nicht, wie ich eine scheinbar zufällige bewegung zu einem bestimmten punkt hin generiere, die aber nicht gezielt aussieht! also sozusagen eine gezielte zufälligkeit...

mir ist klar wie ich einen richtungsvektor erstelle und dann entlang des vektor markiere, aber das ganze soll ja zufällig sein!

hat da jmd. ne idee?
danke!
__________________
http://www.pixartist.de
pixartist ist offline   Mit Zitat antworten
Alt 24-11-2006, 08:45   #2 (permalink)
new user
 
Benutzerbild von PinkDragon
 
Registriert seit: Oct 2005
Beiträge: 140
Meine Idee wäre zusätzlich eine wegfindungsroutine einzubauen und immer wenn er ein weiteres Stück erstellt, prüft er erst, ob man von diesem Punkt überhaupt noch ans Ziel kommen kann und wenn nicht, wird ein anderer Punkt gewählt. So erkennst du frühzeitig Sackgassen. Auch solltest du die alten Punkte gespeichert lassen, denn falls von dem Stück aus kein Weg weiter führt, kannst du dann einen Punkt zurück gehen und von dort weiter rechnen.
Nur braucht es so relativ viel Rechenleistung...
PinkDragon ist offline   Mit Zitat antworten
Alt 24-11-2006, 13:48   #3 (permalink)
Meep!
 
Registriert seit: Sep 2005
Beiträge: 146
jau das wär ne idee...ich hatte mir auch folgendes überlegt. erst erstelle ich eine strecke vom start zum ziel...dann teile ich diese strecke in 2 strecken mit einem zufälligen mittleren punkt und dann wende ich diese funktion rekursiv auf die teilstücke an ^^

aber da hab ich wieder überschneidungen....
__________________
http://www.pixartist.de
pixartist ist offline   Mit Zitat antworten
Alt 24-11-2006, 17:31   #4 (permalink)
Meep!
 
Registriert seit: Sep 2005
Beiträge: 146
k hab jetzt ne wegfindung gebaut ... aber leider leidet das ganze jetzt unter einer totalen verklumpung, vorallem wenn ich mehrere pfade einzeichnen lasse!!

ActionScript:
  1. import LArray;
  2. class Lab
  3. {
  4.     private var arr:LArray;
  5.     public function Lab (xs, ys)
  6.     {
  7.         arr = new LArray (xs, ys);
  8.     }
  9.     public function init (t)
  10.     {
  11.         arr.init (t);
  12.     }
  13.     public function setType (x, y, t)
  14.     {
  15.         arr.getStein (x, y).setType (t);
  16.     }
  17.     public function findNWLDist (s1:LStein, s2:LStein):LStein
  18.     {
  19.         var n = arr.getNeighbours (s1);
  20.         var l:LStein = undefined;
  21.         var ld = -1;
  22.         for (var i = 0; i < n.length; i++)
  23.         {
  24.             var d = arr.getDistance (n[i], s2);
  25.             if (ld == -1 || d < ld)
  26.             {
  27.                 l = n[i];
  28.                 ld = d;
  29.             }
  30.         }
  31.         return l;
  32.     }
  33.     public function findNWLDistbutnot (s1:LStein, s2:LStein, t:Array):LStein
  34.     {
  35.         var n = arr.getNeighbours (s1);
  36.         var l:LStein = undefined;
  37.         var ld = -1;
  38.         for (var i = 0; i < n.length; i++)
  39.         {
  40.             var d = arr.getDistance (n[i], s2);
  41.             if ((ld == -1 || d < ld))
  42.             {
  43.                 var tt = true;
  44.                 for (var h = 0; h < t.length; h++)
  45.                 {
  46.                     if (n[i].getType () == t[h])
  47.                     {
  48.                         tt = false;
  49.                     }
  50.                 }
  51.                 if (tt == true)
  52.                 {
  53.                     l = n[i];
  54.                     ld = d;
  55.                 }
  56.             }
  57.         }
  58.         return l;
  59.     }
  60.     [.......]
  61.  
  62. // WEGFINDUNGSalgorithmus!
  63. //+++++++++++++++++++
  64.     public function connectable (x1, y1, x2, y2)
  65.     {
  66.         var dbg = 0;
  67.         var s1 = arr.getStein (x1, y1);
  68.         var s2 = arr.getStein (x2, y2);
  69.         var way = new Array ();
  70.         way.push ([s1, s1.getType ()]);
  71.         var currentpos = way.length - 1;
  72.         s1.setType (2);
  73.         while (s1 != s2 && dbg < 10000)
  74.         {
  75.             s1 = findNWLDistbutnot (s1, s2, [0, 2]);
  76.             if (s1 != undefined)
  77.             {
  78.                 way.push ([s1, s1.getType ()]);
  79.                 s1.setType (2);
  80.                 currentpos = way.length - 1;
  81.                 dbg++;
  82.             }
  83.             else
  84.             {
  85.                 currentpos--;
  86.                 s1 = way[way.length - 2];
  87.                 if (currentpos < 0)
  88.                 {
  89.                     for (var i = 0; i < way.length; i++)
  90.                     {
  91.                         way[i][0].setType (way[i][1]);
  92.                     }
  93.                     return false;
  94.                 }
  95.             }
  96.         }
  97.         if (s1 == s2)
  98.         {
  99.             for (var i = 0; i < way.length; i++)
  100.             {
  101.                 way[i][0].setType (way[i][1]);
  102.             }
  103.             return true;
  104.         }
  105.     }
  106. // Zufälliger weg wird generiert
  107. //+++++++++++++++++++
  108.     public function randomConnect (x1, y1, x2, y2, t)
  109.     {
  110.         var s1 = arr.getStein (x1, y1);
  111.         var s2 = arr.getStein (x2, y2);
  112.         var dbg = 0;
  113.         var way:Array = new Array();
  114.         way.push(s1);
  115.         while (s1 != s2 && dbg < 10000)
  116.         {
  117.            
  118.             s1.setType (t);
  119.             dbg++;
  120.             var a = arr.getNeighboursOfType (s1, 1);
  121.             var hcan:Array = new Array ();
  122.             for (var i = 0; i < a.length; i++)
  123.             {
  124.                 hcan[i] = arr.countNeighboursOfType (a[i], 1);
  125.             }
  126.             // remove neightbors that have no path to target...
  127.             var hca:Array = new Array ();
  128.             for (var i = 0; i < a.length; i++)
  129.             {
  130. //pathfinding for points(uhh that costs time!!)
  131.                 if(connectable(a[i].getX(),a[i].getY(),s2.getX(),s2.getY()))
  132.                     hca[i] = hcan[i];
  133.                 else
  134.                     hca[i] = 0;
  135.             }
  136.             //getting the highest value:
  137.             var hc = 0;
  138.             for (var i = 0; i < hca.length; i++)
  139.             {
  140.                 if (hca[i] > hc)
  141.                 {
  142.                     hc = hca[i];
  143.                 }
  144.             }
  145.             //breaking if it cant continue...
  146.             if (hc <= 0)
  147.             {
  148.                 trace ("error!");
  149.                 break;
  150.             }
  151.             //collecting fields with highest value:   
  152.             var hca2:Array = new Array ();
  153.             for (var i = 0; i < hca.length; i++)
  154.             {
  155.                 if (hca[i] == hc)
  156.                 {
  157.                     hca2.push (i);
  158.                 }
  159.             }
  160.            
  161.            
  162.             //randoming a field:
  163.             var f = Math.floor (Math.random () * hca2.length);
  164.             //trace(hca2.length);
  165.             s1 = a[hca2[f]];
  166.             way.push(s1);
  167.         }
  168.         for(var k = 0;k<way.length;k++)
  169.         {
  170. //hier lasse ich  dann zufällig zusätzliche pfade hinzufügen...
  171.  
  172.             if(Math.random() < 0.1)
  173.             {
  174.                 randomConnect(way[k].getX(), way[k].getY(), Math.floor(Math.random()*arr.getDimensions()[0]), Math.floor(Math.random()*arr.getDimensions()[0]), t)
  175.             }
  176.         }
  177.     }
  178. }
__________________
http://www.pixartist.de

Geändert von pixartist (24-11-2006 um 18:03 Uhr)
pixartist ist offline   Mit Zitat antworten
Alt 25-11-2006, 11:53   #5 (permalink)
new user
 
Benutzerbild von PinkDragon
 
Registriert seit: Oct 2005
Beiträge: 140
Könntest mal ne Beispiels-swf anhängen? under "verklumpen mehrerer Wege" kann ich mir in diesem Zusammenhang relativ wenig vorstellen...
PinkDragon ist offline   Mit Zitat antworten
Alt 27-11-2006, 12:52   #6 (permalink)
Meep!
 
Registriert seit: Sep 2005
Beiträge: 146
mit verklumpung meinte ich, dass die linien sehr oft aneinander liegen und so grössere flächen bilden. habe das problem behoben, indem ich um die linien eine art "schutzmantel" gelegt habe, der auch nicht geschnitten werden darf

achtung die berechnung behinhaltet massenhaft rekursion und ist nochnicht optimiert...wenn ich zeit habe werde ich noch nen algorithmus programmieren, welcher das raster in errreichbarkeitsbereiche einteilt. das wird die wegfindung sehr viel schneller machen (hoffentlich)
wenn ihr "verlangsamungspopups" bekommt..einfach "nein" klicken...das ganze dauert ne weile
Angehängte Dateien
Dateityp: zip wegfindung.zip (2,8 KB, 18x aufgerufen)
__________________
http://www.pixartist.de

Geändert von pixartist (27-11-2006 um 12:56 Uhr)
pixartist ist offline   Mit Zitat antworten
Antwort

Lesezeichen

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
Pingbacks sind an
Refbacks sind an



Alle Zeitangaben in WEZ +1. Es ist jetzt 18:20 Uhr.

Domains, Webhosting & Vserver von Host Europe
Unterstützt das Flashforum!
Adobe User Group


Copyright ©1999 – 2012 Marc Thiele