Treibsand-Gravity, man sinkt nicht langsamer?

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

  • Treibsand-Gravity, man sinkt nicht langsamer?

    Hey, GM-Domäne.
    Mein Problem ist, neben den Windbugs, zu denen ich einen Thread öffnete, die Treibsand Gravity.
    Ich habe jetzt hingekriegt, dass man tiefer springen und langsamer laufen kann (im Treibsand) aber ich bekomme es nicht hin, dass man viel viel langsamer fällt.

    GML-Quellcode

    1. if(place_meeting(x,y,quicksand_obj)) && keyboard_check_pressed(vk_up){vspeed = -5;gravity = 000000.0000000000000000000000000000000000000000000000000000001;} else {if(!place_meeting(x,y,quicksand_obj)) && keyboard_check_pressed(vk_up)&& (place_meeting(x,y+1,solid)){vspeed = -15;gravity = 1;}}


    Der vspeed ändert sich, die gravity komischerweise nicht. Weiß jemand, warum? Ich mache es nicht mit grav! Ich mache es mit der eingebauten gravity. Und ja, ich habe schon viel probiert, deshalb die verzweifelte "000000.0000000000000000000000000000000000000000000000000000001".


    Danke!



    Grüße,


    CinoComeback
  • Ohne das jetzt näher betrachtet zu haben, beseitige doch erst diese Null-Orgie. Vor dem Komma reicht
    eine Null(oder auch gar keine), also 0.xxx oder .xxx
    Nach dem Komma rechnet GM(so weit ich weiß), mit max. 1 Milliarde, also wäre die "größte" Zahl:

    0.000000001 --> zur besseren Lesbarkeit 0,000 000 001

    Wobei Du, meiner Erfahrung nach, mit Werten von 0.3 - 0.5 schon gute Ergebnisse erzielen solltest.
    Und teste mal mit show_debug_message() oder show_message(), ob gravity sich überhaupt verändert.


    Miradur
  • Ja, das mit den vielen Nullen weiß ich natürlich. Aber ok, ich probiers mal mit show_message. Wie geht das nochmal, bzw. wo muss ich das nochmal einfügen?

    EDIT: Habe das mit der show_debug_message ausprobiert und die gravity ändert sich seltsamerweise nicht. Bei den Gleitschuhen aber schon! Sehr seltsam.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von CinoComeback () aus folgendem Grund: 1. EDIT Lieber show_message. 2. EDIT Habe es geschafft, aber es ändert sich nichts.

  • Mit gravity scheint irgend etwas nicht zu stimmen, habe es eben versucht und so lange man
    die gravity_direction auf 270 beläßt, funktioniert alles normal.
    Trotz einmaliger Zuweisung, wird das Objekt beim fallen immer schneller(wie man es auch
    erwarten würde), das scheint GM intern zu machen.
    Ändert man jedoch die Richtung, wird immer nur der Wert hinzu gezählt, den man zugewiesen
    hat, die Geschwindigkeit bleibt also konstant.

    Ist das ein Fehler oder ist das von GM so gewollt?
    Kann das jemand bestätigen, ob das ein Bug ist?

    @Cinemaniac, versuch mal gravity += 0.3

    Miradur
  • Das bedeutet dann nichts anderes, als das bei Dir immer nur die ELSE Bedingung ausgeführt wird.
    So weit ich mich erinnere, stand mal irgendwo, dass GM eine Kollision immer nur einmal erkennt,
    dann muss man den Kollisionsbereich verlassen, damit erneut eine Kollision erkannt werden kann.

    Das wirst Du jetzt hassen, aber Du mußt wiedermal mit einem Flag arbeiten 8o , wenn also eine
    Kollision mit dem Treibsand erkannt wird, setzt Du eine Variable auf true(z.B.: ichsteckefest = true).
    Dann machst Du den Teil mit Minus Speed und gravity, über diese Variable, also in etwa:

    if (ichsteckefest) {
    vspeed = -5
    gravity = 0.3
    } else if (Kollisionsabfrage, ob Du aus dem Sand wieder raus bist){
    und dann ...
    ichsteckefest = false
    }


    Miradur
  • Das hatten wir auch schon mal, man kann nur helfen, wenn Du das Problem gut erklärst
    und mit CODE unterstützt, poste also, was Du hast.
    Keine Ahnung, wo auf einmal Boots herkommen, da oben, steht nichts davon im Code.

    Für heute muss ich Dich alleine lassen mit dem Thema, ich bin mit der Korrektur,
    der deutschen Hilfe, mehr als genug ausgelastet.


    Miradur
  • So ungern du das vermutlich hörst und so sehr du es wahrscheinlich weiterhin ignorieren wirst:
    Fertigen Code zu kopieren bringt keinen Lernfortschritt. Genausowenig, wie die Lösung zu einem Matheproblem im Internet nachzuschlagen.
    Ist nicht das erste Mal, dass ich dir das sage, aber ich bin einfach guter Dinge, dass es irgendwann doch hängen bleiben muss.

    So, nun zu deinem Problem. Erstmal zwei kleine Optimierungen an deinem Code:
    1.: Der && Operator
    Die if-Bedingung "if (A && B) {...} else if (B && C) {...}" kann runtergedampft werden auf "if(B){ if(A){...} else if (C){...}}" - denn B kommt in beiden Bedingungen vor, muss also true sein, damit überhaupt irgendwas passieren kann. Das bedeutet, du kannst den ganzen Code skippen, wenn's false ist. In deinem Fall geht's hier um den Ausdruck keyboard_check_pressed(vk_up).

    2.: Code-Formatierung
    Klatsch nicht alles in eine Zeile, das macht's nur unnötig schwer zu entziffern. Es ist immer sinnvoll, zusammenhängenden Code mit Tabs einzurücken, damit man klar sehen kann, was wovon abhängt.

    Hier, hab mal beide Optimierungen für dich gemacht:

    GML-Quellcode

    1. if(keyboard_check_pressed(vk_up))
    2. {
    3. if(place_meeting(x,y,quicksand_obj))
    4. {
    5. vspeed = -5;
    6. gravity = 000000.0000000000000000000000000000000000000000000000000000001;
    7. }
    8. else if(place_meeting(x,y+1,solid))
    9. {
    10. vspeed = -15;
    11. gravity = 1;
    12. }
    13. }
    Alles anzeigen

    Ist doch gleich schon viel lesbarer, oder?

    So, nun zum Problem mit deinen Glide Boots: Das ist ja im Prinzip ähnlich wie der Treibsand: Eine Bedingung, die entweder erfüllt ist oder nicht - und wenn sie erfüllt ist, dann ändert sie die Bewegungssteuerung deines Charakters. Die Forumulierung "wenn X, dann Y" übersetzt sich 1:1 in einen if-Ausdruck im Code - kompliziert wird das erst dadurch, dass du die Treibsand-Steuerung und die Gliding-Steuerung miteinander kombinieren musst.
    Jetzt einfach mal so dahergesponnen, könnte man da z.B. so rangehen:

    GML-Quellcode

    1. /* Key-Pressed-Event für den Sprungknopf */
    2. if (auf_treibsand && hat_gleitschuhe) // Hat beides
    3. {
    4. JOHNS_Kombinierter_Sprung(id); // id ist immer die Instanz von JOHN, die dieses Event ausführt. d.h. das ist quasi das Wort "ich".
    5. }
    6. else // Hat nur eines oder keins von beiden
    7. {
    8. if (auf_treibsand){ JOHNS_Treibsand_Sprung(id); return;}
    9. if (hat_gleitschuhe) { JOHNS_Gleitschuh_Spring(id); return;}
    10. // Wegen der "return"-Befehle über dieser Zeile kommen wir hier nur an,
    11. // wenn wir weder im Treibsand-, noch im Gleitschuh-Modus sind.
    12. JOHNS_Normaler_Sprung(id);
    13. }
    Alles anzeigen

    Diese ganzen Funktionen, die mit JOHNS_ beginnen, sind dabei Skripte - selbst definierte Funktionen (Diese Dinger hier :action_script: ), die als Argument eine Instance ID erwarten und dann mit der lustige Sachen machen.
    Zum Beispiel sieht der Normale Sprung dann etwa so aus:

    GML-Quellcode

    1. // Skript JOHNS_Normaler_Sprung
    2. var target = argument[0];
    3. target.vspeed = -15;
    4. target.gravity = 1;


    Und die Variablen auf_treibsand und hat_gleitschuhe sind true/false-Flags von JOHN, die du abhängig von place_meeting oder ähnlichem auf true bzw. false setzt.

    Wie gesagt, das ist nur EIN möglicher Ansatz, aber ich halte den für relativ übersichtlich und einigermaßen leicht nachzuvollziehen.
    Die Implementierung ist aber deine Sache, mehr Code als in diesem Post gibts von meiner Seite nicht.
    Viel Erfolg.