argumentgedöns verkürzen?

  • GM 8

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

  • argumentgedöns verkürzen?

    hi,
    ich habe scripts die immer teilweise ausgefürht werden.
    aufrufen tuh ich sie so:

    scr_bsp(0,1)

    und im scr_bsp steht dann

    if argument0=1;
    bla bla bla

    if argument1=1;
    bla bla bla


    so ich werde an die 10 argumente verwenden pro script.

    gibt es da eine kürzere möglichkeit das argument fest zu legen als scr_bsp(0,0,0,0,0,0,0,0,0,1); ???


  • na du machst es dir aber auch schwer...

    ich glaube der großteil macht es so.
    PS nur ein beispiel
    SO ist es kürzer und du must nicht immer agument schreiben...fals du das meinst

    GML-Quellcode

    1. x1=argument0
    2. y1=argument1
    3. xw=argument2
    4. yw=argument3
    5. sprite_bilde=argument4
    6. imgnr=argument5
    7. wert=argument6
    8. draw_sprite(sprite_bilde,imgnr,view_xview+x1,view_yview+y1)
    9. if mouse_x>view_xview+(x1-(xw/2)) and mouse_x<view_xview+(x1+(xw/2)) and mouse_y>view_yview+(y1-(yw/2)) and mouse_y<view_yview+(y1+(yw/2)) then
    10. {
    11. if mouse_check_button_released(mb_left) then
    12. {
    13. obj_cursor.option=wert
    14. sound_play(snd_press)
    15. }
    16. draw_sprite(sprite_bilde,0,view_xview+x1,view_yview+y1)
    17. }
    Alles anzeigen
    Meine Signatur hat kein Visum für das GM Forum erhalten.
  • Warum so umständlich, wenn es einfach geht?

    GML-Quellcode

    1. var i;
    2. for(i = 0; i< 10; i += 1)
    3. if(argument[i] == 1)
    4. //Gedöns....


    MfG Trixt0r

    Albert Einstein schrieb:

    Probleme kann man niemals mit derselben Denkweise lösen, durch die sie entstanden sind.
  • Du könntest natürlich auch eine ziemlich gewöhnungsbedürftige Lösung nehmen:

    GML-Quellcode

    1. //scrBsp (Nummer der Argumente mit dem selben Wert, Wert, andere Argumente)
    2. for (i = 2; i < argument0; i += 1)
    3. { argument [i + argument0] = argument [i]; }
    4. for (i = 1; i < argument0; i += 1)
    5. { argument [i] = argument1; }
    6. //Tu' dies & das.

    Also würde man statt deinem scrBsp (0, 0, 0, 0, 0, 1) folgendes schreiben können:
    scrBsp (0, 5, 1)
    Wobei du dann natürlich im Code selber von argument1 statt dem gewohnten argument0 als Anfangsargument ausgehen musst.
    Keine Ahnung ob es funktioniert, habe es mir gerade aus dem Ärmel gezogen :D
  • Ich weiß nicht, was du genau erreichen willst, aber eignet sich in deinem Fall nicht auch:

    GML-Quellcode

    1. switch(argument0)
    2. {
    3. case 0: blablabla break;
    4. case 1: blabla break;
    5. case 2: ......
    6. }



    Und du gibst dann ein scr_bsp(3) und es führt dann das gewünschte aus. Zumindest entsteht mir der Eindruck, dass du darauf hinaus willst.
  • Wie wilslt du den die Parameterübergabe verkürzen?
    Entweder die Parameter sind für die Übergabe wichtig und müssen dementsprechend übergeben werden => Keine Verkürzung möglich.
    Oder ein Teil davon ist unwichtig bzw. hängt von Gegebenheiten ab, welche man im Script selbst abfragen kann. => Entsprechende Parameter weglassen und Script anpassen.
  • Sorry ich steh auf dem Schlauch, wie genau stellst du dir eine Verkürzung vor?
    Wie kann es nützlich sein, scheinbar wichtige Informationen, wegzukürzen?
    Deine Fragestellung vermittelt den Anschein, dass du es für umständlich erachtest die vielen 0en als Parameter zu übergeben und diese somit als unnötig erachtest.
    Das führt natürlich zur Vermutung, dass du mehr weißt als wir. Z.B. das eigentlich immer nur ein Parameter 1 ist und der Rest 0.
    Dann wärs natürlich klüger dem Script die Form. scr_bsp(argument) zu geben und den Code von chaos_creator zu verwenden.

    Aber ehrlich zu sein seh ich hinter dem ganzen Scriptaufbau keinen wirklichen Sinn.
    Du führst je nachdem an welchen Stellen die 1 gesetzt ist verschiedene Codes aus.
    Wieso rufst du statdessen nicht die entsprechenden Codes bzw. Scripte mit jeweiligem Inhalt direkt auf?

    Statt "scr_bsp(1,0,0,1,0,1,0,0,0,0)" also:
    scr_1();
    scr_4();
    scr_6();

    Ist zwar letzendlich nicht weniger Schreibaufwand, aber dafür ist der Code verständlicher und du musst nich ständig im script nach schauen welcher parameter für welchen Code zuständig ist und somit isses dann auch schneller zu schreiben.
  • Zunächst einmal für alle anderen: Es gibt Sprachen, wie C# oder R, in denen gibt es drei Sorten Parametern: Die erste Sorte sind obligatorische; wenn diese beim Aufruf nicht angegeben werden, gibt es Fehlermeldungen. Die zweite und dritte sind optionale, die man angeben kann, aber wenn man es nicht tut, werden Standardwerte genommen. Sie unterscheiden sich lediglich in der Art, wie man sie angibt. Hierzu ein Beispiel:

    Angenommen, wir haben eine Funktion

    Quellcode

    1. void foo(x, y, z, a = 42, b = 23);
    mit den obligatorischen Parametern x, y und z und den optionalen Parametern a und b.

    Ruft man diese Funktion nun mit

    Quellcode

    1. foo(1, 2);
    gibt es einen Fehler, weil z nicht gegeben ist. Ruft man sie dagegen mit

    Quellcode

    1. foo(1, 2, 3);
    geht alles gut, und a und b haben die oben angegebenen Werte.

    Handelt es sich bei a und b nun um Parameter der zweiten Sorte, so kann man sie einfach angeben, indem man sie hinter die obligatorischen Parameter schreibt:

    Quellcode

    1. foo(1, 2, 3, 4, 5);

    was aber den großen Nachteil hat, dass man a immer seinen Standardwert explizit zuweisen möchte, wenn man eigentlich nur b einen anderen Wert geben möchte:

    Quellcode

    1. foo(1, 2, 3, 42, 5);


    Handelt es sich bei a und b um Parameter der dritten Sorte, so reicht es aus, nur die optionalen Parameter anzugeben, die einen anderen Wert, als den Standardwert erhalten sollen:

    Quellcode

    1. foo(1, 2, 3, b = 5);


    Der Game Maker kennt (meines Wissens) nur Parameter der zweiten Sorte, und das auch nur eingeschränkt. D.h. in einem Skript sind zwar alle Variablen optional, aber man kann keinen eigenen Standardwert festlegen, sondern es wird immer 0 genommen (wobei ich mir gerade unsicher bin, ob dieses Verhalten im Zusammenhang mit der Einstellung steht, uninitialisierte Variablen als 0 zu behandeln).

    Soweit ich das verstanden habe, fragt Gruen hier nach einer Möglichkeit, Parameter der dritten Sorte im GM umzusetzen.


    Für Gruen:
    Wenn du ein Skript scr_foo() hast, das du oft mit Standardwerten rufen möchtest, kannst du dir dazu ein zweites Skript scr_foo_def() ("def" für "default") schreiben, das scr_foo() mit diesen Standardparametern ruft, und einen der Standardparameter ersetzt:

    GML-Quellcode

    1. var params; // default parameter
    2. params[1] := 42; // default argument0
    3. params[2] := 23; // default argument1
    4. // ...
    5. params[argument0] := argument1;
    6. return scr_foo(params[1], params[2] /* ... */);


    Beachte, dass der Index in "params" von scr_foo_def() sich um eins vom Index in "argument" von scr_foo() unterscheidet. Dies ermöglicht dir, scr_foo_def() komplett ohne Parameter zu rufen und dann nur Standardwerte zu verwenden (andernfalls würde argument0 mit 0 überschrieben), was du beim Aufruf berücksichtigen solltest.

    Bei deiner Beispielfunktion sähe der Aufruf dann so aus:

    GML-Quellcode

    1. scr_bsp_def(6, 1);



    Und nun werde ich mal richtig eklig:
    Wenn du mehrere Funktionen dieser Art brauchst, kannst du dir auch ein allgemeines Skript schreiben, und Objekte als Skripte missbrauchen:

    Dazu legst du dir zunächst ein neues Objekt "scr_c_foo" an (ja, mit Prefix scr, um deutlich zu machen, dass dieses Objekt eigentlich ein Skript sein soll).

    Im Create Event legst du die Standardwerte der Parameter fest:

    GML-Quellcode

    1. params[1] := 42;
    2. params[2] := 23;
    3. // ...

    Beachte auch hier, dass du wieder bei 1 anfangen solltest zu zählen, um mit einem späteren Aufruf ohne Parameter nicht versehentlich params[0] mit 0 zu überschreiben.

    Im User0 Event schreibst du nun das eigentliche Skript, wobei du eben an dieser Stelle darauf achten musst, params statt argument zu verwenden. Das Ergebnis des Skript speicherst du in einer Variable des Objekts, namens "value".

    Und das allgemeine Skript, "scr_call" sieht dann so aus:

    GML-Quellcode

    1. var obj, result; // temporäre Variablen anlegen
    2. obj := instance_create(0,0, argument0); // erzeuge das "Skript-Objekt"
    3. obj.params[argument1] := argument2; // ersetze den Standardwert
    4. with(obj)
    5. {
    6. event_user(0); // führe das Skript aus
    7. }
    8. result := obj.value; // hole dir das Ergebnis
    9. with(obj)
    10. {
    11. instance_destroy(); // lösche das Objekt wieder
    12. }
    13. return result; // gib das Ergebnis zurück
    Alles anzeigen


    Dieses Skript will als ersten Parameter das Skript-Objekt haben, das du rufen willst, als zweiten die Nummer des Arguments, das du ersetzen willst (bei 1 angefangen, zu zählen) und als drittes Argument den neuen Wert dieses Parameters.

    Beachte bei dieser Lösung aber, dass es sich negativ auf die Performance auswirken könnte, ständig Objekte zu erzeugen und zu löschen.

    Ein Aufruf dieses Skripts sähe dann z.B. so aus:

    GML-Quellcode

    1. scr_call(scr_c_foo, 1, 9001);


    Ich hoffe, das hilft dir irgendwie...