Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Jul 18, 2025 21:12

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 15 Beiträge ] 
Autor Nachricht
BeitragVerfasst: So Jun 05, 2005 19:12 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jun 19, 2003 10:44
Beiträge: 991
Wohnort: Karlsfeld (nahe München)
Ich hab vor mir eine Perlin Noise Funktion zu bauen.

Diesen Effekt möchte ich zunächst in Delphi programmmieren und nacher nach JASS (Skriptsprache für Warcraft 3 Maps) portieren. Die Skriptsprache ist leider so primtiv das sich eine eigene Zufallsfunktion schlecht machen läßt. Also habe ich die Zufallsfunktion durch ein Array mit Zufallswerten ersetzt.

So weit so gut. Nun habe ich ein 2D Array mit Zufallswerten.

Wie übertrage ich die Interpolation mit etwa cos auf 2D?

Die einzigste Lösung die mir dazu einfällt wäre die, erst für die eine Dimension zu interpolieren. Und dann die drei erhaltenen Werte wieder miteinander interpolieren.

Macht man das so oder gibt es eine bessere Lösung?

MfG
Flo

_________________
Danke an alle, die mir (und anderen) geholfen haben.
So weit... ...so gut


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jun 05, 2005 22:15 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Nov 13, 2004 11:00
Beiträge: 229
Wohnort: Steinhude
also ich würde es so machen, funktioniert bei mir jedenfalls ganz gut^^


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jun 06, 2005 02:12 
Offline
DGL Member

Registriert: So Sep 26, 2004 05:57
Beiträge: 190
Wohnort: Linz
Zitat:
Die Skriptsprache ist leider so primtiv das sich eine eigene Zufallsfunktion schlecht machen läßt.

Die Skriptsprache wird doch wohl simple Mathe Funktionalität haben, oder? Für die binären Operationen (Shift left, And, ...) gibts ja gegebenenfalls auch mathematische Methoden um diese zu realisieren, vorausgesetzt du hast eine Möglichkeit die Nachkommestellen von Floating Point-Zahlen abzuschneiden. Behaupt ich jetzt mal, für alle hab ichs mir nicht durch gedacht :-). Sag einfach mal was alles zur Verfügung steht, dann findet sich sicher was.

Zitat:
Wie übertrage ich die Interpolation mit etwa cos auf 2D?

So wie jede 1D-Interpolation auf 2D übertragen wird, und zwar folgendermaßen:

x ... im Wertebereich [0|Pi/2]
y ... im Wertebereich [0|Pi/2]

Interpoliere die Werte:
W1 W2
W3 W4

Dummy1 = cos(x) * W1 + (1-cos(x)) * W2
Dummy2 = cos(x) * W3 + (1-cos(x)) * W4

Ergebnis = cos(y) * Dummy1 + (1-cos(y)) * Dummy2

und um dem "jede 1D-Interpolation" noch gerecht zu werden, kann cos(x/y) durch jede andere Funktion ersetzt werden, welche eine Funktion von a nach b dar stellt, wobei b im Wertebereich [0|1] liegen sollte (ansonnsten wird man "interessante" Ergebnisse erhalten) und b = 1 wenn a = Minimum und b = 0 wenn a = Maximum.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jun 06, 2005 20:14 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jun 19, 2003 10:44
Beiträge: 991
Wohnort: Karlsfeld (nahe München)
Ich habe es jetzt hinbekommen. Und zwar nicht nur unter Delphi!
Es war mir auch schon möglich das den Perlin Noise Effekt mit JASS in eine Warcraft 3 Map zu integrieren.

Auf dem untern Screenshot könnt ihr einen kleinen Ausschnitt, einer zufällig erzeugten Karte sehen.
Wohlgemerkt wird die Karte erst beim Spielstart generiert!

Eine Idee was ich mit so einen Zufällig genierten Wald mache habe ich auch schon...

... spielt hier noch jemand Warcraft 3?

MfG
Flo


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

_________________
Danke an alle, die mir (und anderen) geholfen haben.
So weit... ...so gut


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jun 06, 2005 20:16 
Offline
DGL Member
Benutzeravatar

