Problem mit Wiederholung und Variablen [How-To]

Joined
May 2, 2011
Messages
6
Reaction score
0
Hallo erst mal,
Um bei meiner TD map meine Waves nacheinander spawnen zu lassen will ich eine schleife verwenden mit folgender Funktion:

Wiederhole x mal
variable i = variable i +1
erzeuge einheit aus variable einheit(i)
erzeuge variable einheitenanzahl(i) * einheiten


In worten ich will meine variable i immer um 1 erhöhen und dann meine anderen variablen an dies an passen.
also soll statt variable: einheit(i) statt i der aktuelle intagerwert eingetragen werden
da ich in den namen einer variable keine andere variable einbauen kann ;) habe ich nun ein problem

Nun meine Frage weis jemand wie ich diese Problem lösen bzw. umgehen oder anders lösen kann

Danke im vorraus

mfG

Blackyyy
 
:welcome im UF.

Boa...vom Maps erstellen hab ich leider keine Ahnung. Ich hoffe dezi wird hier noch reinschnuppern und dir helfen können.
 
Danke dir

Da wird schon nochmal jemand vorbeischauen

Ich hab nun noch einen weiter idee falls die beschreibung oben nicht ausführlich genug ist.
ich will sozusagen ein feld wie bei JAVA erstellen hab leider nur nicht so viel Kenntnisse mit JASS.
 
yo wilkommen im UF ich persönlich hab wohl auch keine ahnung vom Map editor hab mich nie damit befasst sry :(
aber Dezi ist ziemlich viel mit dem Map editor am rum fuchteln vll kann er dir ja helfen der schaut hier bestimmt noch rein :)
 
dezi ist nen Kacknap was Trigger angeht, der baut nur Meleemaps :p

tbH hab ich aber auch krasse Defizite gerade was Variablen angeht, habe versucht die zu vermeiden.
Bei deinem Beispiel fällt mir spontan aber auch nichts anderes ein.

Darum würde ich dir, schweren Herzens^^, empfehlen, dass du hier mal rumfragts http://www.sc2mapster.com/
Die Jungs dort haben echt Ahnung.
Wollte mich eigentlich auch mehr damit befassen, da aber dieses verkackte Blizzard mit nem Patch meine gesamte Arbeit vernichtet hat habsch keine Lust mehr :/

Wie auch immer, wäre schön wenn du, solltest du eine Lösung gefunden haben, diese dann hier postest, vielleicht verirren sich ja doch nochmal paar Mapper hierher, wäre schön :)

Ach und :welcome im UF
 
Last edited:
Die Lösung .....

NAja ich machs jetzt auf die stupide art und weise, falls doch jemand ne möglichkeit weis wie ich ein "JAVA-Feld" definieren kann dann immer her damit.

Hier meine Lösung;
Verbesserungsvorschläge Erwünscht,
Für einsteiger vielleicht auch ganz Hilfereich,
Erklärungen in Klammern (())
falls was unklar is einfach fragen. :)

Wave 001
Ereignisse
Timer - Verstrichene Zeit beträgt 30.0 Spielzeit Sek. ( erklärung: erste Wave spawnt nach 30 s.)
Lokale Variablen
keine
Bedingungen
keine
Aktionen
Allgemein - (Aktionen) 25 Mal wiederholen (erklärung: 25 mal 1 einheit spawnen: sonst blocken sie sich gegenseitig, und die globale Variable Supply (intager; von beginn auf 0 gesetzt) um 1 erhöhen, dazu nachher mehr:), anzahl an wiederholungen kann auch nach belieben angepasst werden je nach dem wie viele einheiten spawnen sollen )
Aktionen
Allgemein - 1.0 Sekunde warten
Einheit - 1 (beliebige Einheit) für Spieler 15 bei Region 011) mit Ausrichtung 270.00 Grad erstellen (Keine Optionen)(erklärung: beliebige einheit für Spieler 15 : der ist immer feindlich Mitte Region 011 ist einfach eine Region in der die Einheiten gespwnt werden sollen, Ausrichtungswinkel ist eigentlich egal)
Variable - Supply anpassen + 1
---------Wiederholung ende
Allgemein - (Aktionen) für immer wiederholen
Aktionen
Allgemein -Wenn (Bedingung), dann führe (Dann) Aktion aus, sonst führe (Sonst) Aktion aus.
(erkärung: erstellt eine Bedingung und was passiert wenn sie erfüllt wird und was wenn nicht)
Falls
Supply == 0 (erklärungn: wenn supply = erreicht wird die (Dann) Aktion ausgeführt)
Dann
Auslöser - Wave 002 starten (erklärung starte wave 002 welche wiederum das gleiche skript wie wave 001 eins besitz jedoch die name angepasst (bsp statt wave 002 ==> 003 .....) für jede weiter Welle muss ein neuer Auslöser erstellt werden)
Allgemein - Unterbrechen (erklärung: Endlosschleife abbrechen nachdem Auslöser Wave 002 gestarte wird)
Sonst
Allgemein - 0.1 Sekunden in Spielzeit warten ( erklärung: wartet 0.1 sekunden und starten dann sie endlosschleife von neu)
---------Wiederholung ende


