Verschiebbare Kiste bei Platformer

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

  • Verschiebbare Kiste bei Platformer

    Guten Abend,

    Ich bastel seit einigen Tagen an einem Platformer dabei bin ich auf Folgendes Problem gestoßen:

    Der Spieler (obj_player) soll durch dagegen laufen eine Kiste (obj_box) verschieben können, habe verschiedene Varianten ausprobiert bei der erfolgreichsten ist der Spieler sobald die Kiste die Wand (obj_block) berührt hat durch die Kiste gelaufen.

    Ich poste mal meine obj-Skripte ich hoffe mir kann jemand helfen.

    obj_player
    Create:

    Quellcode

    1. /// Init. Variables
    2. grav = 0.2;
    3. hsp = 0;
    4. hsp_carry = 0;
    5. vsp = 0;
    6. jumpspeed = 8;
    7. movespeed = 4;
    8. key_down = 0;


    Step:

    Quellcode

    1. /// Players Input
    2. key_right = keyboard_check(vk_right);
    3. key_left = -keyboard_check(vk_left);
    4. key_jump = keyboard_check(vk_up);
    5. key_down = keyboard_check(vk_down);
    6. //React to Inputs
    7. move = key_right + key_left;
    8. hsp = move * movespeed;
    9. if(vsp < 10)
    10. {
    11. vsp += grav;
    12. }
    13. if(place_meeting(x,y+1,obj_block))
    14. {
    15. if (key_jump)
    16. {
    17. vsp = -jumpspeed;
    18. }
    19. }
    20. hsp_final = hsp + hsp_carry;
    21. hsp_carry = 0;
    22. // Horizontal Collision
    23. if (place_meeting (x + hsp_final,y,obj_block))
    24. {
    25. while (!place_meeting(x+sign(hsp_final),y,obj_block))
    26. {
    27. x += sign(hsp_final) ;
    28. }
    29. hsp_final = 0;
    30. hsp = 0;
    31. }
    32. // Vertical Collision
    33. if (place_meeting (x,y + vsp,obj_block))
    34. {
    35. while (!place_meeting(x,y+sign(vsp),obj_block))
    36. {
    37. y += sign(vsp) ;
    38. }
    39. vsp=0;
    40. }
    41. x += hsp_final;
    42. y += vsp;
    43. // Animate
    44. if (move!=0) {image_xscale=move}
    45. if (place_meeting(x,y+1,obj_block))
    46. {
    47. if (hsp!=0)
    48. {
    49. sprite_index = spr_player_run;
    50. }
    51. else
    52. {
    53. sprite_index = spr_player_idle;
    54. }
    55. if (place_meeting(x+move,y,obj_block))
    56. {
    57. sprite_index = spr_player_push;
    58. }
    59. }
    60. else
    61. {
    62. if (vsp < 0)
    63. {
    64. sprite_index = spr_player_jump;
    65. }
    66. else
    67. {
    68. sprite_index = spr_player_fall;
    69. }
    70. }
    Alles anzeigen


    obj_box (hat den parent obj_block)

    Create:

    Quellcode

    1. image_index = 0;
    2. hsp = 0;
    3. vsp = 0;
    4. grav = 0.2;


    Step:

    Quellcode

    1. vsp += grav;
    2. // Movability
    3. if (place_meeting(x,y,obj_player))
    4. {
    5. hsp = obj_player.hsp_final;
    6. }
    7. else
    8. {
    9. hsp = 0;
    10. }
    11. // Horizontal Collision
    12. if (place_meeting (x + hsp,y,obj_block))
    13. {
    14. while (!place_meeting(x+sign(hsp),y,obj_block))
    15. {
    16. x += sign(hsp) ;
    17. }
    18. hsp = 0;
    19. }
    20. // Vertical Collision
    21. if (place_meeting (x,y + vsp,obj_block))
    22. {
    23. while (!place_meeting(x,y+sign(vsp),obj_block))
    24. {
    25. y += sign(vsp) ;
    26. }
    27. vsp = 0;
    28. }
    29. x += hsp;
    30. y += vsp;
    Alles anzeigen


    Ich wäre sehr dankbar für eine Lösung da die Tutorials die es zu dem Thema gibt schrecklichen Code enthalten.
  • Bin grad nur am Handy, aber kann man bei key press nicht überprüfen ob der player sich an der Kiste befindet und wenn ja überprüft man, ob neben der Kiste Platz ist oder dort z.B. eine Wand ist. Wenn nein bewegt man player und Kiste weiter und wenn dort eine Wand (o.Ä.) ist, dann werden weder player noch Kiste bewegt.
    Aktuelles Projekt: Aufbau - Strategiespiel.
    Aktueller Entwicklungsschritt: Planung | Grundengine entwickeln.

    Wichtig ist nicht, besser zu sein als alle anderen.
    Wichtig ist, besser zu sein als du gestern warst.





  • Werde ich aufjedenfall noch mal so probieren, das war auch mit eine meiner ersten Ideen,

    Meine herangehensweise bisher war eher Code technisch simpler wenn place_meeting zwischen beiden Objekten stattfindet, dann übernimmt die Box die Geschwindigkeit vom Player

    Quellcode

    1. ​if (place_meeting(x,y,obj_player))
    2. {
    3. hsp = obj_player.hsp_final;
    4. }


    das Problem dabei ist sobald der Player die Box berührt ist sein hsp=0 da Box ja ein Kind von obj_Block ist.
    Die Beziehung zwischen obj_box und obj_block lässt sich aber nicht ändern da ansonsten unnötiger Code entsteht.
  • Habe die Horizontale Collisions Abfrage im Player Step Event geändert, das schieben würde funktionieren,

    Quellcode

    1. ​// Horizontal Collision
    2. if (place_meeting (x + hsp_final,y,obj_block))
    3. {
    4. if (place_meeting(x + hsp_final,y,obj_box))
    5. {
    6. }
    7. else
    8. {
    9. while (!place_meeting(x+sign(hsp_final),y,obj_block))
    10. {
    11. x += sign(hsp_final);
    12. }
    13. hsp_final = 0;
    14. hsp = 0;
    15. }
    16. }
    Alles anzeigen


    man müsste dem obj_Player nur sagen wenn obj_box collision mit obj_block hat dann is hsp = 0;