erastz für "struct" - Anregungen

  • erastz für "struct" - Anregungen

    Tach nochmal!

    Ich mache zur Zeit einen "Harvest Moon"-Clone zur Übung.
    Ich habe jetzt das Problem dass ich irgendwie (möglichst nicht) zentral Pflanzeneigenschaften speichern will, also sowas wie Zeit bis zur Reife, Verkaufspreis der Feldfrüchte, Jahreszeit in der die Pflanze wächst etc.

    Der Spieler soll sich mit Samenbeuteln ausrüsten können, mit denen man dann auf gepflügten Feldern säen kann. Das Feld hat dann Eigenschaften welche Pflanze darauf wächst, wie lange sie bereits wächst, ob es schon bewässert wurde etc.

    Frage: Wie speicher ich die Eigenschaften der Pflanzen am besten?
    Bei c gibt es ja das "struct" dafür...

    Ich könnte das über ein globales zweidimensionales Array machen. Aber irgendwie behagt mir das nicht so ganz. Erstens wegen dem "global", zweitens weil ich für die Übersichtlichkeit Konstanten machen müsste, damit ich hinterher noch weiss, dass der Verkaufspreis die Eigenschaft 1 ist...
    Am liebsten hätte ich dafür ja die normalen Objekte benutzt. Aber wenn es keine Instanz davon gibt, kann man ja nicht auf die Eigenschaften zugreifen...
  • Ein bisschen schwierig zu erahnen, was du genau brauchst. Willst du spezielle selbstdefinierte Eigenschaften eines Objekts abfragen, ohne eine Instanz davon zu haben?

    Das geht doch mit Arrays ganz gut:

    Erstell ein Script:

    GML-Quellcode

    1. // getEigenschaftFromPflanzentyp
    2. pflanzentyp=argument0;
    3. eigenschaft=argument1;
    4. // Zeit bis zur Reife Verkaufspreis etc...
    5. /* Pflanze 1*/ array[0,0]=12; array[0,1]=100;
    6. /* Pflanze 2*/ array[1,0]=12; array[1,1]=100;
    7. // etc.
    8. return array[pflanzentyp,eigenschaft];
    Alles anzeigen

    Da könntest du jetzt im Create Event deiner Pflanze ein Script starten ("initPflanze(0);"), das die Eigenschaften der Pflanze initialisiert.

    GML-Quellcode

    1. // initPflanze
    2. reifezeit=getEigenschaftFromPflanzentyp(argument0,0);
    3. verkaufspreis=getEigenschaftFromPflanzentyp(argument0,1);
    4. //...


    Natürlich hast du dann das Problem, dass du dir die Pflanzennummern und Eigenschaftsnummern merken musst, aber das kannst du entweder über Kommentare gut kennzeichnen (wie im ersten Script) oder wirklich per Konstanten machen, also bei den Global Game Settings (glaube ich) definieren:
    PFLANZE1 0
    PFLANZE2 1
    REIFEZEIT 0
    VERKAUFSPREIS 1
    und dann kannst du im Scriptaufruf auch schreiben: initPflanze(PFLANZE1); bzw. im initPflanze Script: reifezeit=getEigenschaftFromPflanzentyp(argument0,REIFEZEIT); etc.

    Ich weiß nicht, ob dir diese Idee weiterhilft. Vielleicht reicht es auch aus, einfach für jede Pflanze wirklich ein (unsichtbares Controller-) Objekt zu erstellen, das alle Eigenschaften (per Initialisierung im Create Event) besitzt, aber sonst keine Funktion besitzt, so dass du immer darauf zugreifen kannst.
    Einige meiner Spiele:
  • Hast schon gut erkannt, was ich brauche. Aber schade, hatte gehofft, das es noch ne Möglichkeit mit etwas Objektartigem gibt, so dass man es halt nicht global speichern muss.

    Wenn nicht, dann muss es halt mit den Arrays gehen.
    Ich mache das mal so, markiere den Thread hier als gelöst, und wenn jemand noch ne Idee hat, kann ers ja trotzdem hier reinschreiben. :)
    Danke!
  • Der GM hat einige nützliche Funktionen als Array-Ersatz. Mehr dazu findest du in der Hilfe unter ds_list, ds_grid, ds_map,...
    Diese Funktionen sind schneller als die normalen Arrays und auch besser auf gewisse Sachen anwendbar.

    Dragoon
    int (*x(*x(int))[5])(int*);
    Confused? Yes, it's C!
  • Benutzer online 1

    1 Besucher