Objekt durch String finden?

  • Objekt durch String finden?

    Ich möchte in einer globalen Variablen global.level den aktuellen Level als Zahl speichern (1 bis 50 z.B.).
    Dann habe ich Räume level_1, level_2, level_3, usw.

    Nun möchte ich das Weiterschalten auf den Raum des jeweiligen Levels nicht hartverdrahten, sondern generisch machen.

    Ideal wäre so etwas wie

    Quellcode

    1. room_goto("level_" + string(global.level));


    Nur klappt das leider nicht :(

    Gibt es im GML eine Möglichkeit, aus einem String das "gleichnamige" Objekt zu ermitteln?
    Wichtig wäre auch, vorher room_exist() mit diesem String ermitteln zu können, um zu prüfen, ob der Raum überhaupt existiert oder der Spieler den letzten Level geschafft hat.

    Ich habe schon das Umschalten auf den jeweiligen Raum/Level mit

    Quellcode

    1. execute_string("room_goto(level_" + string(global.level) + ");");
    hinbekommen. Nur die room_exist()-Abfrage würde mir dann noch fehlen...
    Aber ist das der schlaueste / einzige Weg?

    Profis vortreten bitte :D

    Gruß,
    Tommy
  • Falls dir das was hilft, könntest du auch rooms in Arrays speichern lassen.

    GML-Quellcode

    1. roomarray[0]=room0; // rooms ins Array speichern
    2. roomarray[1]=room1;
    3. roomarray[2]=room2;
    4. global.level=1; // nächsten room festlegen
    5. room_goto(roomarray[global.level]); // zu gewähltem room wechseln
    Einige meiner Spiele:
  • @interceptor: Dann hätte ich ja wieder irgendwo hartverdrahtet, welcher Level auf welchen Array-Index gehört. Kommt also ein Level/Room dazu, muß ich den wieder ins Array aufnehmen - das vergesse ich garantiert irgendwann mal :D

    Ich glaube, ich spiel noch ein wenig mehr mit execute_string() rum. Liefert die Funktion eigentlich das Ergebnis des ausgeführten Strings zurück? In der Doku ist das ja wohl eine der undokumentiertesten Funktionen :(
  • über dieses problem bin ich auch schonmal gestolpert.
    scheinbar kann de indexname der räume nicht "zusammengestückelt" werden. ich hab es damals auch mit execute string gelöst, allerdings ist diese funktion nicht besonders schnell. am ende eines raumes kann man damit leben, aber wenn es sich um ein schnelles spiel handelt sollte man wärend des spielablaufs darauf verzichten.

    hier nochmal eine version mit einer abfrage ob der raum existiert:

    GML-Quellcode

    1. temp=ceil(random(3))-1
    2. execute_string('roomnumb=room'+string(temp))
    3. if room_exists(roomnumb)=true
    4. {room_goto(roomnumb)}
    5. else
    6. {show_message(string(roomnumb)+' not found!')}

    (in diesem fall wählt er zufällig eine zahl von 0-3, hängt "room" vorne drann und geht in den entsprechenden raum.)
    Battle Command - WeltraumEchtzeitStrategie | Meine GM Spiele auf Box.net
    GCM/FA/O d-(--)@>---xpu s-:- !a C++$@ U- P L+ E W++ N o K-- w++ O? M V PS PE-- Y PGP t 5 X R+++ tv+ b DI D G e+ h? r-- x
  • Original von Tommy
    @interceptor: Dann hätte ich ja wieder irgendwo hartverdrahtet, welcher Level auf welchen Array-Index gehört. Kommt also ein Level/Room dazu, muß ich den wieder ins Array aufnehmen - das vergesse ich garantiert irgendwann mal :D(

    Ich gebe zu, meine Lösung ist nicht ideal. Und das mit dem Vergessen kenne ich aus eigener Erfahrung. Bei meinem Spiel stecken die Rooms nämlich in einem zweidimensionalen Array, so dass man aus jedem Room problemlos in die 4 angrenzenden gelangen kann.
    Leider bietet der Game Maker bei rooms definitiv zu wenig Funktionen. Wenn es außer room_next und room_previous noch Zugriff auf jeden Raum von jedem Raum aus gäbe, könnte man die problemlos über Nummern ansteuern oder per Schleife am Anfang in das Array laden, bzw. wäre das Array dann wahrscheinlich sowieso überflüssig.

    EDIT: Idee. Falls die Langsamkeit von execute_string stört. Benutze die Funktion am Anfang des Spiels um alle Räume automatisch ins Array zu laden und greif dann über das Array auf die Räume zu. Dann benötigst du die langsame Funktion nur einmal und kannst beim Levelwechsel darauf verzichten.

    EDIT2: Hm...Das mit dem room_exists haut so nicht hin. Da die Funktion denkt, ich will den Inhalt einer Variable übergeben, wenn der room-Name nicht vorhanden ist, spuckt er mir eine Fehlermeldung aus. Funktioniert auch nicht, wenn man nichtdefinierte Variablen als 0 deklariert. Seltsam. Da muss es doch ne Lösung geben...

    EDIT3: Hier hätte ich was:

    GML-Quellcode

    1. //Create Event eines Objektes im ersten Raum
    2. roomnumb=room0;
    3. i=0;
    4. do
    5. {
    6. global.roomarray[i]=roomnumb;
    7. i+=1;
    8. execute_string('roomnumb=room'+string(i));
    9. }
    10. until (roomnumb=room_last)

    zum Levelwechsel dann nur noch:

    GML-Quellcode

    1. room_goto(global.roomarray[global.level]);
    Einige meiner Spiele:
  • @Win:
    Super! Die Zeile

    Quellcode

    1. execute_string('roomnumb=room'+string(temp))
    ist genau das richtige! Dann kann ich die Raumvariable ermitteln und ganz normal weiterprogrammieren und überprüfen, was ich will. Genial!
    Die Geschwindigkeit ist nicht kritisch, da dieser Check erst passiert, wenn der aktuelle Level beendet ist und nicht während des Spiels (wohlmöglich in einem Step-Skript :D).

    @Interceptor: Danke für Deine Vorschläge. Das mit dem Array behalte ich mal im Hinterkopf für's nächste Spiel ;)

    Somit Problem gelöst. Herzlichen Dank!