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
Alles anzeigen
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)
Also hier ist das Skript (im Step event natürlich)
GML-Quellcode
- 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;
- // Mx und My sind die Koords des Mittelpunktes des Planeten, also x und y des Planeten objektes
- //Winkel zum Mittelpunkt (Mx,My)
- DirM=point_direction(Mx,My,x,y)
- 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
- // hat, also wenn man springt bleibt natürlich der abstpungwinkel immer gleich
- {direction=DirM+180}
- gravity_direction=DirM+180 //gravity zeigt logischerweise immer in richtung Mitte
- image_angle=DirM-270//auch klar
- gravity=gravity_power//gravity_power ist auf 0.5 voreingestellt
- 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
- //praktisch nicht weiß, das man sich um einen planeten bewegt, mehr oder weniger...
- if DirMV>360 {DirMV-=360}
- if DirMV<0 {DirMV+=360}
- view_angle[0]=DirMV
- // --- <= Bewegung => ---
- // - => Rechts => -
- if (keyboard_check(b_right)) && !(keyboard_check(b_left)) {
- image_xscale = 1;
- if (place_meeting(x+lengthdir_x(walk_power,DirM-90),y+lengthdir_y(walk_power,DirM-90),obj_solid)) {
- if !place_meeting(x+lengthdir_x(walk_power,DirM-90)+lengthdir_x(walk_power,DirM),
- 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
- //wie bei copyboys skript nur geht sie immer von deiner position aus
- {x+=lengthdir_x(walk_power,DirM-90)+lengthdir_x(walk_power,DirM);
- 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
- move_contact_solid(DirM+180,walk_power);}
- else
- {move_contact_solid(DirM-90,walk_power);}
- } else {x += lengthdir_x(walk_power,DirM-90); y+=lengthdir_y(walk_power,DirM-90)}
- }
- // - <= Links <= -
- if (keyboard_check(b_left)) && !(keyboard_check(b_right)) {
- image_xscale = -1;
- if (place_meeting(x+lengthdir_x(walk_power,DirM+90),y+lengthdir_y(walk_power,DirM+90),obj_solid)) {
- if !place_meeting(x+lengthdir_x(walk_power,DirM+90)+lengthdir_x(walk_power,DirM),
- y+lengthdir_y(walk_power,DirM+90)+lengthdir_y(walk_power,DirM),obj_solid)
- {x+=lengthdir_x(walk_power,DirM+90)+lengthdir_x(walk_power,DirM);
- y+=lengthdir_y(walk_power,DirM+90)+lengthdir_y(walk_power,DirM);
- move_contact_solid(DirM+180,walk_power);}
- else
- {move_contact_solid(DirM+90,walk_power);}
- } else {x += lengthdir_x(walk_power,DirM+90); y+=lengthdir_y(walk_power,DirM+90)}
- }
- // - ´^` Springen ´^` -
- 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),
- 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){
- // Jump-Block
- if (place_meeting(x,y+1,obj_jump32_32))
- {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
- //Planeten mitte
- }
- // - \/ Sprung-Höhe \/ -
- // Wenn der Spieler die Sprung-Taste losläst,
- // wird unser Charakter langsamer.
- if !(keyboard_check(b_up)) && (speed < 0) {speed *= 0.7;}
- // --- <> Kollisionen <> ---
- // - vv Unten vv -
- if (place_meeting(x+lengthdir_x(-speed,DirM),y+lengthdir_y(-speed,DirM),obj_solid)) && (speed > 0) {
- move_contact_solid(DirM+180,-speed);
- 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
- //-speed, da speed immer in richtung oben, also von dem Mittelpunkt weg zeigt
- }
- // - vV Gravitation Vv -
- if (place_meeting(x-lengthdir_x(1,DirM),y-lengthdir_y(1,DirM),obj_solid)) {
- gravity = 0;//wenn unter dir kein platz ist, wird gravity 0
- // Allgemeine Befreiung von Hängern
- // Bei Bugs bitte diese Zeile zum Kommentar machen!
- move_outside_solid(DirM,1);
- }
- else
- {if place_meeting(x+lengthdir_x(-speed,DirM),y+lengthdir_y(-speed,DirM),obj_solid)&&speed>0
- {gravity=0;move_contact_solid(DirM+180,-speed)}
- else {gravity = gravity_power;}}//sonst wird sie zu 0.5
- // - ^^ Oben ^^ -
- if (place_meeting(x+lengthdir_x(-speed,DirM),y+lengthdir_y(-speed,DirM),obj_solid)) && (speed < 0) {
- move_contact_solid(DirM,-speed);
- speed = 0;}//wenn über dir kein platz mehr ist wird speed 0 und du movest contact in richtung vom mittelpunkt weg
- // --- >>| Speed Limit |<< ---
- if (speed>12) {vspeed=12;}
- if speed<-12 {speed=-12}
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)
Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von Trompadon ()