Hilfe bei Leiter

  • GM 8

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

  • Hilfe bei Leiter

    das ist mein code im step event :

    GML-Quellcode

    1. if place_meeting(x,y,leiter)
    2. { gravity=0
    3. vspeed=0
    4. sprite_index=klettern
    5. }
    6. if (keyboard_check(vk_up))then{if place_meeting(x,y,leiter){vspeed=-4}}
    7. if keyboard_check_released(vk_up) then{if place_meeting(x,y,leiter){vspeed=0}}
    8. if (keyboard_check(vk_down)) then{if place_meeting(x,y,leiter){vspeed=4}}
    9. if keyboard_check_released(vk_down) then{if place_meeting(x,y,leiter){vspeed=0}}


    es klappt schon gut,nur will ich das noch haben

    - Charakter soll klettern sprite nur aktivieren wenn ich bei Leiter stehe und vk up und vk down drücke.
    - Er sollte bei leiter klettern nicht nach rechts oder links bewegen können.
    - Und sollte in der Mitte des leiters bleiben,einer nen idee denn code weiter auszubauen.
  • Das kannst du genauso programmieren wie den Code den du schon hast und genauso wie du es gerade verschriftlicht hast.

    Dabei kann ich dir dann nur noch die logische Operatoren && (and) und ||(or) ans Herz legen.

    GML-Quellcode

    1. if ... == 1 and if ... != 0 or if ... == ...
    2. {
    3. vspeed = ...
    4. image_speed = ...
    5. image_index = ...
    6. //Zuweisiungen
    7. }

    ancient-pixel.com
    youtube.com/user/SebastianMerkl <<< ich freu mich über einen Besuch ;)
  • Hi

    Ich versuche es mal, das habe ich mal vor ein paar Jahren programmier.
    Ich habe mir zwei zusätzliche Objekte erstellt zur Leiter, die aus Tiles bestand.
    Siehe Bild


    Ein Objekt für den Anfang (blau), und ein Objekt für die Leiter selbst (grün)
    Dann habe ich ein Script geschrieben das bei mir "scr_Leiter_hoch_runter" heist
    Script

    GML-Quellcode

    1. //////////////////////////////////////////////////////
    2. // Leiter hoch und runter klettern //
    3. //////////////////////////////////////////////////////
    4. {
    5. var hori_speed, verti_speed, Spriteani;
    6. hori_speed = 0;
    7. verti_speed = 1/3;
    8. Spriteani = 1/9;
    9. switch (keyboard_key)
    10. {
    11. case vk_nokey:
    12. sprite_index :=spr_Spieler1_Leiter;
    13. image_speed = 0;
    14. break;
    15. case vk_up:
    16. Leiter_id=instance_place(x,y,obj_Leiter)
    17. sprite_index :=spr_Spieler1_Leiter;
    18. image_speed = Spriteani;
    19. x = Leiter_id.x // Spielfigur genau in der X-Richtung vom obj_Leiter platzieren
    20. y -= verti_speed
    21. break;
    22. case vk_down:
    23. Leiter_id=instance_place(x,y,obj_Leiter)
    24. sprite_index :=spr_Spieler1_Leiter;
    25. image_speed = Spriteani;
    26. x = Leiter_id.x // Spielfigur genau in der X-Richtung vom obj_Leiter platzieren
    27. y += verti_speed
    28. break;
    29. }
    30. }
    Alles anzeigen

    Das ist im Objekt "obj_Leiteranfang"


    Hier setzte ich ein globale Variabel "global.Leiteranfang auf null"
    sobald er Player es berührt.
    Das selbe passiert mit dem Objekt "obj_Leiter"
    Nur setzt ich die globale Variabel "global.Leiteranfang auf 1l"


    Bei Objekt Player wird bei der Kolisionsabfrage "obj_Leiter und obj_Leiteranfang" jeweils das Script "scr_Leiter_hoch_runter" aufgerufen


    Und in der Abfrage für vk left und vk right steht folgendes
    Hier jetzt mal für links


    So ich hoffe es gibt dir ein paar Anregung um dein Problem zu lösen.

    Gruss Drachen
  • Ich hab dir den Code mal umgeschrieben:

    GML-Quellcode

    1. var meetingLadder;
    2. meetingLadder = place_meeting(x, y, leiter);
    3. if (meetingLadder) { // wenn wir auf einer Leiter sind
    4. gravity = 0;
    5. vspeed = 0;
    6. sprite_index = klettern;
    7. if (keyboard_check(vk_up)) { // und wir nach oben drücken
    8. vspeed = -4; // nach oben gehen
    9. }
    10. else if (keyboard_check(vk_down)) { //oder wir nach unten drücken
    11. vspeed = 4; // runter gehen
    12. }
    13. }
    Alles anzeigen


    Damit kannst du (und andere) den Code besser lesen und in Zukunft auch besser damit arbeiten, je früher man mit Einrücken oder so etwas anfängt umso besser. Du kannst einen anderen Stile benutzen, je nachdem was dir besser gefällt.

    Vergesse auch nicht: Sprites, Objekte, Räume, etc mit einen Prefix (oder Suffix) bezeichnen, also z.B. obj_leiter oder spr_klettern.
    wupto.net/ Nicht meine Seite!
    We love Koalas.

    GM-D-Spam-o-Meter: 32%
  • Noch etwas wenn ich oben bin ,Bild, will ich runter klettern nur geht das nicht weil der solide boden das verhindert kann man irgendwie
    dann solid=false machen bekomme das nicht hin :headtouch:

    GML-Quellcode

    1. var meetingLadder;
    2. meetingLadder = place_meeting(x, y, leiter);
    3. if (meetingLadder) { // wenn wir auf einer Leiter sind
    4. gravity = 0;
    5. vspeed = 0;
    6. if (keyboard_check(vk_up)) { // und wir nach oben drücken
    7. vspeed = -4; // nach oben gehen
    8. }
    9. else if (keyboard_check(vk_down)) { //oder wir nach unten drücken
    10. vspeed = 4; // runter gehen
    11. }
    12. }
    13. if keyboard_check(vk_down)
    14. if keyboard_check(vk_up)
    15. if place_meeting(x,y,leiter)
    16. {
    17. sprite_index=klettern
    18. }
    Alles anzeigen


    es fehlt einfach in der mitte des leiters klettern und wenn ich kletter darf ich nicht nach rechts oder links bewegen

    GML-Quellcode

    1. //////////////////////////////////////////////////////
    2. // Leiter hoch und runter klettern //
    3. //////////////////////////////////////////////////////
    4. {
    5. var hori_speed, verti_speed, Spriteani;
    6. hori_speed = 0;
    7. verti_speed = 1/3;
    8. Spriteani = 1/9;
    9. switch (keyboard_key)
    10. {
    11. case vk_nokey:
    12. sprite_index :=spr_Spieler1_Leiter;
    13. image_speed = 0;
    14. break;
    15. case vk_up:
    16. Leiter_id=instance_place(x,y,obj_Leiter)
    17. sprite_index :=spr_Spieler1_Leiter;
    18. image_speed = Spriteani;
    19. x = Leiter_id.x // Spielfigur genau in der X-Richtung vom obj_Leiter platzieren
    20. y -= verti_speed
    21. break;
    22. case vk_down:
    23. Leiter_id=instance_place(x,y,obj_Leiter)
    24. sprite_index :=spr_Spieler1_Leiter;
    25. image_speed = Spriteani;
    26. x = Leiter_id.x // Spielfigur genau in der X-Richtung vom obj_Leiter platzieren
    27. y += verti_speed
    28. break;
    29. }
    30. }
    Alles anzeigen


    wird das so klappen wie ich das möchte :huh:
    Bilder
    • leiter.JPG

      29,98 kB, 415×536, 404 mal angesehen

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

  • Welches gmk version ist das,und mit lite geht das leider nicht :pinch:

    hier nochmal der aktuelle code

    GML-Quellcode

    1. var meetingLadder;
    2. meetingLadder = place_meeting(x, y, leiter);
    3. if (meetingLadder) { // wenn wir auf einer Leiter sind
    4. gravity = 0;
    5. vspeed = 0;
    6. if (keyboard_check(vk_up)) { // und wir nach oben drücken
    7. vspeed = -4; // nach oben gehen
    8. }
    9. else if (keyboard_check(vk_down)) { //oder wir nach unten drücken
    10. vspeed = 4; // runter gehen
    11. }
    12. }
    13. if keyboard_check(vk_down)
    14. if keyboard_check(vk_up)
    15. if place_meeting(x,y,leiter)
    16. {
    17. sprite_index=klettern
    18. }
    Alles anzeigen




    hier nochmal die probleme,bitte erweitert mein code will nicht mehr als dieses code verwenden

    - Noch etwas wenn ich oben bin ,Bild, will ich runter klettern nur geht das nicht weil der solide boden das verhindert kann man irgendwie
    dann solid=false machen bekomme das nicht hin.
    - Er sollte bei leiter klettern nicht nach rechts oder links bewegen können.
    - Und sollte in der Mitte des leiters bleiben,einer nen idee denn code weiter auszubauen.
    Bilder
    • leiter.JPG

      29,98 kB, 415×536, 388 mal angesehen
  • Hi

    OK - da habe ich nicht aufgepasst welche Version du hast. Die Datei die ich hoch geladen habe ist für GM V8.1

    Ok versuchen wir es aus dem Kopf deinen Code zu verbesseren. Gebe aber keine Garantie ob das funzt, da ich das ja nicht testen kann.

    GML-Quellcode

    1. var meetingLadder;
    2. meetingLadder = place_meeting(x, y, leiter);
    3. if (meetingLadder)
    4. { // wenn wir auf einer Leiter sind
    5. gravity = 0;
    6. vspeed = 0;
    7. if (keyboard_check(vk_up))
    8. { // und wir nach oben drücken
    9. vspeed = -4; // nach oben gehen
    10. }
    11. else if (keyboard_check(vk_down))
    12. { //oder wir nach unten drücken
    13. vspeed = 4; // runter gehen
    14. }
    15. else if (keyboard_check(vk_left) || keyboard_check(vk_right))
    16. { //wenn nach links oder rechts gedrückt wird
    17. hspeed = 0; // Horizontalbewegung auf null stellen oder x = 0 stellen. je nachdem wie du die recht-, links - Bewegen gemacht hast
    18. }
    19. }
    Alles anzeigen


    kommen wir dazu um dein Spieler genau in der Mitte zu platzieren. Zu aller erst überprüfe Bitte wo dein Origin von dein Sprit ist. Davon hängt es nämlich ab wie die Berechnung läuft.
    Gehen wir davon aus das dein Origin unten in der Mitte ist, und deiner Leiter auch.
    Dann musst du folgendes schreiben

    GML-Quellcode

    1. Leiter_id=instance_place(x,y,obj_Leiter) // hier hole ich mir die id von der Leiter
    2. x = Leiter_id.x // Spielfigur genau in der X-Richtung vom obj_Leiter platzieren


    Und nun zu dem Leiterende. Auch hier spielt die Origin auch eine rolle. Sobald dein Player das Leiterende berührt setze solid = false. und in einer If schleife prüfst du ob du schon am ende deiner Leiter bist. Dann setze wieder solid = true
    das sollte es dann gewesen sein.

    Gruss Drachen
  • GML-Quellcode

    1. else if (keyboard_check(vk_left) || keyboard_check(vk_right))
    2. { //wenn nach links oder rechts gedrückt wird
    3. hspeed = 0; // Horizontalbewegung auf null stellen oder x = 0 stellen. je nachdem wie du die recht-, links - Bewegen gemacht hast
    4. }


    wieso wird der leiter solid ich komme nicht in der mitte des leiters

    GML-Quellcode

    1. Leiter_id=instance_place(x,y,obj_Leiter) // hier hole ich mir die id von der Leiter
    2. x = Leiter_id.x // Spielfigur genau in der X-Richtung vom obj_Leiter platzieren


    ist das der ganze code wenn ja bekomme das nicht hin,muss ich leiter_id ersetzen
  • lerne mal, deine Posts vorher nochmal durchzulesen und auch satzzeichen zu setzten.
    Ist gar nicht schwer, mach ich ja auch....

    So kann man echt nur raten, was du einem mitteilen willst.

    So, nun zum problem:
    nein, du musst da nix ersetzen, da die variable ja davor gleich automatisch gesetzt wird.
    kannst auch noch:
    var Leiter_id;
    davor setzen.
    Kopiere dies in deine Signatur, um es in deiner Signatur zu haben.
    Achtung: Dieser Beitrag läuft ende des Monats ab, bitte lese ihn noch vor dem Monatswechsel...
    Nach langer zeit wieder im Forum aktiv :D
  • - Wenn ich oben bin ,Bild, will ich runter klettern nur geht das nicht weil der solide boden das verhindert kann man irgendwie
    denn solid=false machen bekomme das nicht hin.
    - Er sollte bei leiter klettern nicht nach rechts oder links bewegen können.
    - Und sollte in der Mitte des leiters bleiben.


    ist das so schwer :headtouch:
  • packe einfach in das step event des spielers, wo du den Leiter-klettercode hast noch das dazu:

    GML-Quellcode

    1. x=instance_nearest(x,y,obj_Leiter).x

    und dann wars das.
    Kopiere dies in deine Signatur, um es in deiner Signatur zu haben.
    Achtung: Dieser Beitrag läuft ende des Monats ab, bitte lese ihn noch vor dem Monatswechsel...
    Nach langer zeit wieder im Forum aktiv :D
  • Und nun zu dem Leiterende. Auch hier spielt die Origin auch eine rolle. Sobald dein Player das Leiterende berührt setze solid = false. und in einer If schleife prüfst du ob du schon am ende deiner Leiter bist. Dann setze wieder solid = true
    das sollte es dann gewesen sein.


    bekomme das nicht hin habe da ein extra objekt über denn leiter erstellt
    aber klappte nicht so wie ich es will,der spieler sollte runter gehen wenn ich auch vk nach unten drücke,kennt ihr ein code für denn step event und woher weiss ich wo das leiter ende ist.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von Pirat ()

  • Hier noch ein Bild dieser Leiter macht mich echt :cursing:

    das ist mein aktueller code in step event :

    GML-Quellcode

    1. var meetingLadder;
    2. meetingLadder = place_meeting(x,y,leiter);
    3. if (meetingLadder) {
    4. gravity = 0;
    5. vspeed = 0;
    6. if (keyboard_check(vk_up)) {
    7. vspeed = -4;
    8. image_index-=0.8
    9. sprite_index=klettern_anim
    10. x=instance_nearest(x,y,leiter).x }
    11. else if (keyboard_check(vk_down)) {
    12. vspeed = 4;
    13. image_index-=0.8
    14. sprite_index=klettern_anim
    15. x=instance_nearest(x,y,leiter).x
    16. }
    17. if place_meeting(x,y,leiter)
    18. if keyboard_check_released(vk_up) or keyboard_check_released(vk_down)
    19. {
    20. image_index=0
    21. }
    22. }
    Alles anzeigen


    im bild diese grauen boxen sind platformen wo man von unten hoch kommt dann es solid wird hier der code dafür

    in step event von denn grauen platform

    GML-Quellcode

    1. if not instance_exists(player)
    2. {
    3. break;
    4. }
    5. if player.bbox_bottom > bbox_top {solid=false}else{solid=true}


    dann habe ich noch collision event mit denn platform if solid equal to true und dann move contact direction 12 und v speed 0

    -möchte runter klettern von oben leiter nach unten durch denn platform

    -der spieler bewegt seinen animation weiter wenn ich vk nach unten drücke nicht pressed
    unten bei leiter wie kann man das beheben es sollte image_index 0 sein
    Bilder
    • leiter2.JPG

      21,61 kB, 441×378, 373 mal angesehen