globale- oder locale variablen?

  • GM 8
  • globale- oder locale variablen?

    Hallo,
    ich habe für mein Spiel fast alles fertig, Graphik, Mucke und vor allem Die benötigte Mathematik und Logik. Habe mir einen schriftlichen Leitfaden gemacht und in Excell alle Formeln simulliert.
    Nun aber gehts ans scripten...bereitet es mir doch mehr Sorgen als ich dachte. Bevor ich mich schon zu Beginn auf den Holzweg begebe habe ich einige grundsätzliche Fragen, aber zuerst eine grobe Beschreibung:

    --Eine scrollbare Map mit 60 unterschiedlichen Orten (Großstadt, Kleinstadt Dorf...) ist vorhanden und funktioniert
    --In jedem Ort können unterschiedliche Ressourcen gewonnen werden und zu versch. Produkten weiterverarbeitet werden.
    (In einem Wüstenort ist zB. der Faktor für Wasserproduktion natürlich 0, in einem Ort an der Küste 1,5, alle Produktionsfaktoren sind abhängig vom Ort und dem Ausbau der Fabrik.)
    --Es gibt 10 (evtl 12) Ressourcen, ca 18 - 20 versch. Gebäude. (Nur die Orte sind graphisch vorhanden, die Gebäude nur virtuell.)
    --Ressourcen verden von Fahrzeugen (Art und Menge noch nicht festgelegt) zwischen den Orten transportiert, ebenfalls nur virtuell.)
    --nach klick auf einem Ort sin alle Daten (Mengen, Fabrik-Status, Energieverbrauch....)auf dem Panel sichtbar.

    Das sollte genügen um sich ein Bild zu machen.

    Habe die Hilfe und das GML-Tut rauf und runter gelesen, ich glaube nun, das ich das mit D&D wohl nicht erreichen werde, ich mu? wohl scripten...

    Sind hier globale Variablen und Arrays besser oder sind die lokale-(member)-Variablen besser geeignet?
    (An Datenstrukturen traue ich mich noch nicht ran, zumal ich mich zusätzlich umsave-load kümmern müsste!)Wenn ich Arrays verwende, kann ich sie in den game-setings als Konstanten eingeben?
    Wenn ich bei der Deklaration der Arrays Werte eingebe, (In der Hilfe finde ich nichts) wie sieht es in GML aus?
    Ich kenne es aus anderen Sprachen so:

    Menge[60] = {22, 589, 444, blablubber...};
    wie siehts in GML aus?

    Ich bin mir klar darüber, das es eine Menge Arbeit ist, es lohnt sich. Viele Freunde haben mit mir gemeinsam das Spiel durchsimuliert (so gut es ging in Excell) und treiben mich mach mach mach endlich.

    Gruß Maschine
    Eine Stimme sprach zu mir: "Lächle und sei froh, es könnte schlimmer kommen!"
    Ich lächelte und war froh, und es kam schlimmer... :heul:
  • Mit globalen arrays ist das ganze gut zu lösen. Du könntest zum Beispiel das Vorkommen eines Rohstoffes für jede Region beim Spielstart damit bestimmen. Ebenso die Ressourcen eines Ortes.

    GML-Quellcode

    1. global.produktionsfaktor[0] = 1.5;
    2. global.produktionsfaktor[1] = 0;
    3. // Hier steht zum Beispiel 0 für die Küste und 1 für die Wüste. Um dir die Verwaltung einfacher zu machen, kannst du, wie du schon erwähnt hast, Konstanten mit den Ortsnamen anlegen und ihnen diese Werte zuweisen.
    4. // Dann kannst du zb so auf den Faktor zugreifen:
    5. global.produktionsfaktor[ort_kueste] = 1.5;
    6. global.produktionsfaktor[ort_wueste] = 0;
    7. // ort_kueste und ort_wueste hast du dann zb bei den Konstanten die Werte 0 und 1 zugewiesen.
    8. // Ebenso könntest du auch die Rohstoffe eines Ortes speichern:
    9. global.rohstoff_holz[ort_kueste] = 10;
    10. // usw ...
    11. // Noch mehr verkürzen könntest du es mit weiteren Konstanen und einem 2-Dimensionalen Array:
    12. global.rohstoff[ort_kueste, roh_holz] = 10;
    Alles anzeigen


    Aber das solls erst mal gewesen sein. Ich denke zwar, dass dein Vorhaben nicht leicht sein wird, aber lass dich nicht entmutigen GML zu lernen.

    © 2008 by Teamgrill Productions
  • Hallo MasterXY,

    Deiner Antwort entnehme ich, das Arrays zu bevorzugen sind. Allerdings sehe ich in Deinem Code, das jedes Array-Element in einer eigenen Zeile den Wert zugewiesen wird. geht es nicht so oder ähnlich wie beschrieben?

    Menge[60] = {22, 589, 444, blablubber...};
    zb.
    var z = 0; //Zählvariable, bzw ID pro Ort
    Sägewerk[60] ....(Zuweisung von 60 Werten)
    Bei klick auf Ort[5] z = 5
    Sägewerh[z] =28 // bedeutet Sägewerk mit der ID 5 hat die Ausbaustufe 28.

    Wenn ich mir vorstelle, ich habe 60 Zeilen zu schreiben mit den Werten für die Sägewerke...
    und jeweils 60 Zeilen für ca 20 weitere Fabriken,

    dazu die Multiplikatoren die Ortsabhängig sind...usw

    Ich habe das Spiel angefangen mit 3d gamestudio von Conitech, da kann man es so machen... hatte dort aber das Problem beim Klick auf das Objekt diesem den passenden Array-Index zu geben, ging nur auf Krücken, hoffe mit GML ist es einfacher. Es kommt ja noch das wichtigste hinzu, die Mathematik (der Produktionsfluss, Abnahme der Rohstoffe mit samt der Überprüfung, Verbrauch von Energie...) das alles muß ja in einer dauernden Schleife laufen (in meinem Spiel ist die Taktzeit 4sek)

    Da kommen schon noch reichlich Codezeilen auf mich zu, und dann noch die einzelne Deklaration der Arrays? Puuuh!
    Hat das nicht schon mal jemand ausprobiert? bin neugierig auf Antworten.

    Gruß Maschine
    Eine Stimme sprach zu mir: "Lächle und sei froh, es könnte schlimmer kommen!"
    Ich lächelte und war froh, und es kam schlimmer... :heul:
  • Du kannst die Arrays innerhalb einer Schleife füllen. Um z.B. beim Start jedem Ort gleich viele Ressourcen zu geben. Der GM unterstützt allerdings nicht solche Arrays, wie man es teilweise von anderen Programmiersprachen gewohnt ist. Das Array kann im GM maximal zweidimensional sein (array[x,y]) und pro Zahlenkombination nur einen Wert haben (array(1,2)="Text1" / array(1,8)=1.456)

    EDIT:

    GML-Quellcode

    1. for (i=0; i<anzahl orte; i+=1)
    2. {
    3. rohstoff[i,roh_holz] = 20;
    4. // Oder andere zuweisungen.
    5. }


    Ganz hab ich dein Problem allerdings nicht verstanden. Du hast für alle Produktionsgebäude um die 60 Werte? Wofür denn?

    © 2008 by Teamgrill Productions
  • Okay,

    wenn also zb 40 von 60 Array-Inhalten den gleichen Wert haben zb 100, die übrigen 20 jeweils andere, verschiedene Werte, dann kann ich trozdem ersteinmal eine Schleife 60mal durchlaufen und danach explizit die 20 abweichenden Werte einzeln neu vergeben.

    Wenn es so ist habe ich ja schonmal 40 Deklarationen gespart...hab ich es richtig verstanden?

    Hast Du einen Tip wie ich bei Mausklick auf ein Objekt dieses Objekt nun mit dem Passendem Array-Index in Verbindung bekomme?
    Denn auf diesem Index muß ich ja beziehen bei jeder Berechnung die zu diesem Objekt gehört

    Gerade fällt mir ein: Ist es sinnvoller 60 einzelne Objekte im Editor zu plazieren um dann auf die eigene ID zu kommen, oder sollte man zb 3 Objekte(Großstadt, Kleinstadt, Dorf)und entsprechend viele Instanzen davon erstellen?

    Und noch ein Ding...In der deutschen Hilfe gibt es unter Global Game Setings die Registerkarte "Konstanten". In meiner Version (GM8pro) gibt es die nicht...Ich kann die Konstanten doch auch in das room Start event des ersten Raumes eingeben, oder kommt es dann zu irgendwelchen Konflickten?
    Nun aber genug Fragen :P

    Gruß Maschine
    Eine Stimme sprach zu mir: "Lächle und sei froh, es könnte schlimmer kommen!"
    Ich lächelte und war froh, und es kam schlimmer... :heul:
  • 1. Richtig
    2. Speicher einfach bei den ausschlaggebenden Objekten die ID ein zu welcher Stadt sie gehören.
    3. Die Frage verstehe ich nicht komplett. Was willst du bezwecken?
    4. Im GM8 befinden sich die Konstanten unter Ressources

    © 2008 by Teamgrill Productions
  • zu Frage drei:

    Ich habe zb
    15 Großstädte,
    20 Kleinstädte,
    25 Dörfer;

    Also 3 Typen von Objekten, zusammen 60 Instanzen...
    Ich glaube gerade ich kann es mir selbst beantworten, da die 60 Orte auch 60 unterschiedliche Sprites besitzen, müssen es alles Objekte sein. Außerdem finden ja zeitgleich auf allen Orten andere Aktionen, oder garnichts statt, je nach Status (Ort befindet sich in meinem Besitz,Ja/Nein, unterschiedlich hohe Ausbaustufen der Fabriken usw)

    habe vorhin mal schnell ein paar Konstanten im room-creationscode eingegeben, da ich nun von Dir höre wo sie hingehören will ich sie nun dort löschen ???? Aber wo bitte versteckt der GM den room-creation-code???

    Mal so nebenbei bemerkt: In vielen Foren hätte ich jetzt schon "dumme bis beleidigende Antworten erhalten, aber ich glaube an meine Idee und habe Spaß daran... Also dickes Lob für Deine Geduld. Mit hilfe aller Antworten die ich in diesem Forum je erhalten habe bin ich weiter gekommen als mit all den anderen Engines die probiert habe.

    Gruß Maschine
    Eine Stimme sprach zu mir: "Lächle und sei froh, es könnte schlimmer kommen!"
    Ich lächelte und war froh, und es kam schlimmer... :heul:
  • Naja man könnte theoretisch auch alles in einem Objekt ablaufen lassen, ist aber eher ungeeignet für Anfänger und auch nicht immer die beste Lösung. Mit der Zeit in der man mit dem GM arbeitet lernt man, sich auf immer weniger Objekte zu beschränken.

    Wie bist du denn in den Room-Creation Code gekommen, wenn du ihn jetzt nicht mehr findest? :P
    Im Room klickst du auf settings und dort ist auch schon der Button für den Room-Creation Code. Es hätte natürlich auch mit deiner Variante funktioniert, allerdings hast du den Vorteil mit Konstanten, dass diese in der Auto-Vervollständigen-Liste angezeigt werden und zudem farblich markiert sind und die Übersicht fördern.

    © 2008 by Teamgrill Productions
  • Mein Fehler...

    habe garkeine Konstante dort eingegeben, folglich sehe ich natürlich nichts...Ich hatte mich entschieden in das create-event meines Controlerobjektes eine Konstante für die Geschwindigkeit mit der ich meine Map bewege einzugeben...Die bösen Fingerchen waren schneller als der Kopf, dort hatte ich es im room-create-code eingegeben.

    Habe nun viel Stoff zum Probieren, sehe meine Fragen als vorläufig geklärt, will den Mund aber mal nicht zu voll nehmen!

    Maschine
    Eine Stimme sprach zu mir: "Lächle und sei froh, es könnte schlimmer kommen!"
    Ich lächelte und war froh, und es kam schlimmer... :heul:
  • Benutzer online 1

    1 Besucher