Jump Through Platform

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

  • Jump Through Platform

    Hallo liebe Kommunity

    Ich habe wieder einmal eine Frage. Und zwar versuche ich gerade eine jump through platform zu erstellen. Ich habe auch schon eine weile danach gegooglt, und auch hier im Forum Thread gefunden, doch war die alles recht unbefriedigend. Habe bisher nur Lösungen gefunden die entweder nur eine Plattform oder einen Spieler supporten, was ich natürlich nicht möchte.
    Ich hab dan mal was erstellt was wie folgt lautet:
    Spoiler anzeigen

    GML-Quellcode

    1. if vspd >0
    2. {
    3. if (place_meeting(x, y, obj_jumpthrough))
    4. {
    5. grounded = true
    6. }
    7. }
    8. else
    9. {
    10. grounded = false
    11. }
    Alles anzeigen


    Was auch funktioniert, bis auf die Tatsache das man eben auch mit dem Kopf usw. stecken bleiben kann. Also dachte ich mir verwende ich doch bounding boxes.

    Spoiler anzeigen

    GML-Quellcode

    1. if vspd >0
    2. {
    3. if (place_meeting(x, bbox_bottom, obj_jumpthrough.bbox_top))
    4. {
    5. grounded = true
    6. }
    7. }
    8. else
    9. {
    10. grounded = false
    11. }
    Alles anzeigen


    Nun findet da aber nie eine Kollision statt, bin da jetzt also etwas ratlos, jemand eine Idee?

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

  • Den Thread hatte ich auch schon mal überflogen. image_index zu verstellen finde ich nicht so elegant, da die Kollision auch für mehrere Objekte funktionieren soll. Mit dem Skript vom Weihnachtswichtel hatte ich schon mal rungespielt, aber irgendwie wird auch da die Kollision nicht immer erkannt. Weiss nicht obs daran liegt wenn der Spieler zu schnell fällt das er den Punkt quasi überspringt, mal geht es mal nicht.. Wer mal weiter damit rumexperimentieren.
  • Statt den index kannst du auch eine Variable, wie im Code von dir benutzen.
    Ein Bug ist mehr als nur ein Bug, es ist ein... Käfer!
    Egal, wie gut du eine Mauer baust, sie fällt um.... der klügere gibt nach :D

    Willst du mit mir auf Discord Chatten/Quatschen?
    Meine Husi's Tutorial Reihe
  • Hier mal meine Platformer collision, mit slope movement und jump through


    Script motion:
    Spoiler anzeigen

    GML-Quellcode

    1. ///motion(right, up, left, forcedhsp, forcedvsp, force)
    2. /*
    3. ** ARGUMENTS:
    4. ** right when true, object moves to the right
    5. ** up when true, object jumps
    6. ** left when true, object moves to the left
    7. ** forcedhsp this forces object to move horizontally
    8. ** forcedvsp this forces object to move vertically
    9. ** force when true, forced motion is used
    10. */
    11. // CONTROLS //
    12. //RIGHT//
    13. if(argument0-argument2==1) {
    14. spr_dir = 1;
    15. hsp = min( max_spd,hsp + acc_spd);
    16. }
    17. //LEFT//
    18. if(argument2-argument0==1) {
    19. spr_dir = -1;
    20. hsp = max(-max_spd,hsp - acc_spd);
    21. }
    22. //JUMPING//
    23. if(argument1==1) {
    24. if(free==0 && hold==0) {
    25. vsp = floor(jmp_spd-sign(jmp_spd)*abs(jmp_spd/3.5));
    26. jump = 1;
    27. }
    28. if(free==1 && hold==1 && (vsp <= 0)) {
    29. vsp -= grv_spd/2;
    30. }
    31. hold = 1;
    32. }else{
    33. hold = 0;
    34. }
    35. // FORCED MOTION
    36. //////////////////
    37. if(argument5==1) {
    38. repeat(ceil(abs(argument3))) {
    39. if(place_meeting(x+lengthdir_x(1,grv_dir+(sign(argument3)*90)),y+lengthdir_y(1,grv_dir+(sign(argument3)*90)),par_solid)==0) {
    40. x+= lengthdir_x(1,grv_dir+(sign(argument3)*90));
    41. y+= lengthdir_y(1,grv_dir+(sign(argument3)*90));
    42. } else break;
    43. }
    44. repeat(ceil(abs(argument4))) {
    45. if(place_meeting(x+lengthdir_x(1,grv_dir-90+(sign(argument4)*90)),y+lengthdir_y(1,grv_dir-90+(sign(argument4)*90)),par_solid)==0) {
    46. x+= lengthdir_x(1,grv_dir-90+(sign(argument4)*90));
    47. y+= lengthdir_y(1,grv_dir-90+(sign(argument4)*90));
    48. } else break;
    49. }
    50. exit;
    51. }
    52. // HORIZONTAL MOVEMENT
    53. ////////////////////////
    54. repeat(round(abs(hsp))) {
    55. var blk, mov;
    56. blk = place_meeting(x+lengthdir_x(1,grv_dir+(sign(hsp)*90)),y+lengthdir_y(1,grv_dir+(sign(hsp)*90)),par_solid);
    57. mov = 0;
    58. if(blk==1) {
    59. for(a=1;a<=max_slp;a+=1) {
    60. if(place_meeting(x+lengthdir_x(1,grv_dir+(sign(hsp)*90))-lengthdir_x(a,grv_dir),y+lengthdir_y(1,grv_dir+(sign(hsp)*90))-lengthdir_y(a,grv_dir),par_solid)==0) {
    61. x += lengthdir_x(1,grv_dir+(sign(hsp)*90))-lengthdir_x(a,grv_dir);
    62. y += lengthdir_y(1,grv_dir+(sign(hsp)*90))-lengthdir_y(a,grv_dir);
    63. mov = 1;
    64. break;
    65. }
    66. }
    67. if(mov==0) {
    68. if (abs(hsp) > global.minShakeSpeed/2) {
    69. scr_shake_view(clamp(hsp*.35,-15,15));
    70. }
    71. hsp = 0;
    72. break;
    73. }
    74. } else {
    75. for(a=1;a<=max_slp && free==0;a+=1) {
    76. lis = instance_place_list(x+lengthdir_x(1,grv_dir+(sign(hsp)*90))-lengthdir_x(a-1,grv_dir),y+lengthdir_y(1,grv_dir+(sign(hsp)*90))-lengthdir_y(a-1,grv_dir),par_jumpthrough);
    77. if(lis!=noone) {
    78. for(b=0;b<ds_list_size(lis);b+=1) {
    79. jt = ds_list_find_value(lis,b);
    80. if(place_meeting(x+lengthdir_x(1,grv_dir+(sign(hsp)*90))-lengthdir_x(a,grv_dir),y+lengthdir_y(1,grv_dir+(sign(hsp)*90))-lengthdir_y(a,grv_dir),jt)==0) {
    81. x += lengthdir_x(1,grv_dir+(sign(hsp)*90))-lengthdir_x(a,grv_dir);
    82. y += lengthdir_y(1,grv_dir+(sign(hsp)*90))-lengthdir_y(a,grv_dir);
    83. mov = 1;
    84. break;
    85. }
    86. }
    87. if(mov==1){ds_list_destroy(lis);break;}
    88. ds_list_destroy(lis);
    89. }
    90. }
    91. if(mov==0) {
    92. for(a=max_slp;a>=1;a-=1) {
    93. if(place_meeting(x+lengthdir_x(1,grv_dir+(sign(hsp)*90))+lengthdir_x(a,grv_dir),y+lengthdir_y(1,grv_dir+(sign(hsp)*90))+lengthdir_y(a,grv_dir),par_solid)==0 && (place_meeting(x+lengthdir_x(1,grv_dir+(sign(hsp)*90))+lengthdir_x(a,grv_dir),y+lengthdir_y(1,grv_dir+(sign(hsp)*90))+lengthdir_y(a,grv_dir),par_jumpthrough)==0 && sign(vsp)>-1)) {
    94. if(place_meeting(x+lengthdir_x(1,grv_dir+(sign(hsp)*90))+lengthdir_x(a+1,grv_dir),y+lengthdir_y(1,grv_dir+(sign(hsp)*90))+lengthdir_y(a+1,grv_dir),par_solid)==1 || place_meeting(x+lengthdir_x(1,grv_dir+(sign(hsp)*90))+lengthdir_x(a+1,grv_dir),y+lengthdir_y(1,grv_dir+(sign(hsp)*90))+lengthdir_y(a+1,grv_dir),par_jumpthrough)==1) {
    95. x += lengthdir_x(1,grv_dir+(sign(hsp)*90))+lengthdir_x(a,grv_dir);
    96. y += lengthdir_y(1,grv_dir+(sign(hsp)*90))+lengthdir_y(a,grv_dir);
    97. mov = 1;
    98. break;
    99. }
    100. }
    101. }
    102. }
    103. if(mov==0) {
    104. x+= lengthdir_x(1,grv_dir+(sign(hsp)*90));
    105. y+= lengthdir_y(1,grv_dir+(sign(hsp)*90));
    106. }
    107. }
    108. }
    109. // VERTICAL MOVEMENT
    110. //////////////////////
    111. var stop;
    112. stop = 0;
    113. repeat(round(abs(vsp))) {
    114. if(place_meeting(x+lengthdir_x(1,grv_dir-90+(sign(vsp)*90)),y+lengthdir_y(1,grv_dir-90+(sign(vsp)*90)),par_solid)==1) {
    115. /*
    116. //Falldamage
    117. calculate_falldamage();
    118. if (abs(vsp) > global.minShakeSpeed) {
    119. scr_shake_view(clamp(vsp*.25,-15,15));
    120. }
    121. */
    122. vsp = 0;
    123. landed = 1;
    124. break;
    125. }
    126. if(place_meeting(x+lengthdir_x(1,grv_dir-90+(sign(vsp)*90)),y+lengthdir_y(1,grv_dir-90+(sign(vsp)*90)),par_jumpthrough)==1) {
    127. }
    128. var jt, lis;
    129. lis = instance_place_list(x+lengthdir_x(1,grv_dir),y+lengthdir_y(1,grv_dir),par_jumpthrough);
    130. if(lis!=noone) {
    131. for(a=0;a<ds_list_size(lis) && sign(vsp)==1;a+=1) {
    132. jt = ds_list_find_value(lis,a);
    133. if(place_meeting(x,y,jt)==0) {
    134. //Falldamage
    135. calculate_falldamage();
    136. if (abs(vsp) > global.minShakeSpeed) {
    137. scr_shake_view(clamp(vsp*.25,-15,15));
    138. }
    139. vsp = 0;
    140. landed = 1;
    141. break;
    142. }
    143. }
    144. ds_list_destroy(lis);
    145. }
    146. if(vsp==0)break;
    147. x+= lengthdir_x(1,grv_dir-90+(sign(vsp)*90));
    148. y+= lengthdir_y(1,grv_dir-90+(sign(vsp)*90));
    149. }
    150. free = 1;
    151. if(place_meeting(x+lengthdir_x(1,grv_dir),y+lengthdir_y(1,grv_dir),par_solid)==1) {
    152. free = 0;
    153. }
    154. var jt, lis;
    155. lis = instance_place_list(x+lengthdir_x(1,grv_dir),y+lengthdir_y(1,grv_dir),par_jumpthrough);
    156. if(lis!=noone) {
    157. for(a=0;a<ds_list_size(lis);a+=1) {
    158. jt = ds_list_find_value(lis,a);
    159. if(sign(vsp)>-1 && place_meeting(x,y,jt)==0){free=0;break;}
    160. }
    161. ds_list_destroy(lis);
    162. }
    163. // GRAVITY & FRICTION
    164. ///////////////////////
    165. if(argument5==0) {
    166. if(free==1) {
    167. vsp+=grv_spd;
    168. if(argument0-argument2==0){hsp=max(0,abs(hsp)-air_frc)*sign(hsp);}
    169. } else {
    170. jump = 0;
    171. if(argument0-argument2==0){hsp=max(0,abs(hsp)-gnd_frc)*sign(hsp);}
    172. }
    173. }
    Alles anzeigen



    script instance_place_list
    Spoiler anzeigen

    GML-Quellcode

    1. /*
    2. ** Usage:
    3. ** instance_place_list(x,y,obj)
    4. **
    5. ** Arguments:
    6. ** x,y placement of current instance for collision check
    7. ** obj object to check for collision
    8. **
    9. ** Returns:
    10. ** a ds_list id, or keyword noone if no instances are found
    11. **
    12. ** GMLscripts.com
    13. */
    14. {
    15. var x1,y1,obj,dsid,this,that,i;
    16. x1 = argument0;
    17. y1 = argument1;
    18. obj = argument2;
    19. dsid = ds_list_create();
    20. this = id;
    21. with (obj) {
    22. that = id;
    23. with (this) {
    24. i = instance_place(x1,y1,that);
    25. if (i != noone) ds_list_add(dsid,i);
    26. }
    27. }
    28. if (ds_list_empty(dsid)) {
    29. ds_list_destroy(dsid);
    30. dsid = noone;
    31. }
    32. return dsid;
    33. }
    Alles anzeigen



    und das hier müssten alle relevanten Variablen aus dem Create vom Player sein:
    Spoiler anzeigen

    GML-Quellcode

    1. base_max = 3; //max walking speed
    2. run_max = (base_max*2)-(base_max/2); //max running speed
    3. base_acc = 0.25; //walking acceleration
    4. run_acc = (base_acc*2)-(base_acc/1.5); //running acceleration
    5. max_spd = base_max; //max speed (current)
    6. acc_spd = base_acc; //accelaration (current)
    7. jmp_spd = -5; //jumping speed
    8. grv_spd = 1; //gravity speed
    9. grv_dir = 270; //gravity direction
    10. air_frc = 0.15; //horizontal friction in air (when no key is pressed)
    11. gnd_frc = 0.65; //horizontal friction on ground (when no key is pressed)
    12. max_slp = 8; //highest slope you can climb (in pixel)
    13. hsp = 0; //horizontal speed
    14. vsp = 0; //vertival speed
    15. free = 1; //indicates if in air (1) or on ground (0)
    16. spr_dir = 1; //sprite direction
    17. hold = 0; //whether the jump key is held
    18. jump = 0; //if jumping
    19. crouch = 0; //crouching
    20. slide = 0; //sliding
    Alles anzeigen



    Das ganze kannst du dann so benutzen:

    GML-Quellcode

    1. key_right = keyboard_check(ord("D"));
    2. key_left = keyboard_check(ord("A"));
    3. key_up = keyboard_check(ord("W"));
    4. motion(key_right,key_up,key_left,0,0,0);

    oder für forced motion(mit collision):

    GML-Quellcode

    1. motion(0,0,0,12,-4,true);


    du benötigst für das ganze Folgende Objekte als Parents (ohne Code):
    par_solid
    par_jumpthrough
    132 little bugs in the code. 132 little bugs. Fix a few, set the compiler to stew, 172 little bugs in the code... :vogel:
  • @Rhazul
    Danke für dein Code, aber ist für mich als Anfänger etwas schwer zu verstehen. Habe es versucht zu implementieren, hatte aber diverse Errors auf Grund fehlender Scripts usw. Habe die Scripts ergänzt aber irgendwie hab ichs nie zum laufen gekriegt. Ich denke auch das ich vorerst mal bei meiner jetzigen Version bleiben möchte.

    Habe es irgendwie fast soweit, aber irgendwie doch nicht.

    Meine Scripts sind wie folgt :
    Step Event Platform Physics
    Spoiler anzeigen

    GML-Quellcode

    1. if (place_meeting(x, y+1, obj_solid))
    2. | ((place_meeting(x, y+1, obj_jumpthrough)) && (!place_meeting(x,y,obj_jumpthrough)))
    3. {
    4. airjump = airjump_max;
    5. vspd = 0;
    6. // jump on the ground
    7. if (jkey)
    8. {
    9. vspd = -jspd;
    10. }
    11. }
    12. else
    13. {
    14. // gravity
    15. if (vspd < fallspeed_max)
    16. {
    17. vspd += grav;
    18. }
    19. if (keyboard_check_released(jkey2) && vspd < -4)
    20. {
    21. vspd = -4;
    22. }
    23. // check for airjump
    24. if (airjump > 0)
    25. {
    26. if (jkey)
    27. {
    28. vspd = -jspd;
    29. airjump -=1;
    30. }
    31. }
    32. }
    33. // moving right
    34. if (rkey)
    35. {
    36. if (hspd < spd)
    37. {
    38. hspd += fric;
    39. } else
    40. {
    41. hspd = spd;
    42. }
    43. }
    44. //moving left
    45. if (lkey)
    46. {
    47. if (hspd > -spd)
    48. {
    49. hspd -= fric;
    50. } else
    51. {
    52. hspd = -spd;
    53. }
    54. }
    55. // check for not moving
    56. if ((!rkey && !lkey) || (rkey && lkey)) {
    57. if (hspd !=0) {
    58. if (hspd < 0) {
    59. hspd += fric;
    60. } else {
    61. hspd -= fric;
    62. }
    63. }
    64. }
    Alles anzeigen


    Step Event Collision check:
    Spoiler anzeigen

    GML-Quellcode

    1. //---------------horizontal collision---------------\\
    2. if (place_meeting(x+hspd, y, obj_solid))
    3. {
    4. yplus = 0;
    5. while (place_meeting(x+hspd,y-yplus,obj_solid) && yplus <= abs(1*hspd)) yplus +=1;
    6. if place_meeting(x+hspd,y-yplus,obj_solid)
    7. {
    8. while (!place_meeting(x+sign(hspd), y, obj_solid)) x+=sign(hspd);
    9. hspd = 0;
    10. }
    11. else
    12. {
    13. y -= yplus;
    14. }
    15. }
    16. //---------------move horizontally---------------\\
    17. x += hspd;
    18. if !place_meeting(x,y,obj_solid) && vspd >= 0 && place_meeting(x,y+2+abs(hspd),obj_solid)
    19. {while(!place_meeting(x,y+1,obj_solid)) {y += 1;}}
    20. //---------------vertical collision---------------\\
    21. if (place_meeting(x, y+vspd, obj_solid))
    22. {
    23. while (!place_meeting(x, y+sign(vspd), obj_solid))
    24. {
    25. y+= sign(vspd);
    26. }
    27. vspd = 0;
    28. }
    29. //---------------move vertically---------------\\
    30. y += vspd;
    31. //---------------jump throught collision---------------\\
    32. if (place_meeting(x, y+vspd, obj_jumpthrough)) && (!place_meeting (x, y, obj_jumpthrough)) && vspd >=0
    33. {
    34. vspd = 0;
    35. }
    Alles anzeigen


    Die Grundsachen sind zusammengewurstelt aus aus Heartbeast, Shaun Spalding und was die Leute so in den Kommentaren geschrieben haben.

    Also es funktionert schon fast mit der JumpThrough Platform. Bin auch überrascht wie wenig nützliche Infos man zu dem Thema im Netz findet, sollte doch etwas einfaches sein ?(

    Wie auch immer, habe noch den Fehler das die Kollision nicht immer statt findet, mal bleibt er darauf stehen, mal fäll er durch. Der zweite Bug ist wenn ich von unten hochspringe und die Kollision erkannt wird, das er dann auf der Platform stehen bleicht statt seinen Sprung weiter zu machen.
    Kann mir jemand helfen?

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