Registriert: So Dez 19, 2004 00:27
Beiträge: 454
Wohnort: Nürnberg
Flo hat geschrieben:
Ich habe es jetzt hinbekommen. Und zwar nicht nur unter Delphi!
Es war mir auch schon möglich das den Perlin Noise Effekt mit JASS in eine Warcraft 3 Map zu integrieren.

Auf dem untern Screenshot könnt ihr einen kleinen Ausschnitt, einer zufällig erzeugten Karte sehen.
Wohlgemerkt wird die Karte erst beim Spielstart generiert!

Eine Idee was ich mit so einen Zufällig genierten Wald mache habe ich auch schon...

... spielt hier noch jemand Warcraft 3?

MfG
Flo


Nö, aber versucht du hier das nachzu programmieren, oder was ??? ;)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jun 06, 2005 20:20 
Offline
DGL Member

Registriert: Mi Dez 15, 2004 20:36
Beiträge: 454
Wohnort: Wien, Österreich
Ja, u.a. Warcraft auch ;).

_________________
"Meine Mutter sagt : 'Dumm ist der, der Dummes tut'." - Forrest Gump


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jun 06, 2005 20:28 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 14, 2004 18:56
Beiträge: 804
Wohnort: GER/OBB/TÖL-WOR/Greiling
ich bekomme in kürze ( oder auch in länge, blödes freenet.... :x ) dsl, und dann werd ich auch im battlenet anzutreffen sein.

wie hast du das denn jetzt hingebracht?

_________________
Bild

"User Error. Replace User and hit Continue."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jun 06, 2005 20:50 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jun 19, 2003 10:44
Beiträge: 991
Wohnort: Karlsfeld (nahe München)
Zitat:
Nö, aber versucht du hier das nachzu programmieren, oder was ??? Wink


Ich versuche bzw. habe eine Warcraft 3 Map erstellt die einen Zufälligen Wald beim Spielstart generiert.

Zitat:
wie hast du das denn jetzt hingebracht?

Es gab zunächst Problemme, da man unter Warcraft 3 so genannte Auslöser benutzt um Ereignisse ins Spiel einzubauen.
Diese haben anscheinend eine Maximal laufzeit, nach der sie automatish Abgebrochen werden. Um das Problemm zu umgehen habe ich einen Auslöser design der die genierungs Anweisung für eine Spalte beinhaltet. Kopien von diesen werden dann in eine Auslöser-Warteschlage gestellt.

Der Jass-Code fürs Perl Noise sieht bei mir so aus:

