Place_meeting_problem auf einer Schrägen

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

  • Place_meeting_problem auf einer Schrägen

    Hallo,

    Bin wirklich am Verzweifeln, find auch nach zwei Wochen probieren nicht die Lösung für dieses Problem:

    Erstmal was ich erreichen wollte.
    Eine Figur geht auf einer 45° winkligen Schrägen.

    Dieses wollte ich so lösen, dass ein Code immer dann vspeed=-hspeed setzt, wenn die Figur auf der Schrägen ist.
    Ist hspeed z.B. 5 wird vspeed -5.
    (Ich habe diesen Ansatz gewählt, da er auch bei Beschleunigung funktionieren sollte)
    Beim ersten Auftreffen auf die Schräge wird mit move_contact_solid die Figur genau auf die Schräge gesetzt.
    Da vspeed=-hspeed ist, müsste die Figur ja genau über der Schrägen gehen ohne eine Kollision auszulösen.

    Hier die Bedingung, die für die Kollision zuständig ist:

    GML-Quellcode

    1. if(place_meeting(x+hspeed,y+vspeed,obSolid))=true

    Meine Methode funktioniert eigentlich ja auch , nur in seltenen Fällen wird die Kollision ohne Sinn wahr.
    Hab jetzt die Vermutung, weil ich einfach kein Fehler nach langer Suche bei mir finde, dass es an Rundungen bei der Boundingbox und Placemeeting des Gamemakers liegt.

    Vielleicht könnt ihr ja diesen Verdacht bestätigen und habt eine Lösung, um das Problem zu umgehen.
    Danke im Vorraus

    gez. Ribo
  • hi wie wäre es hiermit?

    Spoiler anzeigen

    Information about object: obj_player

    Sprite: spr_player
    Solid: false
    Visible: true
    Depth: 0
    Persistent: false
    Parent: <no parent>
    Mask: <same as sprite>

    Create Event:
    COMMENT: Variablendeklaration
    execute code:

    moveSpd = 5;
    jumpSpd = 14;
    execute code:

    health=100
    execute code:

    shoot=true
    execute code:

    ammo=10

    Alarm Event for alarm 0:
    execute code:

    shoot=true

    Step Event:
    execute code:

    if mouse_check_button(mb_left)
    {
    if ammo>0
    {
    if shoot=true
    {
    schuss=instance_create(x,y,obj_bullet);
    schuss.geschwindigkeit=100;
    schuss.direction=point_direction(x,y,mouse_x,mouse_y)+random(2)-random(2);
    shoot=false;
    ammo-=1
    alarm[0]=19;
    }
    }
    }
    COMMENT: Tastaturabfragen
    execute code:

    if ( keyboard_check(vk_right) ) {
    if ( !place_free(x,y+1) ) {
    for(i=moveSpd;i>=-moveSpd;i-=1) {
    if ( place_free(x+moveSpd,y+i) ) {
    if ( i<=0 ) {
    x += floor( moveSpd * cos(arctan2(i,moveSpd)) );
    y += round( moveSpd * sin(arctan2(i,moveSpd)) );
    }
    else {
    x += moveSpd;
    y += i;
    }
    break;
    }
    }
    }
    else {
    x += moveSpd;
    }
    }
    if ( keyboard_check(vk_left) ) {
    if ( !place_free(x,y+1) ) {
    for(i=moveSpd;i>=-moveSpd;i-=1) {
    if ( place_free(x-moveSpd,y+i) ) {
    if ( i<=0 ) {
    x -= floor( moveSpd * cos(arctan2(i,moveSpd)) );
    y += round( moveSpd * sin(arctan2(i,moveSpd)) );
    }
    else {
    x -= moveSpd;
    y += i;
    }
    break;
    }
    }
    }
    else {
    x -= moveSpd;
    }
    }
    if ( keyboard_check_pressed(vk_up) ) {
    if ( !place_free(x,y+2) ) {
    vspeed = -jumpSpd;
    }
    }
    COMMENT: Gravitation
    execute code:

    if ( place_free(x,y+2) ) {
    gravity_direction = 270;
    gravity = 1;
    }
    else {
    gravity = 0;
    move_contact_solid(270,(y-yprevious)/2);
    }

    vspeed = min(vspeed,10);

    Collision Event with object obj_block:
    COMMENT: Fall Stoppen
    execute code:

    if ( true ) {
    if (vspeed > 0 ) {
    move_contact_solid(270,(y-yprevious)/2);
    vspeed = 0;
    }
    else if ( vspeed < 0 ) {
    vspeed = 0;
    }
    }

    Collision Event with object obj_medi:
    execute code:

    health=100

    Collision Event with object obj_ammo:
    execute code:

    ammo+=10

    Draw Event:
    execute code:

    draw_sprite(spr_player,-1,x,y)


    execute code:

    dir=point_direction(x,y,mouse_x,mouse_y);
    if mouse_x>x {xscale=1} else {xscale=-1}
    draw_sprite_ext(spr_gun,-1,x,y+4,1,xscale,dir,c_white,1);


    oder Hiermit


    Keyboard Event for <Left> Key:
    COMMENT: move code for left key press
    execute code:

    x -= 4; //this moves the player to the left while the key is pressed down

    if(place_meeting(x,y+1,ramp_right))//checking for contact with the ramp facing
    { //to the right. If met move player up
    y-=2; // 2 pixels. Used for going up ramp
    }
    if(place_free(x,y+1))// this is used to check if player is not in contact
    { // with the ground. If not move the object down
    y+=2; // 2 pixels. Used for going down the ramp.
    }
    if(x<3)//this is just a room bound check to stop player leaving room on right
    { // there are other ways of doing this but for this example it's suffice
    x=3; // this repositions object at screen location X 3
    }




    Keyboard Event for <Right> Key:
    COMMENT: move code for right key press
    execute code:

    x+=4;//this moves the player to the right while the key is pressed down
    if(place_meeting(x,y+1,ramp_left))//checking for contact with the ramp facing
    { //to the right. If met move player up
    y-=2; //2 pixels. Used for going up ramp
    }
    if(place_free(x,y+1))// this is used to check if player is not in contact
    { // with the ground. If not move the object down
    y+=2; // 2 pixels. Used for going down the ramp.
    }
    if(x>608)//this is just a room bound check to stop player leaving room on
    { // right there are other ways of doing this but for this example it's suffice
    x=608; //this repositions object at screen location X 3
    }


    bevor jetz wieder jemand schreit das habe ich aus der gm-d also sagst mir dann kann ichs löschen
  • Hm, so weit ich das überblicke bringt mich das nicht weiter.
    Trotzdem danke.

    Beim ersten Beispiel, welches ich jetzt so auch nicht ganz verstehe, wird die bewegung mit x und y gemacht, würde lieber die bewegung mit hspeed und vspeed machen, weil ich sonst mein ganzes Bewegungssystem umschreiben müsste.
    Wenns nicht anders geht, muss ich es wohl nochmal komplett neu machen.
    Das zweite scheint nur für zwei Pixel pro Schritt zu funktionieren. Hat man hspeed>2 würde es also nicht mehr funktionieren.
  • Warum machst du es nicht so, dass du wenn du läufst und gegen etwas prallst, du überprüfst ob bei x+hspeed und y+5 oder so etwas is, wenn nicht, hinsetzen und move_contact_solid(270,5).
    Beim Runterlaufen... lass es die Schwerkraft machen...

    Ansonsten versuch einfach, wenn du aufm Boden bist (if(place_meeting(x,y+1,obj_solid))) ein "move_contact_solid(270,5)" nach jedem schritt zu machen, dann läufst du sofern du vorher auf dem Boden standest automatisch runter =S

    Gut... es ist spät, ich hab es nicht ausprobiert und bin hundemüde, aber probiers mal aus.
    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
  • An image_xscale liegt es nicht, da es in beide Richtungen auftritt.
    Mir ist aber eine Idee gekommen, die das Problem zwar nicht löst, aber umgeht.
    Hab einfach nach dem ersten Berühren mit der Treppe y-=1 gemacht. Nun bewegt sich die Figur zwar nicht direkt auf der Treppe, sondern schwebt mit einem Pixel über Treppe, die Kollision scheint aber nach kurzem Testen nicht mehr aufzutretten. Sollte dem Betrachter eigentlich nicht sonderlich auffallen, hoffe ich mal.^^ Falls jemand eine bessere Idee hat, wäre nicht schlecht.
    Ich teste dann nochmal ein bisschen, ob wirklich keine Probleme mehr auftauchen.
  • Hm, das gesamte Objekt. Der Code ist sehr lang und sehr undurchsichtig und größtenteils nicht kommentiert.^^
    Ich versuch mal einige Sachen rauszubauen, so wie Impuls und son Kram.

    Create-Event
    Spoiler anzeigen

    GML-Quellcode

    1. //Konstanten//
    2. beschleunigungx=0.3 //mögliche Beschleunigung in X Richtung
    3. beschleunigungy=15 //mögliche Beschleunigung in Y Richtung
    4. grav=0.8 //Gravitationsstärke
    5. m=500 //Masse. Benötigt bei Impulserhaltung
    6. reibung=0.12 //Stärke des Vx Verlustes pro Step
    7. //Variabeln//
    8. image_speed=0
    9. zustand=0 //0=Nichts,3=Sprung
    10. systemspeed=0 //Geschwindigkeit des Bezugssystems
    11. gravitation=grav //Benötigt für Gravitation
    12. vx=0 //Eigengeschwindigkeit in X Richtung
    13. vy=0 //Eigengeschwindigkeit in Y Richtung
    14. ax=0 //Beschleunigung in X Richtung
    15. ay=0 //Beschleunigung in Y Richtung
    16. treppe=-1
    17. treppon=0
    Alles anzeigen



    Beginnstep-Event
    Spoiler anzeigen

    Steuerung:

    GML-Quellcode

    1. if keyboard_check_direct(vk_right)//Rechts
    2. {
    3. //image_xscale=1
    4. ax=beschleunigungx
    5. }
    6. else{
    7. if keyboard_check_direct(vk_left)//Links
    8. {
    9. //image_xscale=-1
    10. ax=-(beschleunigungx)
    11. }
    12. else{ax=0}
    13. }
    14. if (keyboard_check_pressed(vk_up)) &&(place_meeting(x,y+1,obSolid)||abs(treppon)>0) //Sprung
    15. {
    16. zustand=3
    17. if treppon=0
    18. ay=-beschleunigungy-abs(vx/4)
    19. else
    20. ay=-beschleunigungy-abs(hspeed/4)
    21. image_speed=0
    22. image_index=4
    23. anizeit=8
    24. }
    25. else
    26. {
    27. ay=0
    28. if ((keyboard_check(vk_up))=false && (zustand=3)) || vy > 0
    29. {
    30. if zustand=3 zustand=0
    31. if vy<0 vy=vy/2
    32. }
    33. }
    Alles anzeigen

    Objekte aktivieren

    GML-Quellcode

    1. instance_deactivate_all(true);
    2. instance_activate_region(view_xview[0]-32,view_yview[0]-32,view_wview[0]+64,view_hview[0]+64,true)



    step-Event
    Spoiler anzeigen

    Bewegung_horizontal

    GML-Quellcode

    1. if place_meeting(x,y+1,obSolid) //Bezugssysteme
    2. {
    3. idtemp=instance_place(x,y+1,obSolid)
    4. systemspeed=idtemp.hspeed
    5. }
    6. if sign(vx-reibung*sign(vx))!=sign(vx) || vx=0 //Reibung
    7. {vx=0
    8. if place_meeting(x,y+1,obSolid)!=true
    9. {
    10. if sign(systemspeed-reibung*sign(systemspeed))!=sign(systemspeed) //SystemReibung
    11. {systemspeed=0}
    12. else
    13. {systemspeed-=reibung*sign(systemspeed)}
    14. }
    15. }
    16. else
    17. {vx-=reibung*sign(vx)}
    18. vx=ax+vx // v=a*t+v
    19. if abs(vx) > 20 vx=20*sign(vx)
    20. hspeed=vx+systemspeed //Eigengeschwindigkeit+systemgeschwindigkeit
    Alles anzeigen

    Bewegung_vertikal

    GML-Quellcode

    1. vy=(ay+gravitation)+vy// v=a*t+v
    2. vspeed=vy

    Schraege/Treppescript

    GML-Quellcode

    1. var temp;
    2. temp=1
    3. if (place_meeting(x+hspeed,y+vspeed+1,obTreppe)) && zustand!=3 ////////////////////////////HOCH///////////////////////////
    4. {
    5. if place_meeting(x,y-1,obSolid)=false
    6. {
    7. if abs(hspeed)>0
    8. {
    9. idtemp=instance_place(x+hspeed,y+vspeed+1,obTreppe)
    10. if ((bbox_right<=idtemp.bbox_right+ceil(abs(hspeed)) && idtemp.treppe>0) || (bbox_left>=idtemp.bbox_left-ceil(abs(hspeed)) && idtemp.treppe<0)) //auf der Steigung
    11. &&
    12. ((treppe=0 && bbox_bottom<=idtemp.bbox_bottom ) || (treppe!=0))
    13. {
    14. if sign(idtemp.treppe)=sign(hspeed) //nur bei Anstieg
    15. {
    16. //MOVECONTACT-Anfang beim setzen auf Treppe
    17. if treppon=0
    18. {
    19. if idtemp.treppe>0 ////Treppe rechts
    20. {
    21. if radtodeg(arctan2(-vspeed,hspeed))<=0
    22. {
    23. if radtodeg(arctan2(-vspeed,hspeed))>=-90
    24. {
    25. move_contact_all(radtodeg(arctan2(-vspeed,hspeed)),sqrt(sqr(vspeed)+sqr(hspeed)))
    26. }
    27. else
    28. {
    29. move_contact_all(-90,sqrt(sqr(vspeed)+sqr(hspeed)))
    30. }
    31. }
    32. else
    33. {
    34. if radtodeg(arctan2(-vspeed,hspeed))<=135
    35. {
    36. move_contact_all(0,sqrt(sqr(vspeed)+sqr(hspeed)))
    37. }
    38. else
    39. {
    40. move_contact_all(-90,sqrt(sqr(vspeed)+sqr(hspeed)))
    41. }
    42. }
    43. }
    44. else ////Treppe links
    45. {
    46. if radtodeg(arctan2(-vspeed,hspeed))<=0
    47. {
    48. if radtodeg(arctan2(-vspeed,hspeed))<=-90
    49. {
    50. move_contact_all(radtodeg(arctan2(-vspeed,hspeed)),sqrt(sqr(vspeed)+sqr(hspeed)))
    51. }
    52. else
    53. {
    54. move_contact_all(-90,sqrt(sqr(vspeed)+sqr(hspeed)))
    55. }
    56. }
    57. else
    58. {
    59. if radtodeg(arctan2(-vspeed,hspeed))<=45
    60. {
    61. move_contact_all(-90,sqrt(sqr(vspeed)+sqr(hspeed)))
    62. }
    63. else
    64. {
    65. move_contact_all(-180,sqrt(sqr(vspeed)+sqr(hspeed)))
    66. }
    67. }
    68. }
    69. }
    70. //MOVECONTACT-ENDE beim setzen auf Treppe
    71. vspeed=-abs(hspeed)*abs(idtemp.treppe)
    72. hspeed=hspeed*(1-abs(idtemp.treppe))
    73. vy=vspeed
    74. treppon=hspeed
    75. treppe=idtemp.treppe
    76. }
    77. else {temp=2}
    78. }
    79. else {temp=2}
    80. }
    81. else {temp=2}
    82. }
    83. else {temp=2}
    84. }
    85. else{temp=3}
    86. ////////////////////////////RUNTER///////////////////////////
    87. if (place_meeting(x-hspeed,y+vspeed+1,obTreppe)) && zustand!=3
    88. {
    89. if place_meeting(x,y-1,obSolid)=false
    90. {
    91. if abs(hspeed)>0
    92. {
    93. idtemp=instance_place(x-hspeed,y+vspeed+1,obTreppe)
    94. if (bbox_right<=idtemp.bbox_right+ceil(abs(hspeed)) && idtemp.treppe>0) || (bbox_left>=idtemp.bbox_left-ceil(abs(hspeed)) && idtemp.treppe<0) //auf der Steigung
    95. &&
    96. ((treppe=0 && bbox_bottom<=idtemp.bbox_bottom ) || (treppe!=0))
    97. {
    98. if sign(idtemp.treppe)=-sign(hspeed) //nur bei Anstieg
    99. {
    100. //MOVECONTACT-Anfang beim setzen auf Treppe
    101. if treppon=0
    102. {
    103. if idtemp.treppe>0 ////Treppe rects
    104. {
    105. if radtodeg(arctan2(-vspeed,-hspeed))<=0
    106. {
    107. if radtodeg(arctan2(-vspeed,-hspeed))>=-90
    108. {
    109. move_contact_all(radtodeg(arctan2(-vspeed,-hspeed)),sqrt(sqr(vspeed)+sqr(hspeed)))
    110. }
    111. else
    112. {
    113. move_contact_all(-90,sqrt(sqr(vspeed)+sqr(hspeed)))
    114. }
    115. }
    116. else
    117. {
    118. if radtodeg(arctan2(-vspeed,-hspeed))<=135
    119. {
    120. move_contact_all(0,sqrt(sqr(vspeed)+sqr(hspeed)))
    121. }
    122. else
    123. {
    124. move_contact_all(-90,sqrt(sqr(vspeed)+sqr(hspeed)))
    125. }
    126. }
    127. }
    128. else ////Treppe links
    129. {
    130. if radtodeg(arctan2(-vspeed,-hspeed))<=0
    131. {
    132. if radtodeg(arctan2(-vspeed,-hspeed))<=-90
    133. {
    134. move_contact_all(radtodeg(arctan2(-vspeed,-hspeed)),sqrt(sqr(vspeed)+sqr(hspeed)))
    135. }
    136. else
    137. {
    138. move_contact_all(-90,sqrt(sqr(vspeed)+sqr(hspeed)))
    139. }
    140. }
    141. else
    142. {
    143. if radtodeg(arctan2(-vspeed,-hspeed))<=45
    144. {
    145. move_contact_all(-90,sqrt(sqr(vspeed)+sqr(hspeed)))
    146. }
    147. else
    148. {
    149. move_contact_all(-180,sqrt(sqr(vspeed)+sqr(hspeed)))
    150. }
    151. }
    152. }
    153. }
    154. //MOVECONTACT-ENDE beim setzen auf Treppe
    155. gravitation=0
    156. vspeed=abs(hspeed)*abs(idtemp.treppe)
    157. hspeed=(hspeed)*(1-abs(idtemp.treppe))
    158. vx=vx+grav*sign(vx)*abs(idtemp.treppe)
    159. vy=vspeed
    160. treppon=hspeed
    161. treppe=idtemp.treppe
    162. }
    163. else {temp*=4}
    164. }
    165. else {temp*=4}
    166. }
    167. else {temp*=4}
    168. }
    169. else {temp*=4}
    170. }
    171. else{temp*=5}
    172. switch (temp)
    173. {
    174. case 10:
    175. case 12:
    176. case 8: treppe=0
    177. treppon=0
    178. gravitation=grav
    179. break;
    180. case 15:treppe=0
    181. gravitation=grav
    182. if abs(treppon)>0{hspeed=treppon vx=treppon treppon=0}
    183. break;
    184. }
    Alles anzeigen

    Kollision

    GML-Quellcode

    1. if abs(speed)>0
    2. {
    3. var temp,idtempX,idtempY,idtempQ;
    4. instance_activate_region(bbox_left-ceil(abs(speed)),bbox_top-ceil(abs(speed))
    5. ,(bbox_right-bbox_left)+2*ceil(abs(speed)),(bbox_bottom-bbox_top)+2*ceil(abs(speed))
    6. , true) //aktiviert alle Objekte in der Nähe der Kollision, damit sie sich nicht überlagern
    7. temp=1
    8. if abs(hspeed)>0
    9. if(place_meeting(x+hspeed,y,obSolid)) //Kollision X
    10. {
    11. if place_meeting(x+hspeed,y-1,obSolid)=false && place_meeting(x,y-1,obSolid)=false && treppe=0 //kleine hindernisse überwinden
    12. {
    13. y-=1
    14. temp=5
    15. }
    16. else
    17. {
    18. idtempX=instance_place(x+hspeed,y,obSolid) //kleine hindernisse überwinden nicht möglich,normale X-Kollision
    19. temp=3
    20. }
    21. }
    22. if abs(vspeed)>0
    23. if(place_meeting(x,y+vspeed,obSolid)) //Kollision Y
    24. {
    25. idtempY=instance_place(x,y+vspeed,obSolid)
    26. temp+=1
    27. }
    28. if abs(hspeed)>0 && abs(vspeed)>0
    29. if(place_meeting(x+hspeed,y+vspeed,obSolid)) //Kollision Quer
    30. {
    31. idtempQ=instance_place(x+hspeed,y+vspeed,obSolid)
    32. temp*=7
    33. }
    34. //temp=1 keine Kollosion
    35. //temp=2 nur Y Kollision
    36. //temp=3 nur X Kollision
    37. //temp=4 X und Y Kollision
    38. //temp=5 Hinderniss Kollosion
    39. //temp=6 Hinderniss/Y Kollosion
    40. //temp=7 nur Quer Kollosion
    41. //temp=14 Y+Quer Kollision
    42. //temp=21 X+Quer Kollision
    43. //temp=28 X/Y/Quer Kollision
    44. //temp=35 Hinderniss/Quer Kollision
    45. //temp=42 Hinderniss/Y/Quer Kollision
    46. blupp=temp
    47. switch (temp) //Kollisionsevents
    48. {
    49. case 6: //Hinderniss/Y Kollosion
    50. case 2: if abs(hspeed)>0 {break; }//nur Y Kollision,wenn keine X-Geschwindigkeit
    51. case 42: //Hinderniss/Y/Quer Kollision
    52. case 14: //Y+Quer Kollision
    53. if temp!=42
    54. {
    55. move_contact_all(90+90*(sign(vspeed)+1),abs(vspeed))
    56. }
    57. vspeed=0 vy=0
    58. if(place_meeting(x+hspeed,y,obSolid)) //Hier muss Kollision noch mal überprüft werden, da
    59. {hspeed=0 vx=0} //durch move_contact die Position anders ist
    60. break;
    61. case 3: if abs(vspeed)>0 {break;}//nur X Kollision,wenn keine Y-Geschwindigkeit
    62. case 21: //X+Quer Kollision
    63. move_contact_all(180+90*(sign(hspeed)+1),abs(hspeed))
    64. hspeed=0 vx=0
    65. if(place_meeting(x,y+vspeed,obSolid)) //Hier muss Kollision noch mal überprüft werden, da
    66. {vspeed=0 vy=0} //durch move_contact die Position anders ist
    67. break;
    68. case 28: //X/Y/Quer Kollision
    69. case 4: // X+Y Kollosion
    70. script_execute(scMoveContact)
    71. hspeed=0 vx=0
    72. vspeed=0 vy=0
    73. break;
    74. case 35: //Hinderniss/Quer Kollision
    75. case 7: // nur Quer Kollosion
    76. if temp!=35
    77. {
    78. script_execute(scMoveContact)
    79. }
    80. if abs(hspeed)<abs(vspeed)
    81. {
    82. hspeed=0 vx=0
    83. if(place_meeting(x,y+vspeed,obSolid)) //Hier muss Kollision noch mal überprüft werden, da
    84. {vspeed=0 vy=0} //durch move_contact die Position anders ist
    85. }
    86. else {
    87. vspeed=0 vy=0
    88. if(place_meeting(x+hspeed,y,obSolid))
    89. {hspeed=0 vx=0}
    90. }
    91. break;
    92. }
    93. }
    Alles anzeigen







    Script: scMoveContact
    Spoiler anzeigen

    GML-Quellcode

    1. //////MOVECONTACT_Quer////////////
    2. var tempx,tempy,tempweg,tempweg2;
    3. tempx=x
    4. tempy=y
    5. move_contact_all(radtodeg(arctan2(-vspeed,hspeed)),sqrt(sqr(vspeed)+sqr(hspeed)))
    6. tempweg=sqrt(sqr(vspeed)+sqr(hspeed))-distance_to_point(tempx,tempy)
    7. tempx=x
    8. tempy=y
    9. if abs(hspeed)>=abs(vspeed)
    10. {
    11. if abs(hspeed)-tempweg>0
    12. move_contact_all(180+90*(sign(hspeed)+1),abs(hspeed)-tempweg) //x
    13. tempweg=tempweg-distance_to_point(tempx,tempy)
    14. if abs(vspeed)-tempweg>0
    15. move_contact_all(90+90*(sign(vspeed)+1),abs(vspeed)-tempweg) //y
    16. }
    17. else
    18. {
    19. if abs(vspeed)-tempweg>0
    20. move_contact_all(90+90*(sign(vspeed)+1),abs(vspeed)-tempweg) //y
    21. tempweg=tempweg-distance_to_point(tempx,tempy)
    22. if abs(hspeed)-tempweg>0
    23. move_contact_all(180+90*(sign(hspeed)+1),abs(hspeed)-tempweg) //x
    24. }
    Alles anzeigen



    So, glaube nicht, dass da jemand durchsteigt, ist doch sehr durcheinander.
    Vorallem, dass Treppen und Kollisionsevent sind mit der Zeit sehr gewachsen.
  • Also ich weiß nicht, was du dir da zusammengeschustert hast, da mir der Quelltext eindeutig zu lang ist.
    Aber um eine Schräge hinauflaufen zu können verwende ich immer sowas in der Art:

    GML-Quellcode

    1. for(i=0;i<9;i+=1)
    2. if !place_meeting(x+hsp,y-i,block)
    3. {
    4. x+=hsp
    5. y-=i
    6. break
    7. }
    8. }

    Damit man auch gescheit herunterlaufen kann und nicht so komisch rumeiert evtl in der for-Schleife i=-9 statt i=0 verwenden.
    Kann man auch ohne Probleme eben für hspeed und vspeed umändern.