Eine blöde Frage zu Variablen

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Eine blöde Frage zu Variablen

    Nachdem ich mich nun an der GML versucht habe - mit mittelmäßigem Erfolg sogar - bin ich nun an einem Punkt angekommen, an dem mein Latein zu Ende geht. Ich habe versucht mittels global. und var eine neue Variable einzufügen, aber das funktioniert nicht. Liegt das daran, dass ich noch die Lite Edition benutze oder hab ich da was falsch gemacht?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Irrenhaus3 ()

  • willst du eine variable definieren, schreibe einfach zum beispiel global.meinevariable=1
    jetzt kannste diese variable beispielsweise zum überprüfen benutzen.
    im step-event kannste z.b. abfragen:
    if global.meinevariable=1 then {game_end();}

    wenn deine variable = 1 ist, wird das spiel beendet

    ich hoffe ich konnte dir damit ein bisschen weiterhelfen

    "Make love, not Warcraft"
  • Das klingt, als hättest du versucht, "global" und "var" zu mischen. Ich hab zwar keine Ahnung, wie genau das vom GM bearbeitet wird, aber dass das zu Problemen führt, würde mich nicht wundern.

    Normalerweise kannst du einfach durch Zuweisen eines Wertes eine Variable definieren:

    GML-Quellcode

    1. blub := 1;


    Nun liegt diese Variable im Objekt rum und wartet darauf abgerufen oder von anderen Skripten verarbeitet zu werden.

    Das Schlüsselwort "var" sorgt dafür, dass die Variable wieder gelöscht wird, nachdem das Skript, in dem sie definiert wurde, beendet ist:

    GML-Quellcode

    1. var blub;
    2. blub := 1; //

    Ungeeignet, um Werte zu speichern, mit denen du später noch was machen möchtest, aber gut geeignet, wenn du nur beim Abarbeiten eines Skriptes etwas zwischenspeichern möchtest, was du danach nichtmehr brauchst, wie z.B. Laufvariablen in einer Zählschleife.

    Das Präfix "global." oder das Schlüsselwort "globalvar" deklariert eine Variable als global, d.h. jedes Objekt kann darauf zugreifen, egal, wo sie angelegt wurde:

    GML-Quellcode

    1. global.foo := 1; // <-- hier muss das global immer mitgeschrieben werden
    2. foo := 2; // <- hier wurde eine lokale Variable im Objekt angelegt; diese Variable hat mit global.foo nix zu tun
    3. globalvar bar; // <-- bar wurde nun als globale Variable deklariert
    4. bar := 3; // <-- dieses bar ist das selbe, was eben als global deklariert wurde; jedes Objekt, das von nun an auf "bar" zugreifen will, spricht diese Variable an


    "globalvar" spart das ständige Mitschleppen von "global.", sollte aber nur einmal verwendet werden, und verhindert, dass man lokale Variablen des gleichen Namens verwenden kann.
  • Wir würden uns freuen, wenn du nächstes mal uns sagt, was du probiert hast (= uns z.B. deine(n) Code(s) zeigen) - falls etwas falsch sein sollte, kann man dir einfach helfen anstatt um den heißen Brei herumzureden ;) Dann gibts da auch noch die Hilfe, also "RTFM", ne? xD
    Achja, willkommen auf gm-d :D

    @ CAS: globalvar gibts im GM nicht... zumindest nicht im 6er ?(
    EDIT: "zumindest nicht im 6er ?(", was motzt du mich so an, das weis ich doch nicht o_O

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von copyboy ()

  • -.- Nur weil du die Existenz des GM7 ignorierst, heißt das nicht, dass das auch für den Rest der Welt gilt.
    HIER! HIER! ICH TUS AUCH (noch)^^

    Egal. Ich hab da noch eine Frage:
    Was ist der unterschied zwischen:

    GML-Quellcode

    1. variable := 1;
    2. //und
    3. variable = 1;
    4. //??

    Ich hab das immer nur auf die zweite Art gemacht...
  • Ganz einfach: Es gibt keinen. Genau wie es keinen Unterschied macht, ob du nun { und } oder begin und end verwendest. Der GM kann halt mit Delphi und mit C Syntax umgehen, und dieses := kommt aus Delphi.
    “Computers are good at following instructions, but not at reading your mind.” (Donald Knuth)

    Ich schreibe mit Neo.
  • Der Unterschied ist lediglich die Syntax, aus der diese Zuweisungen genommen wurden.
    GML ist eine ziemlich merkwürdige Mischung aus Pascal- und C-Syntax, die sehr viele Schlampereien tolleriert. So kann man beispielsweise die Semikola am Zeilenende weglassen (was man aber trotzdem nicht tun sollte).
    In C wird nun also mit "=" einer Variable ein Wert zugewiesen, während man mit "==" den Wert einer Variable vergleicht; in Pascal wird mit "=" verglichen und mit ":=" ein Wert zugewiesen.

    Quellcode

    1. if (a=b)
    z.B. ist in C richtig pervers: Wer die Sprache nicht kennt würde vermuten, dass dort a und b verglichen werden, aber stattdessen geschieht folgendes:

    Quellcode

    1. a=b;
    2. if (b)


    Da der Game Maker alle 4 oben genannten Operatoren zulässt, also beide Sprachen mischt und "=" je nach Umgebung eine andere Funktion zuordnet, habe ich mir angewöhnt, aus beiden Sprachen nur Audrücke zu verwenden, aus denen man auch als Lesender eindeutig erkennen kann, was gemeint ist.
  • Neue Frage, neues Glück

    Wow, ziemlich viele Antworten. Danke für die Infos, CAS, hat mir relativ gut geholfen. Ich denk aber, dass ich den Script dann doch noch umschreiben werde, der machte irgendwie wenig Sinn. Im Moment ist mein Problem ein ganz anderes. Evtl. könnt ihr mir dabei ja auch helfen? Ich beschreib das ganze mal:

    In einem Shoot'em'up bewegt man das gesteuerte Objekt mit den Pfeiltasten und schießt mit der Leertaste. Die Steuerung funktioniert im Grunde ganz gut (Ein bisschen was hab ich mir von cactus abgespickt) aber ein Problem ergibt sich weiterhin: Wenn ich direkt horizontal bzw. vertikal an den Bildschirmrand fliege, wird folgender Code ausgeführt:
    x=xprevious
    y=yprevious
    direction-=90
    Das bewirkt aber nicht etwa, dass das betroffene Objekt im korrekten Winkel von der Wand abprallt - wie ich es vorgesehen hatte - sondern hat zur Folge, dass es erstmal 4 oder 5 cm an der Wand entlangrutscht. Kann mir da vielleicht jemand helfen?

    P.S.
    So langsam werd ich ein bissel vertrauter mit GML, auch wenn ich noch einige Wissenslücken zu füllen habe - wobei mir die integrierte Hilfedatei leider nicht so richtig hilft... Ich halt mich lieber an die Community. :gmlove:
  • Wenn du mit hspeed und vspeed arbeitest, könntest du sie beim Berühren des Randes einfach umdrehen. Als Beispiel:

    GML-Quellcode

    1. if(x < sprite_width/2 && hspeed < 0) {hspeed = -hspeed;}

    Ich habe "sprite_width/2" gewählt, damit das Raumschiff wirklich abprallt, wenn der äußere Rand des Sprites an die Bildschirmgrenze kommt. Das funktioniert natürlich nur, wenn das Origin auf die Sprite-Mitte gesetzt ist.
    █████ ██ █ ████ everything ███ █████ is █████ ████ ████ fine ████ ███ █ ██████ love.
    █████ ███████ ███ your █████ ████ government.
  • Das von Mauge muss dann ins Step-Event, dann müsste es - nein was heißt "müsste" es muss funktionieren. Allerdings solltest du das auch für die y-Koordinate machen. Ich hätte es so gemacht:

    GML-Quellcode

    1. if (x<sprite_width/2) hspeed=-hspeed
    2. if (x>room_width-sprite_width/2) hspeed=-hspeed
    3. if (y<sprite_height/2) vspeed=-vspeed
    4. if (y>room_height-sprite_height/2) vspeed=-vspeed

    © 2008 by Teamgrill Productions
  • Das Projekt itself

    Ok, MasterXY, dank an dich und auch an Maurice für die Hilfe. Jetzt hat's geklappt. Dennoch stehe ich immer noch vor Problemen solchen Ausmaßes, dass ich sie mit meinen spärlichen Scriptkenntnissen und der lückenhaften internen Hilfedatei nicht mehr bewältigen kann. Ich weiß immer noch nicht, wie man Variablen nun so definiert, dass sie tatsächlich global sind und auch so funktionieren, wie sie sollen. Ich hab's mit globalvar und global.<Variable> probiert, geklappt hat's aber nicht.

    Jetzt ist die Stunde der Wahrheit gekommen: Die Debugversion des endgültigen Spiels kommt. Wer gerade Zeit und Mühe aufbringen kann, ein laienhaft zusammengedoktortes Spiel mit einigen Profischliffen aufzupolieren, kriegt von mir Grüße, Dank, Respekt, Blumen und Konfekt nebst Erwähnung als Collaborator im Spiel selber und auf YoYoGames. Die Debuginformationen befinden sich momentan in der Game-Information. Drückt im Spiel F1 oder seht sie in der .gmk-Datei ein.
    Da die maximale Dateigröße auf gm-d bei 1 MB liegt, die .gmk-Datei aber 3MB groß ist, müsste ich sie per Mail versenden. Falls jemand Interesse und Zeit hat, kann er bzw. sie mir bitte Bescheid geben?

    Achtung: MS Amoebea wurde mit GM7 Pro erstellt und wird daher in GM6 kaum funktionieren.
  • Es gibt eine Möglichkeit, das Deklarieren von Variablen zu umgehen, aber viele mögen das nicht und würden mich jetzt wahrscheinlich am liebsten schlagen. *zu Dragoon schiel*

    Schau mal in den Global Game Settings unter "Errors". Wenn du nun das Häkchen bei "Treat unitialized variables as value 0" setzt, kannst du Variablen einfach benutzen, ohne sie vorher deklariert zu haben.

    Ich würde mir das Produkt übrigens gern anschauen; kenne ja einige deiner Arbeiten bereits. Du kannst es doch irgendwo uploaden und dann den Link hier posten. Dazu gibt es viele kostenlose Anbieter im Netz, einfach mal googlen.
    █████ ██ █ ████ everything ███ █████ is █████ ████ ████ fine ████ ███ █ ██████ love.
    █████ ███████ ███ your █████ ████ government.
  • Ich hab dein Step Event des Players folgendermaßen abgeändert. Bei der Variante von MasterXY wurde nicht geprüft, welche Richtung bei der Randkollision anliegt. Dadurch bleibt der Spieler hängen. So geht's:

    GML-Quellcode

    1. if (speed > 10) {speed = 10;}
    2. if (x < sprite_width/2 && hspeed < 0) {hspeed = -hspeed;}
    3. if (x > room_width-sprite_width/2 && hspeed > 0) {hspeed = -hspeed;}
    4. if (y < sprite_height/2 && vspeed < 0) {vspeed = -vspeed;}
    5. if (y > room_height-sprite_height/2 && vspeed > 0) {vspeed = -vspeed;}
    █████ ██ █ ████ everything ███ █████ is █████ ████ ████ fine ████ ███ █ ██████ love.
    █████ ███████ ███ your █████ ████ government.
  • Jep, so funktioniert's. Bist halt ein Profi (im Vergleich zu mir) ;)
    Also, die Steuerung wäre korrigiert. Die verbleibenden Probleme sind:
    - Amöben spawnen unendlich (kann daran liegen, dass ich versucht hab, das mit Drag'n'Drop zu lösen)
    - Powerups bewirken nichts (trotz Definition der globalvar weaponlevel im Creation Code des Raums wird die Variable komischerweise in allen möglichen Codes auf 1, 2 oder 0 gesetzt, aber im Spiel selbst nicht initialisiert)
    - Spieler verschießt gleichzeitig normale und Gegner durchdringende Kugeln (hängt mit Problem Nummer 2 zusammen)

    Wenn die jetzt auch noch behoben werden, könnte man diesen Thread in "Gelöst" verschieben, dann wär das Projekt nämlich abgeschlossen.

    Edit ( 13.7.08 :( Und dieser Punkt ist jetzt schon lange erreicht ;)

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von Irrenhaus3 ()

  • Benutzer online 1

    1 Besucher