Code:
  1.  
  2. //-----------------------------------------
  3. // By Florian Köberle
  4. // eMail-Name: "FloriansKarten";  eMail-Provider: "web.de"
  5. //
  6. // Using Perlin noise to create a Forest
  7. //-------------------------------------------
  8.  
  9. function GetValue takes integer X, integer Y returns integer
  10.   return udg_Wert[(X + (Y*(udg_DataSize-1)))]
  11. endfunction
  12.  
  13. function Interpoliere takes integer Wert1, integer Wert2, integer Nr, integer Von returns integer
  14.   local integer Ergebnis1
  15.   local integer Ergebnis2
  16.   // Geprüft
  17.   set Ergebnis1 = ( ( Wert1 * udg_Interpolation[( Nr * ( udg_Size / Von ) )] ) / udg_Interpolation_Max )
  18.   set Ergebnis2 = ( ( Wert2 * (udg_Interpolation_Max - udg_Interpolation[( Nr * ( udg_Size / Von ) )] ) ) / udg_Interpolation_Max )
  19.  
  20.  // call DisplayTextToForce( GetPlayersAll(),"-----------------------")
  21.  // call DisplayTextToForce( GetPlayersAll(),"Wert1:    " + I2S(Wert1))
  22.  // call DisplayTextToForce( GetPlayersAll(),"Wert2:    " + I2S(Wert2))
  23.  // call DisplayTextToForce( GetPlayersAll(),"Nr:       " + I2S(Nr))
  24.  // call DisplayTextToForce( GetPlayersAll(),"Von:      " + I2S(Von))
  25.  // call DisplayTextToForce( GetPlayersAll(),"Ergebnis1:" + I2S(Ergebnis1))
  26.  // call DisplayTextToForce( GetPlayersAll(),"Ergebnis2:" + I2S(Ergebnis2))
  27.  // call DisplayTextToForce( GetPlayersAll(),"Ges:" + I2S(Ergebnis1 + Ergebnis2))
  28.  // call DisplayTextToForce( GetPlayersAll(),"-----------------------")
  29.  
  30.   return (Ergebnis1 + Ergebnis2)
  31. endfunction
  32.  
  33. function Berechne takes integer X, integer Y returns integer
  34.   local integer Ergebnis
  35.   local integer WertX0
  36.   local integer WertX1
  37.   local integer I_X0
  38.   local integer I_X1
  39.   local integer I_Y0
  40.   local integer I_Y1
  41.   local integer Level
  42.   local integer Field_Size
  43.   local integer Field_DataSize
  44.   local integer Max
  45.   //-----------------------
  46.  
  47.   set Level = 2
  48.   set Max = 500
  49.  
  50.   set Field_Size = (udg_Size / Level)
  51.  
  52.   set Field_DataSize = ((udg_DataSize-1) / Level)
  53.  
  54.   set I_X0 = Field_DataSize*(X / Field_Size) // ok
  55.   set I_X1 = I_X0 + Field_DataSize           // ok
  56.   set I_Y0 = Field_DataSize*(Y / Field_Size) // ok
  57.   set I_Y1 = I_Y0 + Field_DataSize           // ok
  58.  
  59.   //call DisplayTextToForce( GetPlayersAll(), ((("P1( " + I2S(I_X0)) + (" / " + I2S(I_Y0))+ " ) P2( ")+ (I2S(I_X1) + (" / " + (I2S(I_Y1) + " )")))))
  60.  
  61.  
  62.   set WertX0 = Interpoliere(GetValue(I_X0,I_Y0),GetValue(I_X1,I_Y0),ModuloInteger(X , Field_Size),Field_Size)
  63.   set WertX1 = Interpoliere(GetValue(I_X0,I_Y1),GetValue(I_X1,I_Y1),ModuloInteger(X , Field_Size),Field_Size)
  64.  
  65.   set Ergebnis = (Interpoliere(WertX0,WertX1,ModuloInteger(Y , Field_Size),Field_Size) / 2)
  66.  
  67.   //--------------------------------------
  68.  
  69.   set Level = 4
  70.   set Max = Max + 1000
  71.  
  72.   set Field_Size = (udg_Size / Level)
  73.  
  74.   set Field_DataSize = ((udg_DataSize-1) / Level)
  75.  
  76.   set I_X0 = Field_DataSize*(X / Field_Size) // ok
  77.   set I_X1 = I_X0 + Field_DataSize           // ok
  78.   set I_Y0 = Field_DataSize*(Y / Field_Size) // ok
  79.   set I_Y1 = I_Y0 + Field_DataSize           // ok
  80.  
  81.   //call DisplayTextToForce( GetPlayersAll(), ((("P1( " + I2S(I_X0)) + (" / " + I2S(I_Y0))+ " ) P2( ")+ (I2S(I_X1) + (" / " + (I2S(I_Y1) + " )")))))
  82.  
  83.  
  84.   set WertX0 = Interpoliere(GetValue(I_X0,I_Y0),GetValue(I_X1,I_Y0),ModuloInteger(X , Field_Size),Field_Size)
  85.   set WertX1 = Interpoliere(GetValue(I_X0,I_Y1),GetValue(I_X1,I_Y1),ModuloInteger(X , Field_Size),Field_Size)
  86.  
  87.   set Ergebnis = Ergebnis + Interpoliere(WertX0,WertX1,ModuloInteger(Y , Field_Size),Field_Size)
  88.  
  89.   //--------------------------------------
  90.  
  91.   set Level = 16
  92.   set Max = Max + 1000
  93.  
  94.   set Field_Size = (udg_Size / Level)
  95.  
  96.   set Field_DataSize = ((udg_DataSize-1) / Level)
  97.  
  98.   set I_X0 = Field_DataSize*(X / Field_Size) // ok
  99.   set I_X1 = I_X0 + Field_DataSize           // ok
  100.   set I_Y0 = Field_DataSize*(Y / Field_Size) // ok
  101.   set I_Y1 = I_Y0 + Field_DataSize           // ok
  102.  
  103.   //call DisplayTextToForce( GetPlayersAll(), ((("P1( " + I2S(I_X0)) + (" / " + I2S(I_Y0))+ " ) P2( ")+ (I2S(I_X1) + (" / " + (I2S(I_Y1) + " )")))))
  104.  
  105.  
  106.   set WertX0 = Interpoliere(GetValue(I_X0,I_Y0),GetValue(I_X1,I_Y0),ModuloInteger(X , Field_Size),Field_Size)
  107.   set WertX1 = Interpoliere(GetValue(I_X0,I_Y1),GetValue(I_X1,I_Y1),ModuloInteger(X , Field_Size),Field_Size)
  108.  
  109.   set Ergebnis = Ergebnis + Interpoliere(WertX0,WertX1,ModuloInteger(Y , Field_Size),Field_Size)
  110.  
  111.  
  112.   //--------------------------------------
  113.  
  114.   set Level = 32
  115.   set Max = Max + 2000
  116.  
  117.   set Field_Size = (udg_Size / Level)
  118.  
  119.   set Field_DataSize = ((udg_DataSize-1) / Level)
  120.  
  121.   set I_X0 = Field_DataSize*(X / Field_Size) // ok
  122.   set I_X1 = I_X0 + Field_DataSize           // ok
  123.   set I_Y0 = Field_DataSize*(Y / Field_Size) // ok
  124.   set I_Y1 = I_Y0 + Field_DataSize           // ok
  125.  
  126.   //call DisplayTextToForce( GetPlayersAll(), ((("P1( " + I2S(I_X0)) + (" / " + I2S(I_Y0))+ " ) P2( ")+ (I2S(I_X1) + (" / " + (I2S(I_Y1) + " )")))))
  127.  
  128.  
  129.   set WertX0 = Interpoliere(GetValue(I_X0,I_Y0),GetValue(I_X1,I_Y0),ModuloInteger(X , Field_Size),Field_Size)
  130.   set WertX1 = Interpoliere(GetValue(I_X0,I_Y1),GetValue(I_X1,I_Y1),ModuloInteger(X , Field_Size),Field_Size)
  131.  
  132.   set Ergebnis = Ergebnis + (2*Interpoliere(WertX0,WertX1,ModuloInteger(Y , Field_Size),Field_Size))
  133.  
  134.  
  135.   return (Ergebnis*1000)/Max
  136. endfunction
  137.  


