3 Gleiche Objekte nebeneinander / in Linie

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

  • 3 Gleiche Objekte nebeneinander / in Linie

    Hallo zusammen,

    hab auch mal wieder eine Frage oder besser suche Denkanstoß zu einem Thema.

    Und zwar bin ich dabei ein, naja nennen wir es "Tetris" klon zu programmieren. Nur mit einzelen Blöcken.
    Nun möchte ich das mein Blöcke zerstört werden, wenn 3 Blöcke der gleichen Farbe nebeneinander sind / eine Linie ergeben.

    Wie könnte man das abfragen? Wäre es gut ein Controller Objekt zu haben, das das alles kontrolliert, oder sollte jeder Block sobald er gelandet ist es selbst rausfinden ob er teil einer linie aus 3 gleichfarbigen Blöcken ist?

    Danke schonmal im vorraus für Tipps und Anregungen :)
  • Kannst du nicht überprüfen ob links und rechts das selbe Objekt existiert?
    Dann weiß das ObJekt es sind 3 in einer Reihe und muss alle zerstören.

    Grüße
    Christian
    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.





  • Naja, wenn du für jeden Block einer Farbe ein eigenes Objekt hast, könntest du praktisch einfach im Stepevent abfragen, ob die nebenliegenden Blöcke ebenfalls Blöcke der selben Farbe sind, praktisch:

    GML-Quellcode

    1. //StepEvent BlockGrün
    2. if place_meeting(x,y+10,parent_alleblockfarben) //wenn unter dem Block ein Block ist, wird abgefragt, ob eine Linie gebildet ist, andernfalls würde der Block ja noch fallen, weil er den Boden nochnicht erreicht hat
    3. {
    4. if place_meeting(x+10,y,blockgrün) and place_meeting(x-10,y,blockgrün)
    5. {
    6. global.Punktestand=global.Punktestand+100// <-punkte durch die komplettierung der reihe
    7. instance_destroy()//<- zerstörung der instanz
    8. }
    9. }


    Bei dem Beispiel herrscht allerdings das problem, das nur der mittlere der drei grünen Blöcke zerstört werden würde, ich kenne mich selber nicht sehr gut aus, aber ich würde dann ein weiteres Objekt erstellen-ein "Zerstörungs"-Objekt (mit netter animation oder so), dass dann die anderen Blöcke der Reihe auchnoch zerstört.

    Habe leider nicht sehr viel Zeit um ausführlicher zu werden, aber hoffe es war ne nette Anregung.
    Im Internet weiß niemand, dass du ein Truthahn bist.

  • Kannst du nicht überprüfen ob links und rechts das selbe Objekt existiert?


    Das war mein Ziel... und Dank Falcfire hat es auch geklappt soweit so gut :)

    Wenn es zu 100% klappt meld ich mich nochmal! Danke schonmal!

    Edit:
    Danke Falcfire das hat sehr geholfen. Nach 1-2 Stunden hat das ganze dann so funktioniert wie ich es mir vorgestellt habe :)
    Danke für den Denkanstoß!

    Hm bin ich blind oder wie kann ich das Thema von Unerledigt auf Erledigt stellen? :)

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

  • Schön, das es dir geholfen hat :)

    Habe noch ein bisschen überlegt, wenn du es so machen würdest müsste es funktionieren, ohne dass durch ein Step-Event oder so Probleme mit dem Punktesystem aufkommen sollten:

    GML-Quellcode

    1. //Step-Event BlockGrün
    2. if place_meeting(x,y,Zerstörerblock)
    3. {
    4. instance_destroy()//Zerstörung nach voller Reihe
    5. }
    6. else if place_meeting(x,y+10,parent_alleblockfarben) //Block fällt nichtmehr, ist auf Boden
    7. {
    8. if place_meeting(x+10,y,BlockGrün) and place_meeting(x-10,y,BlockGrün)//<-drei gleiche Blöcke horizontal nebeneinander
    9. {
    10. instance_create(x-10,y,ZerstörerBlock)//Blöcke zur Zerstörung
    11. instance_create(x,y,ZerstörerBlock)
    12. instance_create(x+10,y,ZerstörerBlock)
    13. }
    14. }
    Alles anzeigen


    GML-Quellcode

    1. //Create-Event ZerstörerBlock
    2. global.Punktestand=global.Punktestand+100//hier musst du aufpassen, weil der Block einmal pro Block zum Zerstören erstellt wird, dass heißt bei 3 Blöcken pro Reihe wird der Punktestand nicht von 0 auf 100 erhöht, sondern von 0 auf 300


    GML-Quellcode

    1. //Step-Event ZerstörerBlock
    2. instance_destroy()//damit die Blöcke, die von oben nachkommen, nicht sofort zerstört werden


    Wenn man es so macht hat man allerdings wesentlich mehr Instanzen, dass sollte allerdings bei einem kleinen Spiel kein Problem sein. Was hingegen ein Problem geben könnte, ist, wenn die Blöcke von oben schneller runterfallen, als das der ZerstörerBlock sich selbst zerstört, wodurch dann Blöcke kaputtgehen würden, die eigentlich keine Reihe gebildet haben.
    Du könntest dann aber einfach den ZerstörerBlock zum parent_alleblockfarben hinzufügen, sodass die Blöcke darüber sich einfach so verhalten, als ob unter ihnen ein Block ist, solange sich der ZerstörerBlock nochnicht selbst entfernt hat.

    Edit: Mist, gerade erst das Edit gelesen xD Hoffe dass die ganze Schreiberei in Zukunft trotzdem noch nützlich sein kann^^
    Im Internet weiß niemand, dass du ein Truthahn bist.

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

  • Danke trotzdem nochmal für deine Mühen.

    Und ja, das war ein Problem das mein zerstörerobjekt auch blöcke dann zerstört hat, wenn Ein block vorbeigeflogen war und diese dann eine linie bildeten. Das durfte nicht sein.

    Hab das so gelöst, das solange ein Block noch fliegt, eine globale Variable auf false gestellt wird. Wenn block gelandet ist, wird sie wieder auf true gestellt und erst dann wird wieder überprüft ob Linien gebildet wurden.

    Das zerstörer Objekt is so gross wie 3 blöcke und bekommt eine Variable zu gewiesen, ob es grüne, rote, blaue etc blöcke zerstören soll und wird dann erstellt. Bei collision mit den blöcken werden diese 3 dann zerstört. Und nur die Farbe die es auch zerstören soll.