Bubble Shooter - Engine usw ist fertig. Doch ich stecke wo fest ...

  • GM 6

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

  • Bubble Shooter - Engine usw ist fertig. Doch ich stecke wo fest ...

    Ich bin gerade dabei ein Bubble Shooter Game zu entwickeln. Gestern habe ich angefangen und bin auch schon fast fertig. Rasterengine, Auflöseengine, usw ist alles fertig und stabil. Sogar den Shakeeffekt habe ich hinbekommen. :)
    Außer noch wenige Details und Features stecke ich gerade an einer blöden Stelle fest:

    Ich bekomme die "Fallengine" nicht hin.
    Ihr kennt doch bestimmt dieses Game: hier
    Wenn dort Bubbles in der leer stehen, fallen sie herab. Ich habe es auch schon fast geschafft, denoch gab es wieder andere Probleme. Also muss ich wieder von vorne mit dieser Engine anfangen.
    Vielleicht kann mir jemand helfen?
    Die Frage ist, wie frage ich ab? instance_place(x,y,ob) ist klar. Wie kann ich das aber in einer Gruppe von Bubbles umsetzen? (s.Bild)

    EDIT: Wenn möglich im einen einzelnen ALARM Event.
    Bilder
    • Fallengine.jpg

      259,13 kB, 813×522, 356 mal angesehen
    57 6F 77 2C 20 64 61 73 20 68 61 73 74 20 64 75 20 67 61 6E 7A 20 61 6C 6C 65 69 6E 20 67 65 73 63 68 61 66 66 74 2E 20

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

  • Du hast es ja irgendwie hinbekommen, dass du erkennst wieviele Bälle zusammenhängen um sie dann zu zerstören falls es genug sind, das gleiche Script solltest du auch hier verwenden können, indem du die Bälle zu Gruppen zusammenfügst und dann prüfst ob diese Gruppen irgendwo an der Decke befestigt sind (das kannst du z.B. prüfen indem du den Ball suchst, der die kleinste y-Pos. hat und schaust, ob der an der Decke ist).

    mfg Dragoon
    int (*x(*x(int))[5])(int*);
    Confused? Yes, it's C!
  • Leider geht es mit dieser Methode nicht direkt.
    Natürlich die Funktion instance_place() benötigt. ... Ich habe auch schon Fortschritte mit der "Fallengine" gemacht.
    Ich hatte damals genau so angefangen, wie du jetzt hier geschrieben hast. Aber es funktionierte noch nicht perfekt.
    Ich brauche irgendwie einen Geistesblitz. :)
    Da werde ich noch ein bisschen probieren müssen.

    Aber ich versuche mal zu erklären wie die "Auflöse-Engine" funktioniert (siehe dazu auch das Bild):
    1. Wenn eine Kugel abgefeuert wird, landet sie immer zwischen zwei Kugeln. Die berührt also immer zwei.
    Diese zwei Kugeln bekommen jetzt mit Hilfe der with und other Funktion ein Alarm-Event ausgeführt.
    2. Nun wird gegenseitig gefragt, ob die Kugeln rundrum in der nähe die gleiche Farbe hat. Wenn ja bekommt die nächste mit with und other das Alarm-Event ausgeführt.
    Dabei wird jede die schon gefragt wurde eine Art Häkchen (checked=true).
    3. Da in jedem Alarm-Event auch ein counter mitläuft (Objeckt: Conroller; Var: count=0), kann man nach dem Schritt prüfen, ob es min. 3 Kugeln sind die positiv gecheckt wurden. Somit werden diese Aufgelöst.


    (Script im Bild wurde zum besseren Verständnis leicht verändert.)
    Bilder
    • fallen2.jpg

      46,97 kB, 373×311, 259 mal angesehen
    57 6F 77 2C 20 64 61 73 20 68 61 73 74 20 64 75 20 67 61 6E 7A 20 61 6C 6C 65 69 6E 20 67 65 73 63 68 61 66 66 74 2E 20

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

  • Warum machst du das auch mit Alarm-events... einfache Rekursion ist da effektiver, das könnte in etwa so aussehen:

    GML-Quellcode

    1. {
    2. var eid,color,num,i,iid,abstand,obj;
    3. abstand=16;
    4. obj=obj_ball;
    5. eid=argument0;
    6. color=argument1;
    7. num=argument2;
    8. for(i=0;i<360;i+=60)
    9. {
    10. iid=instance_position(eid.x+lengthdir_x(abstand,i),eid.y+lengthdir_y(abstand,i),obj);
    11. if(iid!=noone)
    12. {
    13. if(iid.color==color)&&(iid.checked==0)
    14. {
    15. iid.checked=1;
    16. num=scr_check(iid,color,num+1);
    17. }
    18. }
    19. }
    20. return num;
    Alles anzeigen

    Und so wird es ausgeführt:

    GML-Quellcode

    1. iid=/*Start-instanz der Prüfung*/;
    2. with(obj_ball){checked=0;}
    3. iid.checked=1;
    4. num=scr_check(iid,iid.color,1);
    5. /*num ist die Anzahl an getroffenen Steinen*/

    Wenn du scr_check mit allen Steinen, die die Decke berühren ausführst, dann haben alle Steine, die checked=1 haben auch Kontakt mit der Decke, also kannst du alle anderen fallen lassen.

    mfg Dragoon
    int (*x(*x(int))[5])(int*);
    Confused? Yes, it's C!
  • Natürlich, das ist auch keine schlechte Idee Dragoon. Danke für den Tip.
    Ich habe jetzt aber schon selber eine Lösung gefunden :).
    Ist mir so plötzlich in den Kopf geschossen.
    Es wird rundum solange abgefragt, bis eine Kugel mit keinem "Häkchen" auftaucht. Dann wird wider eine "Rückkoplung" durchgeführt, um alle Kugeln dieser Kette wieder var fallen auf false zu stellen. Falls das ganze nicht eintritt, wird schon vorher geprüft, ob Plätze um eine Kugel die Abfragt frei sind oder auf diesen dann eine Kugel mit fallen=true ist. USW.
    Natürlich muss man Oben und Seiten berücksichtigen. ....
    Kurz gesagt: Irgend ein Wirrwarr zusammen gescript :D. Aber es klappt stabil.

    Danke für deine Hilfe Dragoon. Deine Methode lässt sich natürlich auch umsetzen. Als ich vorgestern angefangen hatte, habe ich daran garnicht gedacht. :)
    57 6F 77 2C 20 64 61 73 20 68 61 73 74 20 64 75 20 67 61 6E 7A 20 61 6C 6C 65 69 6E 20 67 65 73 63 68 61 66 66 74 2E 20

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