unter Delphi so:
Code:
  1.  
  2. type
  3.   TbgrPixel =
  4.   record
  5.     b,g,r:byte;
  6.   end;
  7. const
  8.   Interpolation_Max=1000;
  9.   Size=64;
  10.   DataSize=65;
  11.   Interpolation_Bereich=Size;
  12.  
  13.  
  14.   //Ebenen array [0..3] of Integer = (256,128,64,32)
  15. var
  16.   Wert:array [0..DataSize*DataSize-1] of Integer;  //4226=(64+1)^2-1
  17.   Interpolation:array [0..Interpolation_Bereich-1]of Integer;
  18.  
  19. function GetValue(X,Y:Integer):Integer;
  20. begin
  21.   if X >= DataSize then
  22.   begin
  23.     raise ERangeError.CreateFmt('X Wert %d nicht in %d',[X,DataSize-1]);
  24.     //X := DataSize-1;
  25.   end;
  26.   if Y >= DataSize then
  27.   begin
  28.     raise ERangeError.CreateFmt('Y Wert %d nicht in %d',[Y,DataSize-1]);
  29.     //Y := DataSize-1;
  30.   end;
  31.   result := Wert[X + Y*(DataSize-1)];
  32. end;
  33.  
  34. procedure CreateValues;
  35. var
  36.   i:Integer;
  37. begin
  38.   randomize;
  39.   for i := 0 to high(Wert) do Wert[i] := random(1000);
  40.   for i := 0 to high(Interpolation) do Interpolation[I] := round((cos(pi/(Interpolation_Bereich-1)*i)+1)/2*Interpolation_Max);
  41. end;
  42. function Interpoliere(Wert1,Wert2:Integer;Nr,Von:Integer):Integer;
  43. // Hinweis \"Von\" muss kleiner als der Interpolation_Bereich sein und der Form 2^n entsprechen
  44. begin
  45.   if Nr > Von then raise ERangeError.CreateFmt('Nr Wert %d nicht in 0..%d',[Nr,Von-1]);
  46.    result := (Wert1*(Interpolation[Nr*(Interpolation_Bereich div Von)])) div Interpolation_Max
  47.            + (Wert2*(1000-Interpolation[Nr*(Interpolation_Bereich div Von)])) div Interpolation_Max;
  48. end;
  49. function Berechne(X,Y:Integer):Byte;
  50. var
  51.   Ergebnis:Integer;
  52.   WertX0,WertX1:Integer;
  53.   I_X0,I_X1:Integer;
  54.   I_Y0,I_Y1:Integer;
  55.   Level:Integer;
  56.   Field_Size,Field_DataSize:Integer;
  57.   Max:Integer;
  58. begin
  59.   //Ebene 1
  60.  
  61.   Level := 2;
  62.   Max := 500;
  63.   Field_Size:=Size div Level;
  64.   Field_DataSize := (DataSize-1) div Level;
  65.  
  66.   I_X0 := Field_DataSize*(X div Field_Size);
  67.   I_X1 := I_X0 + Field_DataSize;
  68.   I_Y0 := Field_DataSize*(Y div Field_Size);
  69.   I_Y1 := I_Y0 + Field_DataSize;
  70.  
  71.   WertX0 := Interpoliere(GetValue(I_X0,I_Y0),GetValue(I_X1,I_Y0),X mod Field_Size,Field_Size);
  72.   WertX1 := Interpoliere(GetValue(I_X0,I_Y1),GetValue(I_X1,I_Y1),X mod Field_Size,Field_Size);
  73.   Ergebnis := Interpoliere(WertX0,WertX1,Y mod Field_Size,Field_Size) div 2;
  74.  
  75.   //Ebene 2
  76.  
  77.   Level := 4;
  78.   Max := Max + 1000;
  79.   Field_Size:=Size div Level;
  80.   Field_DataSize := (DataSize-1) div Level;
  81.  
  82.   I_X0 := Field_DataSize*(X div Field_Size);
  83.   I_X1 := I_X0 + Field_DataSize;
  84.   I_Y0 := Field_DataSize*(Y div Field_Size);
  85.   I_Y1 := I_Y0 + Field_DataSize;
  86.  
  87.   WertX0 := Interpoliere(GetValue(I_X0,I_Y0),GetValue(I_X1,I_Y0),X mod Field_Size,Field_Size);
  88.   WertX1 := Interpoliere(GetValue(I_X0,I_Y1),GetValue(I_X1,I_Y1),X mod Field_Size,Field_Size);
  89.   Ergebnis := Ergebnis + Interpoliere(WertX0,WertX1,Y mod Field_Size,Field_Size);
  90.  
  91.   // Ebene 3
  92.   Level := 16;
  93.   Max := Max + 1000;
  94.   Field_Size:=Size div Level;
  95.   Field_DataSize := (DataSize-1) div Level;
  96.  
  97.   I_X0 := Field_DataSize*(X div Field_Size);
  98.   I_X1 := I_X0 + Field_DataSize;
  99.   I_Y0 := Field_DataSize*(Y div Field_Size);
  100.   I_Y1 := I_Y0 + Field_DataSize;
  101.  
  102.   WertX0 := Interpoliere(GetValue(I_X0,I_Y0),GetValue(I_X1,I_Y0),X mod Field_Size,Field_Size);
  103.   WertX1 := Interpoliere(GetValue(I_X0,I_Y1),GetValue(I_X1,I_Y1),X mod Field_Size,Field_Size);
  104.   Ergebnis := Ergebnis + Interpoliere(WertX0,WertX1,Y mod Field_Size,Field_Size);
  105.  
  106.  
  107.   //Ebene 4
  108.   Level := 64;
  109.   Max := Max + 1000;
  110.   Field_Size:=Size div Level;
  111.   Field_DataSize := (DataSize-1) div Level;
  112.  
  113.   I_X0 := Field_DataSize*(X div Field_Size);
  114.   I_X1 := I_X0 + Field_DataSize;
  115.   I_Y0 := Field_DataSize*(Y div Field_Size);
  116.   I_Y1 := I_Y0 + Field_DataSize;
  117.  
  118.   WertX0 := Interpoliere(GetValue(I_X0,I_Y0),GetValue(I_X1,I_Y0),X mod Field_Size,Field_Size);
  119.   WertX1 := Interpoliere(GetValue(I_X0,I_Y1),GetValue(I_X1,I_Y1),X mod Field_Size,Field_Size);
  120.   Ergebnis := Ergebnis + Interpoliere(WertX0,WertX1,Y mod Field_Size,Field_Size);
  121.  
  122.   result := (Ergebnis*255) div Max;
  123.  
  124.  
  125. end;
  126.  
  127.  
  128. procedure TForm1.Button1Click(Sender: TObject);
  129. var
  130.   x,y:Integer;
  131.   BM:TBitmap;
  132.   P: ^TbgrPixel;
  133. begin
  134.   BM := TBitmap.Create;
  135.   try
  136.     BM.Width := Size;
  137.     BM.Height := Size;
  138.     CreateValues;
  139.     BM.PixelFormat := pf24bit;
  140.     for y := 0 to BM.Height-1 do
  141.     begin
  142.       P := BM.ScanLine[Y];
  143.       for x := 0 to BM.Width-1 do
  144.       begin
  145.         // P.r := Interpoliere(0,255,X div 4,64);
  146.         P.r := Berechne(x,y);
  147.         P.g := P.r;//Interpoliere(255,0,X div 4,64);
  148.         P.b := P.r;
  149.         Inc(P);
  150.       end;
  151.     end;
  152.     Canvas.Draw(0,0,BM);
  153.   finally
  154.     BM.free;
  155.   end;
  156. end;
  157.  


