Boulder Dash - Code Problem

  • Boulder Dash - Code Problem

    Hi an alle :)

    War gerade dabei mein Hauptengine vom Boulder Dash zu Testen ob alles funktioniert. Zu meinen bedaueren leider nicht. Bei meinen Rechts- bzw. Linksläufer funktioniert der Code nur halbwegs. Ich zeig euch den Code die ich geschrieben habe der in Step Event steht

    GML-Quellcode

    1. //////////////////////////////////////////
    2. // Schmetterlinge sind rechts-Läufer //
    3. //////////////////////////////////////////
    4. {
    5. Richt = false
    6. speed = max_speed;
    7. if ( !place_snapped(32,32) ) exit;
    8. switch (direction)
    9. {
    10. case 0: // läuft nach rechts
    11. // prüfe wohin der Rechtsläufer laufen kann, beginnend mit unten, dann rechts, dann oben und dann wieder nach links
    12. if (!position_meeting(x,y+32,obj_Rand) &&
    13. !position_meeting(x,y+32,obj_Erde) &&
    14. !position_meeting(x,y+32,obj_Fels) &&
    15. !position_meeting(x,y+32,obj_Diamant) &&
    16. !position_meeting(x,y+32,obj_Mauer) &&
    17. !position_meeting(x,y+32,obj_magische_Mauer_an) &&
    18. !position_meeting(x,y+32,obj_magische_Mauer_aus) &&
    19. !position_meeting(x,y+32,obj_Quadrat) &&
    20. !position_meeting(x,y+32,obj_Schmetterling))
    21. {
    22. // unter uns ist kein Objekt
    23. Richt = 270;
    24. }
    25. else if (!position_meeting(x+32,y,obj_Rand) &&
    26. !position_meeting(x+32,y,obj_Erde) &&
    27. !position_meeting(x+32,y,obj_Fels) &&
    28. !position_meeting(x+32,y,obj_Diamant) &&
    29. !position_meeting(x+32,y,obj_Mauer) &&
    30. !position_meeting(x+32,y,obj_magische_Mauer_an) &&
    31. !position_meeting(x+32,y,obj_magische_Mauer_aus) &&
    32. !position_meeting(x+32,y,obj_Quadrat) &&
    33. !position_meeting(x+32,y,obj_Schmetterling))
    34. {
    35. // rechts von uns ist kein Objekt
    36. Richt = 0;
    37. }
    38. else if (!position_meeting(x,y-32,obj_Rand) &&
    39. !position_meeting(x,y-32,obj_Erde) &&
    40. !position_meeting(x,y-32,obj_Fels) &&
    41. !position_meeting(x,y-32,obj_Diamant) &&
    42. !position_meeting(x,y-32,obj_Mauer) &&
    43. !position_meeting(x,y-32,obj_magische_Mauer_an) &&
    44. !position_meeting(x,y-32,obj_magische_Mauer_aus) &&
    45. !position_meeting(x,y-32,obj_Quadrat) &&
    46. !position_meeting(x,y-32,obj_Schmetterling))
    47. {
    48. // über uns ist kein Objekt
    49. Richt = 90;
    50. }
    51. else if (!position_meeting(x-32,y,obj_Rand) &&
    52. !position_meeting(x-32,y,obj_Erde) &&
    53. !position_meeting(x-32,y,obj_Fels) &&
    54. !position_meeting(x-32,y,obj_Diamant) &&
    55. !position_meeting(x-32,y,obj_Mauer) &&
    56. !position_meeting(x-32,y,obj_magische_Mauer_an) &&
    57. !position_meeting(x-32,y,obj_magische_Mauer_aus) &&
    58. !position_meeting(x-32,y,obj_Quadrat) &&
    59. !position_meeting(x-32,y,obj_Schmetterling))
    60. {
    61. // links von uns ist kein Objekt
    62. Richt = 180;
    63. }
    64. else
    65. {
    66. // keine Möglichkeit
    67. speed = 0;
    68. }
    69. break;
    Alles anzeigen


    Dies ist aber nur ein Auszug. Da für die andere Richtung im Grund das selbe steht und die Angabe der Richtung änder sich.
    Aber jetzt zu meinen eigentlichen Problem. Wie ihr im Code sehen könnt frage ich ab auf welches Objekt ich nicht treffen und reagiere dem entsprechend. So wei so gut. Bloß Ignoriert er ab obj_magische_Mauer_an alles. Für das Prog sind sie nie vorhanden.
    Aber wenn ich den Code so schreibe

    GML-Quellcode

    1. //////////////////////////////////////////
    2. // Schmetterlinge sind rechts-Läufer //
    3. //////////////////////////////////////////
    4. {
    5. Richt = false
    6. speed = max_speed;
    7. if ( !place_snapped(32,32) ) exit;
    8. switch (direction)
    9. {
    10. case 0: // läuft nach rechts
    11. // prüfe wohin der Rechtsläufer laufen kann, beginnend mit unten, dann rechts, dann oben und dann wieder nach links
    12. if (!position_meeting(x,y+32,all))
    13. {
    14. // unter uns ist kein Objekt
    15. Richt = 270;
    16. }
    17. else if (!position_meeting(x+32,y,all))
    18. {
    19. // rechts von uns ist kein Objekt
    20. Richt = 0;
    21. }
    22. else if (!position_meeting(x,y-32,all))
    23. {
    24. // über uns ist kein Objekt
    25. Richt = 90;
    26. }
    27. else if (!position_meeting(x-32,y,all))
    28. {
    29. // links von uns ist kein Objekt
    30. Richt = 180;
    31. }
    32. else
    33. {
    34. // keine Möglichkeit
    35. speed = 0;
    36. }
    37. break;
    Alles anzeigen


    Also wenn ich es so schreib mit dem "all" klappt alles. Da wird jedes Objekt erkannt. Das möchte ich aber nicht. Da ich auf den Spieler bzw. auf die Amöbe spezell reagieren muss. Und die Collision abfrage funkt nicht, da die Routine im Step Event dies ja verhintert. Spich der Schmetterling berührt zwar den Spieler, aber da die Collisonabfrage einwenig später abgefragt wird, ist ja der Schmetterling schon wo anders.
    Eigentlich bräuchte ich einen Befehl der folgendes aussage "Prüfe alle Objekte ausser bla, bla.
    So ich hoffe das ich mich verständlich ausgedrückt habe.
    Und vor allem Dinge ob mir einer Helfen kann den Code dem entsprechend umzuprogammieren.
    Gruss euer Drachen :)
  • Hallo Drachen

    Vielleicht lässt sich dein Problem mit Parents lösen. Dabei gibt es ein "Ober-Objekt". Du prüfst dann nur ob eine Kollision mit dem Ober-Objekt bestehen würde. Allen Objekte, die geprüft werden sollen, gibts du das Ober-Objekt als Parent. Dann ist erstens dein Code deutlich kürzer und einfacher und zweitens werden nur die Objekte kontrolliert, die du kontrollieren willst, und nicht alle.
    Da ich an meinem Mac sitze kann ich dir leider nicht sagen, ob das Ganze funktioniert, aber versuchen kannst du es ja mal. Hier gibt es ein Tutorial zur Verwendung von Parents von Win, in dem alles genau erklärt wird.

    Ich hoffe ich konnte dir helfen, mfg phate
  • Hi Phate :)

    Vielen Dank für deine Antwort. Das werde ich gleich ausprobieren. (Warum fällt mir bloss nie so was ein.)
    Wenn es klappt sage ich wieder bescheid.

    Gruss Drachen :)

    Etwas später

    Wollte euch nur mitteilen das alles jetzt funktioniert. Genau so wollte ich es haben. Vielen Dank noch einmal an Phate für seinen Hilfreichen Tip.
    Damit ist mein Problem gelöst.

    Gruss Drachen :thumbsup: :thumbsup: :thumbsup: :thumbsup: :thumbsup: :thumbsup: :thumbsup: :thumbsup: :thumbsup:

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von Drachen ()