Nun werden noch ein paar andere Auslöser gebraucht

- 2 einfache Aulöser die einfach nur die Variable Supply um 1 verkleiner wenn eine Einheit von spieler 15 getöten wird oder entfernt wird. Somit kann man dafür sorgen das die nächste Wave erst dann spawn wenn die erste tot oder am ende verschwunden ist.
- mehre Aulöser die die Gegner über die map bewegen lassen ( das is ganz einfach überlegt es euch selbst ;) falls ihrs nicht schafft pm me ^^)
- und zu guter letzt einen aulöser der die Einheiten entfernt die das ende der map errreicht haben.


So das ganze wurde jetzt doch länger als ich dachte aber villeicht hilfts ja jemand .....
oder auch nicht ;)
Hab auch noch 4 Screens angehangen da sollte es wesentlich besser zu sehen sein

mfG
Blackyyy
 

Attachments

  • screen 001.JPG
    screen 001.JPG
    59.7 KB · Views: 17
  • Screen 002.JPG
    Screen 002.JPG
    32 KB · Views: 5
  • Screen 003.JPG
    Screen 003.JPG
    27.5 KB · Views: 7
  • Screen 004.JPG
    Screen 004.JPG
    26.9 KB · Views: 5
Sehr geil, danke dir ;)
Hoffe du stellst die Map hier rein wenn sie fertig ist :)
 
Mit sicherheit dauert, haber noch ne gnaze zeit bin nämlich bald erst mal en woche weg aber dannach ^^
 
Ich möchte dir noch eine Alternative vorschlagen, da deine Methode doch sehr aufwändig ist in meinen Augen ;)
Zunächst einmal brauchst du 3 Globale Variablen (Namen frei wählbar):
Global%20Vars.PNG

CreepTyp ist eine Einheitentyp/Unit Type Variable mit einem Haken bei "Array" (bin mir nicht sicher obs in der deutschen Version ebenso heißt) mit der "Size" von 25 (Dies entspricht der Anzahl der Level, kannst du nach deinem belieben wählen).
Sieht im Editor bei mir so aus:
CreepTypVar.PNG

"CreepNum" ist ein Integer und ebenfalls ein Array mit derselben Größe wie "CreepTyp", Level ist auch ein Integer aber _kein_ Array.

Nun brauchen wir einen SpawnTrigger:
SpawnTrigger.PNG

Der Ereignisse/Event ist in dem Fall freigelassen, da kannst du einsetzen was du gerne möchtest ;)
Zur Erklärung:
Zum einen wird bei dieser Variante bedingt durch die For-each-Schleife eine Integervariable benötigt. Da wir dafür auf keine Globale-Variable sondern auf eine Lokale zurückgreifen wollen, wird eine Lokale-Variable "i" (integer) definiert. Anschließend wird unter Allgemein die Schleife gesucht, und im Variablenfeld "i" ausgewählt. Starten sollte die Schleife bei 1 und Enden sollte diese bei "CreepNum", Increment kann bei 1 belassen werden. Nun wird er noch bei CreepNum einen Index haben wollten dort wählst du die Variable Level aus (Erklärung dazu später). Die Schleife soll dabei jeweils eine Einheit von dem Wert die die Variable "CreepTyp" für den Index Level hat erzeugen und diese "Last Created unit" wird anschließend mit einem "Move" befehl dazu genötigt sich zu bewegen. Zum abschluss noch ein wait damit alle nicht instant spawnen.

Soweit ist der Trigger aber noch nicht funktionsfähig. Damit überhaupt Creeps spawnen müssen wir den Variablen "CreepTyp" und "CreepNum" noch einen Wert zuweisen. Dazu erstellen wir einen weiteren Trigger "Creeps zuweisen":
CreepsZuweisen.PNG