MfG
Flo

PS: Mein Warcraft 3 Account ist: Editor-Fan[InF] - Vielleicht sehe ich den einen oder andern ja noch im Battle.net ;)[/quote]

_________________
Danke an alle, die mir (und anderen) geholfen haben.
So weit... ...so gut


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jun 08, 2005 12:18 
Offline
DGL Member

Registriert: Sa Jan 22, 2005 21:10
Beiträge: 225
Kannst du das auch auf Gewässer und Berge übertragen? Das also praktische die gesammt Karte zufällig erstellt wird? Das wäre dann echt mal ein cooles Tool...

_________________
[18:30] tomok: so wie ich das sehe : alles. was nich was anderes ist als nen Essay ist nen Essay

hi, i'm a signature viruz, plz set me as your signature and help me spread :)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jun 08, 2005 12:37 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jun 19, 2003 10:44
Beiträge: 991
Wohnort: Karlsfeld (nahe München)
Es handelt sich ja hierbei nicht um ein Tool sondern um Skript was in der Karte integriert ist.

Der Wald (und neuerdings auch die Wege durch den Wald) werden dann erst beim laden der Karte generiert. Also kurz bevor die Spieler die Karte sehen.(Theoretisch wäre es auch beim Spiel möglich jedoch befürchte ich, dass es aufgrund des Rechenaufwandes zu Server Splits kommen könnte)

