Seltsamer Fehler bei BreakOut Clon

    Seltsamer Fehler bei BreakOut Clon

    Ein herzliches Hey einmal an die Community.

    Da ich nicht wirklich gut Programmieren kann, habe ich mir gedacht ich versuche mich erst einmal an etwas einfachen wie einen BreakOut Clon um die Oberfläche besser kennen zu lernen und um die Programiersprache auch besser verstehen zu können. Jetzt ist mir aber ein nicht nachvollziebarer Fehler unterlaufen, der sich nicht beseitigen lässt. Der Fehler ist leider nicht mit absicht reproduzierbar und tritt nicht immer an der selben stelle auf. Der ball bleibt sehr oft am Rand des schlägers hängen, das dem Spielspaß ein jehes ende bereitet. Am häufigsten tritt der Fehler auf, wen der Schläger die Wand berührt und der Ball genau in der Ecke landet, aber auch so bleibt der Ball ab und zu hängen (siehe Video). Trotz mereren Tutorials im Netz kann ich keinen Fehler finden, der mir passiert ist. Ich habe auch schon mehrere unterschiedliche Varianten, den ball springen zu lassen ausprobiert, leider lässt er sich nicht beseitigen.

    Sicher ist da ein Experte unter euch der den Fehler sofort sieht und mir unter die Arme greift. :)
    youtu.be/cZv6m1mVNh4

    Unter obj_paddle / Create habe ich folgendes was relevant ist:
    Spoiler anzeigen

    Quellcode

    1. ///Variablen
    2. xx = x;
    3. grab = false;
    4. rightLimit = room_width-(sprite_get_width(sprite_index)/2)-60;
    5. leftLimit = (sprite_get_width(sprite_index)/2)+60;
    6. instance_create(x,y-50,obj_paddle_1_hitbox);


    Unter obj_ball / obj_paddle habe ich folgendes das relevant ist:
    Spoiler anzeigen

    Quellcode

    1. direction = 90 + obj_paddle_1.x - x
    2. //move_bounce_all(true);
    3. speed = speed + 0.3
    4. gravity_direction = 270
    5. gravity = 0.003


    Ich schätze mal, das die Hitbox daran schuld sein könnte.
    Spoiler anzeigen
    Create:

    Quellcode

    1. ///Variablen
    2. xx = obj_paddle_1.xx;
    3. grab = false;
    4. rightLimit = obj_paddle_1.rightLimit;
    5. leftLimit = obj_paddle_1.leftLimit;


    Step:

    Quellcode

    1. //wenn die Maus nicht gekclickt wird
    2. if (!mouse_check_button(mb_left))
    3. {
    4. grab = false;
    5. }
    6. if (grab == false)
    7. {
    8. exit
    9. } else
    10. {
    11. //updatet die Koordinaten
    12. if ((mouse_x + xx) > leftLimit) && ((mouse_x + xx) < rightLimit)
    13. {
    14. x = mouse_x + xx;
    15. } else
    16. //legt das linke Ende fest
    17. if ((mouse_x + xx) < leftLimit)
    18. {
    19. x = leftLimit;
    20. } else
    21. //legt des rechte Ende fest
    22. if ((mouse_x + xx) > rightLimit)
    23. {
    24. x = rightLimit
    25. }
    26. }


    PS: GameMaker ver. 1.4.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „wickie“ ()

    Wenn der Ball mehr als 90 pixel vom Mittelpunkt entfernt auf den Schläger kommt wird er nach unten abgelenkt bei deiner Formel.
    Besser wäre: 90+(Abstand / (Länge/2))*MaxWinkel


    Zusätzlich könntest du checken ob vspeed>0 ist bevor du den ball nach oben abprallen lässt, so stellst du sicher, dass nach dem abprallen keine weitere Kollision ausgelöst wird, selbst wenn der Ball zuvor (zu) tief in den Schläger eingedrungen sein sollte.
    Erst einmal Danke für die Antwort.
    Leider ist es so, dass ich nicht wirklich Programmieren kann. Der Programmierer der mein Projek+t begleitet hat ist mir abgesprungen und jetzt habe ich niemanden, der mir deine Formel aufschlüsseln oder erklären kann. :/

    Mit dem Original Code von mir, hat der Ball ein Natürliches abspring verhalten, das am Anfang eher zufällig wirkt, aber vorhersehbar ist, da er sich im Grunde wie ein Gummiball verhält. Deinem Code zufolge schaffe ich das leider nicht. Wenn ich beim "MaxWinkel" eine Zahl eingebe, springt der Ball immer nur in eine Richtung ab. Bei 90° springt er immer nur nach links. Auch andere Zahlen oder Code brachten nicht das gewünschte Ergebnis. Ich weis, dass der Fehler bei mir liegt, aber du bist sicher so freundlich und erklärst mir wo mein Denkfehler liegt. :)

    Nach einer Woche, in der ich deinen Code studiert habe, bin ich zu folgendem Ergebnis gekommen:

    Quellcode

    1. if vspeed>0
    2. {
    3. direction = 90 + (distance_to_object(obj_paddle_1)/(sprite_get_width(sprite_index)/2))*90;
    4. }
    So sollte es richtig sein.

    GML-Quellcode

    1. //Collision with obj_paddle_1
    2. if vspeed>0
    3. {
    4. direction = 90 + (other.x - x)/(sprite_get_width(other.sprite_index)/2))*80;
    5. }

    Hab 80 statt 90 als maxWinkel eingetragen, da er sonst vom äußeren ende horizontal abprallen würde.

    distance_to_object gibt immer den absoluten Abstand an egal ob der Ball sich links oder rechts vom Paddle befindet und berücksichtigt zusätzlich auch den vertikalen Abstand, der in dem Fall irrelevant ist.
    Danke für deine tolle Hilfe, es ist schon viel besser, allerdings bleibt der ball gefühlt immernoch in 10% kleben.
    Kann es dafür auch an andere stelle einen grund geben?

    ich habe jetzt einmal den Codeteil "other.x" durch "obj_paddle_1.x" ersetzt und es scheint zu funktionieren.
    Was mich jetzt zu der Frage führt: warum eigentlich "Other"?

    Jetzt bleibt der Ball nur noch kleben, wenn er zwischen Wand und Schläger seitlich eingeklemmt wird. Dabei berührt der Ball aber den Schläger oder die Wand nicht richtig.
    Das "other" betrifft die Instanz mit der obj_ball kollidiert. Wenn du "obj_paddle_1" schreibst funktioniert das nur, wenn auch nur ein einzige Instanz von obj_paddle_1 vorhanden ist. Ansonsten könnte er eine beliebige Instanz referenzieren anstelle derer mit der die Kollision stattfindet.

    Um den Fehler einzugrenzen, müsste man wissen welcher Code bei einer Kollision mit der Wand ausgeführt wird.
    Du bist hier ja in guten Händen, aber da Du Dich jetzt in den Code Deines Programmierers erst einarbeiten
    mußt(was die Sache erheblich erschwert), versuche es doch für den Anfang, mit Tutorials.

    Einfach "game maker breakout tutorial" in die Suchmaschine Deiner Wahl eingeben und dann sollte unter
    den ersten Treffern, sogar ein Tutorial von YoYo Games sein.
    Selbst bei Englischen Beispielen, kann man nebenher mit Programmieren und sich die verwendeten Befehle,
    in der Hilfe dann in Ruhe ansehen, was so deren Aufgabe ist.

    Von geposteten Links habe ich mal Abstand genommen, falls es hier auch so eine "5 Beiträge, Spam Regel"
    gibt, aber Du findest sicher was :)

    Miradur
    @Miradur Danke für deinen Ratschlag, aber es ist doch etwas anders als du denkst. Der Programmierer hat mich mit einem anderen Projekt sitzen lassen, dass weit aus Komplexer ist als man sich vorstellen kann. Den Originalen Code habe ich da weitgehendst rausgeworfen, weil ich mir an vielen Stellen die Frage gestellt habe: "Warum nur so umständlich?". Jetzt bin ich an einem Punkt angekommen, wo mir Tutorials nicht mehr weiter helfen und ich erst einmal das Programmieren lernen muss um zu verstehen was ich da eigentlich mache. Deswegen habe ich ein neues Projekt angefangen, nämlich dieses "Break Out". Ich habe es auch schon seit 4 Monaten in einer fertigen spielbaren Version, aber mit dem besagten Fehler. Da mir mein Programmierer nicht mehr helfen wollte, bin ich halt auf die suche gegangen und auf dieses Forum gestoßen. Hier hat mir endlich einer erklären können was ich falsch gemacht habe und was mir die Hilfefunktion vom GameMaker nicht erklären wollte. Das Original Projekt werde ich wahrscheinlich nicht alleine ohne Programmierer stemmen können, aber ich versuche es wenigstens. :vogel:

    @TrunX Vielen Dank für die Antwort, jetzt weis ich Bescheid.
    Noch ist es nur ein Schläger in 3 Versionen, aber es sollen später mal 2 Schläger werden (im Spielmodus "UNMÖGLICH" oder lvl 50), daher auch die 1 hinter der Bezeichnung. Ich weis es ist eine Verrückte Idee, aber da es für Android gedacht ist, geht das schon in Ordnung. Man hat ja 2 Finger und Multitouch. Muhaaahaaahaaa ... :sauf:
    Die Kollision an der Wand ist ganz einfach gelöst:

    GML-Quellcode

    1. move_bounce_all(true);

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „wickie“ ()