Als Event hab ich "Map initialization" gewählt, da dieser Trigger mit als erstes ausgeführt werden _muss_! Anschließend werden den Variablen "CreepTyp" und "CreepNum" die jeweiligen Werte mit dem Index zugewiesen. [1] = Level 1; [2] = Level 2 und so weiter. Dabei gibt "CreepTyp" immer die Einheit die in dem jeweiligen Level erzeugt werden soll an und "CreepNum" immer wie viele erzeugt werden sollen.

Um festzustellen, ob alle "Creeps" tot sind kann dann folgender Trigger verwendet werden:
NextLevel.PNG

Der Trigger löst damit jedesmal aus, wenn sich das Supply von Spieler 9 ändert und vergleicht dann, ob dies gleich 0 ist. Sollte dies der Fall sein, wird die Variable Level um eins Erhöht und es könnte die nächste Welle spawnen oder sonstige Aktionen folgen. Aufpassen musst du allerdings bei Einheiten wie dem Zergling, wo zwei Einheiten 1 Supply kosten (ich würd daher die Kosten auf 1 Supply erhöhen pro Stück)

Hoffe das ist alles soweit klar wie ich das meine, falls du dazu noch fragen hast versuch ich die gerne zu beantworten ;) Der Vorteil daran ist das du wesentlich weniger Trigger benötigst, dir damit eine Menge arbeit sparst und das ganze auch übersichtlicher werden sollte.

Eine funktionsfähige Version der Map kanns du hier bekommen:
Download
 
Danke dir, so hatte ich das auch eigentlich geplant, hab aber leider die "JAVA-FELD" möglichkeit nicht gefunden.
Werd ich dannn gleich mal umsetzen.

Eine frage habe ich noch.
Wie schaffe ich es das die nächste wave nicht instant spawnt.
Muss ich dazu einen wait befehl vor die for-each-Schleife setzten, denn innerhalb wäre ja sinnlos ^^

Trotzdem großten dank hast mir viel schreibarbeit erspart.
 
Last edited:
Hey Skanjin :welcome im UF, schön paar neue Mapper vorzufinden :D
 
Blackyyy und Skanjin erhalten beide eine Strategiemedaille für ihre detaillierten Ausführungen zum Worldbuilder.
 
Das ist gar kein Problem, jedoch würde ich statt Wait lieber Timer verwenden, die lassen sich schön anzeigen und man kann allgemein besser mit ihnen Arbeiten. Als Resultat sollte dann sowas Ingame entstehen:
TimerIngame.jpg

In der von mir verlinkten Map hatte ich das ja bereits umgesetzt, aber hier noch einmal die nötigen Schritte:

Zuerst musst du wieder zwei normale Variblen anlegen zum einen eine Variable vom Typ "Timer" und die andere vom Typ "TimerWindow" (könnte in der deutschen Version anders heißen):
TimerVars.PNG


Anschließend musst du zuerst einmal ein TimerWindow erstellen und am besten auch gleich den ersten Timer auslösen. Die benötigten Aktionen findest du in der Kategorie "Timer" (deutsch kann mögl. wieder anders heißen) und Zeitwerte und Text kannst du ja nach belieben frei wählen. (Als Ereignis würde ich Map Initialization oder Time Elapsed wählen). Um später bequem auf das von dir erstellte Timer Window zugreifen zu können, musst du die Variable noch manuell zuweisen mit einem "Set Variable". Sollte dann so in etwa aussehen:
TimerInit.PNG


Anschließend müssen die bestehenden Trigger noch angepasst werden, dabei beginnen wir mit dem Spawn Trigger. Hier muss praktisch nur das Ereignis "Timer - Elapsed" mit der von dir erstellten und gestarteten Timer-Variable hinzugefügt werden. Unter Aktionen kann man noch "Timer - Hide Timer Window" hinzufügen, da man sonst oben in der Ecke den Timer bei 0:00 stehen hat (also was rein kosmetisches ;) ):
SpawnTrigger2.PNG


Ebenfalls muss der NextLevel-Trigger geändert werden, damit wir alles von selbst "rennt". Dazu werden zwei Aktionen eingefügt. Zum einen muss der Timer erneut gestartet werden. Dazu wird die Aktion "Timer-Start" verwendet und solltest du das "Timer-Window" versteckt haben, würd ich das natürlich wieder anzeigen lassen "Timer - Show/Hide Timer Window".
NextLevel2.PNG


Solltest du natürlich ein Wait vorziehen dürfte dies vor der Schleife ausreichen.

@ Kasian:
Danke :wink
 
Du wirst doch nicht etwa doch im Editor rumpfuschen Ingo? OO
 
Danke dir ein weiteres mal,
Sehr deailiert (wie auch immer man das schreibt^^)
 
Back
Top