Neben dem Wald und den Wegen könnte man theoretisch vom Gelände her auch noch die Höhe abändern. Klippen sind allerdings nicht möglich, da Blizzard keine entsprechende Funktion zu Verfügung stellt.

Gewässer könnte man vielleicht noch durch einen Trick realisieren. Man könnte die ganze Karte als seichtes Gewässer erstellen und durch Anhebung des Geländes Land erzeugen. Hierbei hat man allerdings das Problem das Höhenveränderungen beim Speichern eines Spielstandes nicht mitgespeichert werden. Wenn man dann den Spielstand läd sind sämtliche Höhenunterschiede und somit auch Gewässer dahin.

Bei einem Externen Tool welches dir Karten erstellt hätte man diese Problemme nicht. Allerdings habe ich ein solches Tool nicht programmiert. Wenn du so ein Tool programmieren willst, kann ich dir allerdings mal so grob sagen, wie ich so ein Tool programmieren würde.

MfG
Flo

_________________
Danke an alle, die mir (und anderen) geholfen haben.
So weit... ...so gut


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jun 08, 2005 16:36 
Offline
DGL Member

Registriert: Sa Jan 22, 2005 21:10
Beiträge: 225
Das es im Endeffekt ein Script ist, hab ich schon verstanden...

Das man Höhenänderungen nicht speichern kann - nun ja, die von Blizzard haben sicherlich nicht damit gerechnet, dass du so ein Teil schreibst. Aber wenn man auf ner LAN n Spiel gegen paar Freunde macht, dann speichert man sowieso nicht - höchstens das Replay wenn man gewonnen hat, was bei mir aber sowieso nie vorkommt. :cry:

