Jump Through Platform

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

  • Jump Through Platform

    Hallo zusammen,

    ich sitze vor einem kleinen Problem. Ich habe eine Jump Through Platform erstellt bei dem der Spieler von unten hindurchspringen kann und darauf dann stehen bleibt.

    Ich habe das gelöst. indem sich die Kollisionsmaske auflöst der Platform, solange der Spieler sich unterhalb der Platform befindet. Springt er nun über die Platform, wir die Kollisionsmaske wieder zugewiesen.

    Das funktioniert auch einwandfrei. Das Problem was ich nun habe, das ich verschiedene Gegnerobjekte habe. Sie laufen auch auf der Platform, solange sich eben der Spieler überhalb der Platform bewegt. Sobald er unter der Platform ist, löst sich natürlich die Kollisionsmaske auf und die Gegner fallen nun auch durch.

    Ist Programmiertechnisch natürlich richtig... aber natürlich ein ungewollter Effekt. Die Gegner sollen weiterhin auf der Platform laufen ^^

    Wie würdet ihr das Problem anpacken / lösen?
  • Ich würd nicht mit solid und so arbeiten sondern meine eigenen Variablen mir Parents erfinden.

    So hätte ich z.b. ein parent für alle objekte die komplett solid sein sollen und ein parent für alle objekte die nur von oben solid sein sollen.

    Und dann immer place_meetings und y < blabla bei dem 2ten parent und nur place_meeting bei dem ersten parent.

    Oder wenn du schon mit solids arbeitest dann halt zusätzlich nur ein weiteres parent für diese "jump through" platformern. Welche aber nicht solid sind.
    Sorm ist Schuld

    Edit: Doch ist er
  • Ich arbeite nicht mit der eingebauten Solid Option. Meine Objekte sind alle nicht Solid.

    GML-Quellcode

    1. if (instance_exists(oPlayer1))
    2. {
    3. if (round((oPlayer1.y-1) + (oPlayer1.sprite_height / 2)) > y) mask_index = -1;
    4. else mask_index = sprWolkeMiddle;
    5. }


    Mit diesem Code hab ich das zb gelöst. Ist der Spieler unterhalb der Platform -> Keine Sprite Maske. Ist er überhalb -> Dann ne Maske.

    Aber natürlich... Parents könnten das ganze natürlich lösen... I Try :) Thx schonmal

    Edit: So mal ein wenig rumexperimentiert aber leider zu keinem Erfolg gekommen... :(

    Pacmangamer schrieb:

    So hätte ich z.b. ein parent für alle objekte die komplett solid sein sollen und ein parent für alle objekte die nur von oben solid sein sollen.


    Da kann ich dir nicht so ganz folgen... Klar gibt es ein Objekt, mein oBlockingBlock :D Der wird von jedem Objekt als komplett "Solid" behandelt.
    Aber wie könnte ich es machen, das es einen Block gibt der nur von Oben "Solid" ist, für alle Objekte (Gegner, Spieler etc)?

    Edit 2: Problem gelöst... Schneller als gedacht. Bin seit gestern Abend drangesessen... sogar im Schlaf hat mich das verfolgt ^^ Aber nu hab ichs! Nich ganz elegant aber funktioniert:
    Habe noch einen Block erstellt der komplett "Solid" ist. Aber eben nur für die Gegner. Die beachten den Block. Der Spieler nicht. Unsichtbar gemacht, mit in die Jump Through Platformen eingepflegt damit diese den automatisch mit erstellen und schon laufen die Gegner auf den Platformen und der Spieler kann immer noch durchhüpfen. :D

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

  • Was mir Spontan dazu einfallen würde (habs nicht geprüft):
    -Ein Parent Objekt für alle Gegner
    -Dann Prüfen ob der Gegner Parent sich auf der Platform befindet und wenn ja werden die Gegner einfach auf der Y position festgesetzt z.B. mit y=yprevious
    Oder: Die schaltest einfach kurz die Gravitation für die Gegner aus die sich auf der Platform befinden.
    Imagine taking your usual two century long nap minding your own business when suddenly some cunt wakes you up.
    You tell him to f*ck off of course but just when you finally managed to fall asleep again the same asshole comes knocking again. I'd attack that dick too.
  • So könntest du das lösen:

    GML-Quellcode

    1. if !place_meeting(x,y+1,obj_platform) || place_meeting(x,y,obj_platform)
    2. {
    3. // Hier fällt der Spieler/Gegner
    4. }
    5. else
    6. {
    7. // Hier bleiben sie oben drauf stehen
    8. }


    Das kann man in den Skripts von dem Spieler und den Gegnern packen, heißt, dass die Kollision dann bei den jeweiligen Objekten geprüft wird und nicht nur allein bei der Plattform.
    Hier im Code würde der Spieler nur stehen bleiben, wenn unter ihm die Platform ist, aber er sie noch nicht berührt. Sobald er von unten springt oder von der Seite etc., ist für die Plattform unsolide, da er sie berührt.
    (Natürlich müsstest du die "1" anpassen, jenachdem mit welcher Geschwindigkeit du arbeitest :D )

    EDIT: Ups, nicht gesehen, dass das Problem schon gelöst ist :D Jedenfalls wäre das hier ein wenig effizienter, als mehr Objekte dafür zu benutzen :)
  • 3D2Y Bandicoot schrieb:

    So könntest du das lösen:


    Danke für dein Tipp :) Aber so Ähnlich hab ich es gelöst. Nur das Problem war / ist, das wie schon gesagt: Sobald der Spieler sich unterhalb einer JumpThrough Plaform sich befindet, deren Kollisionsmaske auf -1 gesetzt wird (mask_index = -1). Wenn das passiert, kann ich auch mit place_meeting keine Kollision mehr feststellen.
    Springt der Spieler überhalb der Platform, kommt die Kollisionsmaske wieder und erst dann kann man auch eine Kollision wieder feststellen.

    Darum sind die Gegner sobald sich der Player (egal wo im Raum) unterhalb der Platform war, einfach durch die Platform durchgeflogen ^^

    Im Moment funktionierts, später wirds dann vll noch performanter gemacht :D
  • Du solltest lieber nicht mit mask_index arbeiten, sondern mit place_meeting gezielte positionabfragen machen. Zb könntest du die horizontale nach oben bei dem einen objekt nicht prüfen und dadurch drauf springen. Damit du nicht irgendwie drin stecken bleibst, haust du noch den Befehl move_outside_solid mit den richtigen werten und dann sollte alles klappen.