Schrägen Problem

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

  • Schrägen Problem

    Hey. Bei meinem GML Platform Experiment scheitere ich leider immernoch an den Schrägen teilweise. Mein Spieler hat 8 Animationen (stehen, gehen, springen und fallen jeweils links und rechts). Bei meinem Example, den ich angehängen habe benutze ich Pfeile als Sprites, die hinterher die exakte Größe des Spielers besitzen, deshalb bitte nicht die Größe zu sehr ändern. Bei der aktuellen Geh-Geschwindigkeit ruckt mein Spieler beim hochlaufen. Aber ich habe es jetzt mal auf 6 gelassen, da es nicht langsamer sein sollte. Und das Hauptproblem ist, dass mein Spieler an den Schrägen schwankend fällt. Da sieht auch unschön aus. Und ich möchte die jumping und falling sprites jedoch nicht weglassen.

    Kurz gesagt: Der Spieler sollte an den Schrägen die walk sprites ( die mit den Doppelpfeilen) behalten und nicht zu schnell oder langsam oder ruckelt hoch und runter gehen.

    Ich habe an der Engine überall rumgeschraubt und sitze mehrere Tage an dem selben Problem und weiß echt nicht weiter. Deshalb bitte ich euch, ob jemand mein Problem lösen könnte.
    Dateien
  • Hi

    So hier habe mal einen anderen Code aus einen anderen Engine mit Schräge.
    Das habe ich gestestet mit deinen Programm und es funktioniert sehr gut. Ich habe die Tastaturabfrage für rechts und links aus deinen Step-Event gelöscht und habe den neuen Code in End-Step eingefügt.Das habe ich aber nur zur Übersichtlichkeit der Programmierung gemacht
    Hier der Code
    End-Step

    GML-Quellcode

    1. if (keyboard_check(vk_right))
    2. {
    3. if (!place_free(x,y+1))
    4. {
    5. for(i=moveSpd;i>=-moveSpd;i-=1)
    6. {
    7. if (place_free(x+moveSpd,y+i))
    8. {
    9. if ( i<=0 )
    10. {
    11. x += floor( moveSpd * cos(arctan2(i,moveSpd)) );
    12. y += round( moveSpd * sin(arctan2(i,moveSpd)) );
    13. }
    14. else
    15. {
    16. x += moveSpd;
    17. y += i;
    18. }
    19. break;
    20. }
    21. }
    22. }
    23. else
    24. {
    25. x += moveSpd;
    26. }
    27. }
    28. if (keyboard_check(vk_left))
    29. {
    30. if (!place_free(x,y+1))
    31. {
    32. for(i=moveSpd;i>=-moveSpd;i-=1)
    33. {
    34. if (place_free(x-moveSpd,y+i))
    35. {
    36. if ( i<=0 )
    37. {
    38. x -= floor( moveSpd * cos(arctan2(i,moveSpd)) );
    39. y += round( moveSpd * sin(arctan2(i,moveSpd)) );
    40. }
    41. else
    42. {
    43. x -= moveSpd;
    44. y += i;
    45. }
    46. break;
    47. }
    48. }
    49. }
    50. else
    51. {
    52. x -= moveSpd;
    53. }
    54. }
    Alles anzeigen

    und dann noch im Create-Event die Variabel
    moveSpd = 5;
    einfügen.
    Gruß Drachen
  • Danke dir. Bei den 64x32 Schrägen funktioniert das jetzt bei mir einwandfrei. Allerdings komme ich bei den steileren 32x32 Schrägen erst garnicht mehr hoch. Liegt vermutlich an den Sprites...

    Edit: War doch ein Code Fehler. Jetzt funktioniert alles gut!

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

  • Ja, habe es auch gerade damit getestet. Einfach nochmal mein Example runterladen und deinen Code einfügen. Aber nicht vergessen, die Tastaturabfrage für rechts und links aus dem Step-Event wieder zu löschen. Anschließend stellst du in den Raum einpaar Blöcke aufeinander und springst dagegen. Dann sollte der Spieler hängen bleiben.
    Mach es ruhig morgen, nur keine Hektik. :)
  • Danke für alles. Allerdings passt deine Erweiterte Sprungoption nicht, da es bei Mario z.B. komisch aussehen würde. Habe es modifiziert indem ich zum Beispiel 2 mal die gravity auf 1.25 bei dem pressing up Code gesetzt habe und darüber bei dem Code if(place_free(x,y+1)) die 1 auf 2 geändert habe, weil sonst wieder das Schrägen Problem besteht. Aber ich bin bei sowas lieber vorsichtig. Kann man das auch irgendwie weglassen?

    Und auf jeden Fall gibt es wieder ein neues Problem. ^^
    Unzwar funktioniert anscheinend place_meeting nicht mehr und das ist sehr wichtig, weil ich das für die itemblocks brauche. Eine andere Methode wüsste ich nicht und der Spieler soll natürlich nur die Blöcke von unten berühren, weshalb ich dafür nicht einfach collision event nehmen kann.

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von Luffey ()

  • Hi

    Da müsste man mit der Engine von ganz vorne Anfangen und das so hin zu bekommen wie bei Mario. Das wusste ich leider nicht das du es so haben wolltest. Habe im Grunde nur versucht das festhämgen an den Objekt zu
    korrekieren. Aber lass jetzt den Kopf nicht hängen. Habe noch was, was dir helfen könnte.
    Hier ist eine Fan-Seite von Super-Mario. Diese Engine gibt es schon ziemliche lange und der Proogrammier hat sie auch immer weiter verbessert.
    Also hier die Seite:
    wiki.mfgg.net/index.php?title=Hello_Mario_Engine
    und hier kann man die Version für GM 8.xxx herunter laden. Sie ist ziemlich lehrreich
    hellofangaming.github.io/HelloMarioEngine/

    Also musst du wenn es dir keine so große Mühe macht, benutze die Engine von Super Mario und passt es an dein Spiel einfach an.
    So, mehr weise ich in Moment auch nicht wie ich dir sonst noch helfen kann. Kannst aber hier Posten ob dir das Super-Mario Engine geholfen hat.

    Gruss Drachen :)
  • Hi

    bei deine Problem kann es daran liegen, weil ich deinen Player drawn lasse. Für die Kollision ist dann nämlich deine Mask verandwortlich und die ist ja nur 16x16 Pixel gross. Viele Programmier die eine Engine schreiben aller Mario, benutzen überwiegen den Befehl collision_rectangle. Versuche es mal damit. Hier eine Auszug aus der Hilfe wie er funktionniert.


    Wenn Bewegungen geplant werden oder aufgrund bestimmter Aktionen entschieden wird, ist es oftmals wichtig zu wissen, ob Kollisionen mit anderen Objekten an bestimmten Stellen/Positionen bestehen. Folgende Funktionen können dafür verwendet werden. All diese haben drei Argumente gemeinsam: Das Argument obj kann ein Objekt sein, das Schlüsselwort all, oder die id einer Instanz.Das Argument prec gibt an, die Prüfung präzise sein soll oder nur auf der "bounding-box" der Instanz basiert. Präzise Prüfung wird nur ausgeführt, wenn das sprite der Instanz es aktiviert hat.Das Argument notme kann auf wahr (true) gesetzt werden, um anzugeben, dass die aufrufende Instanz nicht geprüft wird. Alle diese Funktionen geben entweder die id von einer der beiden kollidierenden Instanzen zurück oder sie melden einen negativen Wert, wenn keine Kollision vorliegt.

    collision_rectangle(x1,y1,x2,y2,obj,prec,notme) Diese Funktion prüft, ob eine Kollision zwischen dem (gefüllten) Rechteck mit den angegebenen gegenüberliegenden Ecken und Instanzen des Objektes obj vorliegt. Beispielsweise kannst du sie verwenden, um zu prüfen, ob ein Gebiet frei von Hindernissen ist.


    Hier mal ein Beispiel aus der Mario-Engine

    GML-Quellcode

    1. //Überprüfe ob Marion auf eine schrägen Untergrund ist
    2. if collision_rectangle(bbox_left,bbox_bottom,bbox_right,bbox_bottom+4,obj_slopeparent,1,0)
    3. and not collision_rectangle(bbox_left,bbox_bottom-4,bbox_right,bbox_bottom-4,obj_slopeparent,1,0)
    4. and state = 1
    5. y+=4
    6. .
    7. .
    8. .


    So ähnlich müsste du es dann auch machen

    Gruss Drachen :)

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