Wie auch immer, ich find das cool, auch wenn nur die Bäume zufällig sind. Wie kann man das Script benutzen?

_________________
[18:30] tomok: so wie ich das sehe : alles. was nich was anderes ist als nen Essay ist nen Essay

hi, i'm a signature viruz, plz set me as your signature and help me spread :)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jun 08, 2005 18:59 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jun 19, 2003 10:44
Beiträge: 991
Wohnort: Karlsfeld (nahe München)
Die Berechnungen mache ich mit den schon hier geposteten Zufallsfunktionen. In einem Auslöser werte ich diese dann nur noch aus. Meine Map, die diese Zufalls funktion integriert hat, ist allerdings keine Standart Map sondern eine Fun-Map.
Meine Map werde ich bald fertig haben. Wenn du willst kannst du dann gerne mal bei einem Spiel mitspielen. Melde dich einfach bei mir per PM damit wir uns da nicht verpassen.

Die Funktionen aus meiner Map in eine eigene Map zu integrien dürfte nicht schwer sein. Als erstes müsstest du die Auslöser rüber kopieren mit der Option: "Generiere autmatisch fehlende Variablen". Anschließen bräuchtest du die JASS Funktionen nur noch ganz oben im Auslöser-Baum einfügen.

MfG
Flo

_________________
Danke an alle, die mir (und anderen) geholfen haben.
So weit... ...so gut


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jun 08, 2005 19:26 
Offline
DGL Member

Registriert: Do Apr 08, 2004 16:55
Beiträge: 516
Die Map wird beim Spielstart generiert??? Gibt das nicht Syn Probs??

_________________
Shareholder und Leitender Entwickler bei Pipedream-Games.

Zitat: Siehst du diesen Park da unten? Jeden Tag lernen sich darin Menschen kennen und verlassen einander. Und du hast dein ganzes Leben Zeit darin zu gehen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jun 08, 2005 19:53 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 14, 2004 18:56
Beiträge: 804
Wohnort: GER/OBB/TÖL-WOR/Greiling
wenn der host die karte generiert und sie dann zu den clients übetragen wird, nein wieso?

_________________
Bild

"User Error. Replace User and hit Continue."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jun 16, 2005 12:31 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jun 19, 2003 10:44
Beiträge: 991
Wohnort: Karlsfeld (nahe München)
Die fertige Map findet ihr auf wc3sear.ch unter diesem Link:

http://www.wc3sear.ch/?p=Maps&ID=5233

MfG
Flo

_________________
Danke an alle, die mir (und anderen) geholfen haben.
So weit... ...so gut


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 15 Beiträge ] 
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 20 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.011s | 16 Queries | GZIP : On ]