Match 3 Game, wie Candy Crush Saga. Ich brauche eure Hilfe!

    Match 3 Game, wie Candy Crush Saga. Ich brauche eure Hilfe!

    Guten Abend liebe Gamemaker Community!
    Ich bin ein recht neuer Programmierer, mache das ganze seit etwa 1 Jahr und habe noch nicht alles gelernt (sofern das überhaupt möglich ist).
    Ich habe mich dazu entschieden ein Match 3 Game machen zu wollen, habe mich riesig darauf gefreut habe alle Grafiken gezeichnet und fertig. Bin sehr zufrieden mit ihnen habe aber das Programmieren des Projektes komplett unterschätzt.
    Kurz gesagt ich habe Ostern damit verbracht zu versuchen das irgendwie auf die Reihe zu bekommen habe insgesamt 22 Stunden gearbeitet und versucht ein Match 3 Spiel zu programmieren, man kann nichts machen, da alles zu einem Error wurde oder nicht das gemacht hat was es sollte.... Ich habe daraufhin stundenlang im Internet gesucht. Es gibt auf Youtube wenige Tutorials die sich überhaupt mit Match 3 spielen befassen, und die die es tun erklären nicht ordentlich oder funktionieren nicht... Im Internet ausserhalb von Videos konnte ich auch keinerlei Hilfe finden. Ich bin sehr frustriert... Aber ich möchte das projekt wie schon gesagt nicht aufgeben... Da ich alle Grafiken und so weiter schon fertig habe. Wäre schade um die Arbeit. Kann mir einer von euch ein Tutorial erstellen? Mir eine Anleitung schreiben? Ich bin für jede Hilfe dankbar! Ich hoffe hier finde ich noch meine Rettung!
    Mit freundlichen grüßen!
    Hallo DragoonerGames ,

    ​es ist auch absolut nicht einfach ein vernünftiges Match-3 Game zu erstellen.
    ​(vor allem an einem Wochenende für einen Anfänger)

    ​Es kommt natürlich auch auf die gewünschten Funktionen an.

    ​Kennst du dieses Tutorial schon:



    Teil 1 von 11

    Sieht sehr lang, aber dafür auch sehr komplex aus.

    Schönen Abend noch.
    Wie hast du es denn versucht umzusetzen? Ich würde ein ds_grid benutzen
    132 little bugs in the code. 132 little bugs. Fix a few, set the compiler to stew, 172 little bugs in the code... :vogel:
    Also wenn dir ein Tutorial ein zu enges Korsett ist und du was lernen willst, dann würde ich auf keine fertige match3 engine zurückgreifen. Da hast du nur viel Code von dem du nicht weißt, was er macht und wo du überall was anpassen musst.

    Ein ds_grid ist eine Datenstruktur, das ist quasi dann eine repträsentation deines Spielfelds, wobei eine zelle eines grid dann mit zB einer Farbe befüllt ist. Ein grid hat zwar eine fest größe zB 8x16 Zellen, aber die Größe deiner Sprites ist egal. Weil du einfach deine Sprites alle soundsoviel pixel drawen lassen kannst.

    Probier mal folgendes.

    GML-Quellcode

    1. ///create
    2. gridWidth = 8;
    3. gridHeight = 16;
    4. board = ds_grid_create(gridWidth,gridHeight);
    5. for(yy = 0 ; yy < gridHeight-1 ; yy += 1){
    6. for(xx = 0 ; xx < gridWidth-1 ; xx += 1){
    7. board[# xx,yy] = irandom(3); //mit grid[# x,y] kansnt du einen wert ins grid an stelle x,y setzen oder lesen
    8. }
    9. }


    jetzt brauchst du ein sprite mit 4 verschiedenen zuckerl als subimage, weil du mit irandom(3) einen wertr von 0-3 eingespeichert hast.

    GML-Quellcode

    1. ///Draw
    2. var cellSize = 1;
    3. for(yy = 0 ; yy < gridHeight-1 ; yy += 1){
    4. for(xx = 0 ; xx < gridWidth-1 ; xx += 1){
    5. draw_sprite(spr_zuckerl, board[# xx,yy], xx*cellSize, yy*cellSize);
    6. }
    7. }

    spiel dich hier mit dem cellSize Wert, dann kannst du das grid in verschiedenen größen zeichnen lassen. Falls deine Sprites 32x32 pixel groß sind, dann ist cellSize am besten auch 32px groß.

    Wenn du dann wieder runter rechnen musst auf cellSize 1 damit du einen bestimmten Eintrag im grid ändern kannst musst du nur durch cellSize dividieren.

    GML-Quellcode

    1. ///step
    2. if mouse_check_button_pressed(mb_left){
    3. board[# mouse_x div cellSize, mouse_y div cellSize] = 0;
    4. }
    5. ich hoffe, dass hilft dir weiter. In der offiziellen Dokumentation findest du auch ganz viele nützliche Funktionen die du mit ds_grids machen kannst. zB die Summe aus 3 grid EInträgen zu berechenen etc.

    ancient-pixel.com
    youtube.com/user/SebastianMerkl <<< ich freu mich über einen Besuch ;)
    Am einfachsten wäre diese Lösung:
    Erstelle eine Queue und eine List.
    Setze das angeklickte Objekt (oder was dein klickbares Teil repräsentiert) in die Queue. Dann eine While-Schleife, die so lange geht, bis die Queue nur noch eine Größe von 0 hat.
    Am Anfang der Schleife schaust du vom Objekt, dass du aus der Queue in eine Variable dequeuest, in alle Richtungen, also 90 bzw. 45°, ob dort ein eine weitere Sorte vorhanden ist. Wenn ja und in der Liste das Objekt noch nicht vor kam, dann packe es in die Liste und in die Queue. Nach der Schleife hast du schon eine Liste an allen Nachbaren die die eigene Sorte haben.
    Damit kannst du dann weiter arbeiten.

    Edit: @Aku_Ryou war schneller :)

    Bei weiteren Fragen einfach fragen ;)
    Lg Husi
    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
    Schaue dir mal diesen Algo an:

    de.wikipedia.org/wiki/Floodfill

    Dieser Algo könnte teilweise für dich wichtig sein.

    ​Hierbei wäre natürlich wichtig wie gut der Gamemaker mit Rekursionen (Funktion ruft sich selber auf) klar kommt.

    ​Aber die Grundlagen sind trotzdem gut.

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

    @Weihnachtswichtel
    es geht, ich habe genau den Algo erst letztens im GM implementiert. Auf dem Marktetplace werden die von 0,99€ bis 3,99€ verkauft 8|

    Jedenfalls wenn man den Code Eins zu Eins übernimmt, dann hängt sich der GM schon bei geringer Größe des grids auf. Aber so;

    GML-Quellcode

    1. ///filll4(x,y,newcolour,oldcolour)
    2. var xx = argument0;
    3. var yy = argument1;
    4. var newC = argument2;
    5. var oldC = argument3;
    6. if (xx >= 0 && xx < gridW && yy >= 0 && yy < gridH)
    7. {
    8. if (colourGrid[# xx,yy] == oldC){
    9. colourGrid[# xx,yy] = newC;
    10. if (colourGrid[# min(xx+1,gridW-1),yy] != newC){
    11. fill4(xx+1,yy,newC,oldC);
    12. }
    13. if (colourGrid[# max(0,xx-1),yy] != newC){
    14. fill4(xx-1,yy,newC,oldC);
    15. }
    16. if (colourGrid[# xx,min(yy+1,gridH-1)] != newC){
    17. fill4(xx,yy+1,newC,oldC);
    18. }
    19. if (colourGrid[# xx,max(0,yy-1)] != newC){
    20. fill4(xx,yy-1,newC,oldC);
    21. }
    22. }
    23. }


    ancient-pixel.com
    youtube.com/user/SebastianMerkl <<< ich freu mich über einen Besuch ;)