Bewegung auf Planeten Skript + Wie rutschen?

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

  • Bewegung auf Planeten Skript + Wie rutschen?

    Also ich hab mal aus lust und laune, ein skript für die Bewegung auf einem Planeten geschrieben (praktisch Mario GAlaxys in 2d), es funkt auf super, auch bei beliebiger Oberfläche, doch wie schaffe ich es natürliches Rutschen bei zu schiefen Lagen einzubauen, zb. bei über 22 1/2 Grad oder so (muss aber immer umgedacht werden, x y ist relativ, da sich die gravitation ja immer in richtung Planetmittelpunkt richtet, geht man beispielsweise nicht so: x+zb.4 sondern x+lengthdir_x(4,DirM+90)...
    Also hier ist das Skript (im Step event natürlich)

    Spoiler anzeigen

    GML-Quellcode

    1. globalvar b_left,b_right,b_up,Mx,My;//globalvar von der Steuerung, b_left ist links, b_right rechts und b_up natürlich rauf, voreingestellt bei mir als Pfeiltasten;
    2. // Mx und My sind die Koords des Mittelpunktes des Planeten, also x und y des Planeten objektes
    3. //Winkel zum Mittelpunkt (Mx,My)
    4. DirM=point_direction(Mx,My,x,y)
    5. if place_meeting(x-lengthdir_x(1,DirM),y-lengthdir_y(1,DirM),obj_solid) //Die Richtung wird nur geändert (welche zum springen verwendet wird) wenn man kontakt zum boden
    6. // hat, also wenn man springt bleibt natürlich der abstpungwinkel immer gleich
    7. {direction=DirM+180}
    8. gravity_direction=DirM+180 //gravity zeigt logischerweise immer in richtung Mitte
    9. image_angle=DirM-270//auch klar
    10. gravity=gravity_power//gravity_power ist auf 0.5 voreingestellt
    11. DirMV=-DirM-270//DirMV ist für den view angle gedacht und richtet den view immer so ein, dass man seinen spieler im gleichen winkel sieht, und man so
    12. //praktisch nicht weiß, das man sich um einen planeten bewegt, mehr oder weniger...
    13. if DirMV>360 {DirMV-=360}
    14. if DirMV<0 {DirMV+=360}
    15. view_angle[0]=DirMV
    16. // --- <= Bewegung => ---
    17. // - => Rechts => -
    18. if (keyboard_check(b_right)) && !(keyboard_check(b_left)) {
    19. image_xscale = 1;
    20. if (place_meeting(x+lengthdir_x(walk_power,DirM-90),y+lengthdir_y(walk_power,DirM-90),obj_solid)) {
    21. if !place_meeting(x+lengthdir_x(walk_power,DirM-90)+lengthdir_x(walk_power,DirM),
    22. y+lengthdir_y(walk_power,DirM-90)+lengthdir_y(walk_power,DirM),obj_solid)//sollte mehr oder weniger klar sein, ist einfach die gleiche Kollisionsprüfung
    23. //wie bei copyboys skript nur geht sie immer von deiner position aus
    24. {x+=lengthdir_x(walk_power,DirM-90)+lengthdir_x(walk_power,DirM);
    25. y+=lengthdir_y(walk_power,DirM-90)+lengthdir_y(walk_power,DirM);//man bewegt sich mit links also immer gegen und mit rechts mit dem urzeigersinn
    26. move_contact_solid(DirM+180,walk_power);}
    27. else
    28. {move_contact_solid(DirM-90,walk_power);}
    29. } else {x += lengthdir_x(walk_power,DirM-90); y+=lengthdir_y(walk_power,DirM-90)}
    30. }
    31. // - <= Links <= -
    32. if (keyboard_check(b_left)) && !(keyboard_check(b_right)) {
    33. image_xscale = -1;
    34. if (place_meeting(x+lengthdir_x(walk_power,DirM+90),y+lengthdir_y(walk_power,DirM+90),obj_solid)) {
    35. if !place_meeting(x+lengthdir_x(walk_power,DirM+90)+lengthdir_x(walk_power,DirM),
    36. y+lengthdir_y(walk_power,DirM+90)+lengthdir_y(walk_power,DirM),obj_solid)
    37. {x+=lengthdir_x(walk_power,DirM+90)+lengthdir_x(walk_power,DirM);
    38. y+=lengthdir_y(walk_power,DirM+90)+lengthdir_y(walk_power,DirM);
    39. move_contact_solid(DirM+180,walk_power);}
    40. else
    41. {move_contact_solid(DirM+90,walk_power);}
    42. } else {x += lengthdir_x(walk_power,DirM+90); y+=lengthdir_y(walk_power,DirM+90)}
    43. }
    44. // - ´^` Springen ´^` -
    45. if (keyboard_check_pressed(b_up)) && place_meeting(x+lengthdir_x(8,DirM+180)+lengthdir_x(20,DirM+90),y+lengthdir_y(8,DirM+180)+lengthdir_y(20,DirM+90),
    46. obj_solid) && place_meeting(x+lengthdir_x(8,DirM+180)+lengthdir_x(20,DirM-90),y+lengthdir_y(8,DirM+180)+lengthdir_y(20,DirM-90),obj_solid){
    47. // Jump-Block
    48. if (place_meeting(x,y+1,obj_jump32_32))
    49. {speed = -16;} else {speed = -jump_power;}//wieder das gleiche wie bei copyboy, wenn unter dir frei ist kannst du springen (also in dem FAll natürlich in Richtung
    50. //Planeten mitte
    51. }
    52. // - \/ Sprung-Höhe \/ -
    53. // Wenn der Spieler die Sprung-Taste losläst,
    54. // wird unser Charakter langsamer.
    55. if !(keyboard_check(b_up)) && (speed < 0) {speed *= 0.7;}
    56. // --- <> Kollisionen <> ---
    57. // - vv Unten vv -
    58. if (place_meeting(x+lengthdir_x(-speed,DirM),y+lengthdir_y(-speed,DirM),obj_solid)) && (speed > 0) {
    59. move_contact_solid(DirM+180,-speed);
    60. speed = 0; image_speed=0//Kollision unten, wenn man in diesem Step untern anfahren würde, wird man gestoppt und man moved contact zum mittelpunkt mit max weg
    61. //-speed, da speed immer in richtung oben, also von dem Mittelpunkt weg zeigt
    62. }
    63. // - vV Gravitation Vv -
    64. if (place_meeting(x-lengthdir_x(1,DirM),y-lengthdir_y(1,DirM),obj_solid)) {
    65. gravity = 0;//wenn unter dir kein platz ist, wird gravity 0
    66. // Allgemeine Befreiung von Hängern
    67. // Bei Bugs bitte diese Zeile zum Kommentar machen!
    68. move_outside_solid(DirM,1);
    69. }
    70. else
    71. {if place_meeting(x+lengthdir_x(-speed,DirM),y+lengthdir_y(-speed,DirM),obj_solid)&&speed>0
    72. {gravity=0;move_contact_solid(DirM+180,-speed)}
    73. else {gravity = gravity_power;}}//sonst wird sie zu 0.5
    74. // - ^^ Oben ^^ -
    75. if (place_meeting(x+lengthdir_x(-speed,DirM),y+lengthdir_y(-speed,DirM),obj_solid)) && (speed < 0) {
    76. move_contact_solid(DirM,-speed);
    77. speed = 0;}//wenn über dir kein platz mehr ist wird speed 0 und du movest contact in richtung vom mittelpunkt weg
    78. // --- >>| Speed Limit |<< ---
    79. if (speed>12) {vspeed=12;}
    80. if speed<-12 {speed=-12}
    Alles anzeigen


    GML-Quellcode

    1. Hier ist noch das Create Event, achja der Planet und alle möglichen Steine und so haben den parent obj_solid
    2. // Gravitation
    3. gravity_power=0.5
    4. gravity = gravity_power;
    5. gravity_direction = 270;
    6. jump_power=12
    7. walk_power=4


    Achja das ganze basiert in Grundzügen auf Copyboys simple plattform engine (die eigentlich gar nicht so simpel bzw. schon simpel...aber sie funzt eigentlich immer perfekt) ist nur ordentlich von mir geändert, also ich kenn mich schon damit aus, hab es nicht irgendwo aus nem forum...alles selbst fabriziert (kann auch jeder Verwenden, da es mir wurscht ist, und copyboy wenn ich es mir richtig gemerkt habe, auch)
    PULSE

    Zweispieler [||||||||||]
    Einspieler [||||||||||]

    [Die Entgrater ist auf Eis gelegt]

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

  • Entschuldigung wegen des Doppelpostes (man das ist ja mal korrekt), aber sonst antwortet wohl niemand mehr...da muss doch jemanden was zu einfallen, oder?? :D
    PULSE

    Zweispieler [||||||||||]
    Einspieler [||||||||||]

    [Die Entgrater ist auf Eis gelegt]
  • Könntest du vielleicht im Code ein Comment setzen, an welcher Stelle was passieren soll?

    Prinzipiell musst du nur an die Stelle gehn, an der überprüft wird, ob man sich in einer schrägen Lage befindet(Mithilfe von 2 Rays und so, kennst das ja), dann einfach den Winkel davon bekommen( und dann noch die direction zum Planetenmittelpunkt subtrahieren) und überprüfen... anschliessend einfach in die Richtung rutschen lassen lengthdir..(rutschspeed,resdirection)
    "das war meine letzte flamewar PM an dich ."
  • Hm, gute Idee. Mal schauen wie ich das löse.
    Moment nein...so was hab ich schon getestet, zumindest hab ich collision point benutzt und aus irgendeinem Grund, ist die abfrage von dem nicht gedrehten objekten ausgegangen, warum weiß ich nicht, hatte eigentlich auch alles versucht...vielleicht weiß ja einer von euch an was das liegen könnte.
    Comments werden nun gesetzt :P
    PULSE

    Zweispieler [||||||||||]
    Einspieler [||||||||||]

    [Die Entgrater ist auf Eis gelegt]
  • Meinst du jetzt, das mit der point prüfung. Ich glaube nicht das das was bringt, ich brauch eigentlich nur die Antwort auf die allgemeine Frage, ob bei Collision Point auch gedrehte Sprites benutzt werden so wie bei place meeting. Wenn ja hab ich mir vertan, dann mach ichs natürlich nochmal...brauch nur die Antwort darauf, keinen Code
    PULSE

    Zweispieler [||||||||||]
    Einspieler [||||||||||]

    [Die Entgrater ist auf Eis gelegt]
  • Wenn ich mich jetzt nicht irre, aber image_angle gilt auch für die Mask, dh. wenn du mit Collision_point prüfst, wird an diesem Punkt überprüft, ob eine Kollision mit der gedrehten Maske des angegebenen Objektes vorhanden ist...
    Glaub ich einfach mal.
    "das war meine letzte flamewar PM an dich ."
  • blubberblub schrieb:

    Wenn ich mich jetzt nicht irre, aber image_angle gilt auch für die Mask, dh. wenn du mit Collision_point prüfst, wird an diesem Punkt überprüft, ob eine Kollision mit der gedrehten Maske des angegebenen Objektes vorhanden ist...
    Glaub ich einfach mal.
    Stimmt, image_angle und scale Funktionen (ausser bei draw_sprite_ext) verändern auch die Mask.
    Somit gibt es bei collision_point/_line/_rectangle/etc. auch eine Kollision zurück, wenn es sich um das gedrehte Objekt handelt. (Und die ID wird zurückgegeben ^^)
    So far, Schattenphoenix~
    _____________________________________________________________________________
    "Who needs a stairway to heaven...
    If there is an elevator to hell... ?
    "
    - Vergessen
    "Auch ein perfektes Chaos ist etwas vollkommenes."
    - Jean Genet