Gegner soll automatisch in entstandende Lücke springen

  • GM 8

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

  • Gegner soll automatisch in entstandende Lücke springen

    Hi Leute.

    Ich komm grad nicht weiter. Und zwar habe ich eine gewisse Summe an Gegnern (sagen wir mal 10, 5 oben ,..5 darunter) die ich mittig spawnen lassen. Diesen bewegen sich zusammen(als Pack sozusagen) mit der selben Gewindigkeit von links nach rechts.
    Jetzt schiesst der Spieler den z.b. 3'ten Gegner der untersten Reihe weg.
    Nun würde ich es gerne so hinbekommen das automatisch einer der sich links oder rechts befindlichen Gegner. In diese nun entstande Lücke springt. Und alle anderen mit " aufrutschen".
    Wie kann ich sowas hinbekommen?
  • Du kannst ja einfach die gesamt Breite durch die Anzahl teilen und damit dann den Abstand zum Nachbargegner immer abchecken und evtl. Auf den berechneten Abstand aufrücken.
    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
  • versuch es doch mit folgenden code:

    GML-Quellcode

    1. if not place_meeting(x+32,y,obj_gegner) and place_meeting(x+64,y,obj_gegner)
    2. {
    3. x+=32
    4. }


    die 32 musst mit der länge deines Gegner Objektes ersetzen und die 64 mit der doppelten länge deines Gegner Objekte
  • Benutz doch ein Array ds_grid für die Gegner
    Die Positionen kannst du dann mit i*offset berechnen und kannst die Einträge aufrücken wenn einer stirbt
    132 little bugs in the code. 132 little bugs. Fix a few, set the compiler to stew, 172 little bugs in the code... :vogel:
  • yo. Da muss ich leider zugeben mit ds_grid habe ich noch nie arbeitet. Mit anderen worten wüsste ich jetzt nicht auf die stelle wie ich das proggen sollte.
    Also wenn einer mir das näher erklären könnte, wäre das echt schön. Ich versuch aber auch selber dahinter zukommen. Dauert halt nur länger,..
  • Mit den grids ist das ganz einfach, du hast ein Grid das so hoch und breit ist wie die Anzahl der Gegner und trägst dann ins grid ein ob da kein Gegner 0 oder die Object ID des Gegners.

    Im Create Event eines Control object (zB obj_enemy_grid) erstellst du das grid und befüllst es mit Gegnern.

    GML-Quellcode

    1. globalvar enemygrid;
    2. gridwidth = 8;
    3. gridheight = 4;
    4. offsetx = 32;//die breite der zelle in der ein Gegner ist, bzw die Gegner breite
    5. offsety = 32;//und die höhe
    6. enemygrid = ds_grid_create(gridwidth,gridheight);//Platz für 8 Gegner der Länge nach und 4 Gegner der Höhe nach
    7. for (yy = 0 ; yy < gridheight ; yy += 1)
    8. {
    9. for (xx = 0 ; xx < gridwidth ; xx += 1)
    10. {
    11. neu = instance_create(xx*offsetx,yy*offsety,obj_enemy);
    12. enemygrid[# xx,yy] = neu.id//setzt die objectnummer des enemies ins grid ein, dann weßt du immer wo welcher Gegner gerade hockt
    13. neu.origxx = xx;
    14. neu.origyy = yy;//trägt im Gegnerobject zwei variablen ein, damit er auch weiß wo er sich im grid befindet
    15. }
    16. }
    Alles anzeigen

    Wenn ein Gegner getötet wird, trägt er im destroy event von sich, eine 0 ins grid an der origxx, origyy stelle ein.

    GML-Quellcode

    1. enemygrid[# origxx,origyy] = 0;


    Dann fragt das enemygridobject ab ob eine 0 im grid ist; wieder mit der doppel for schleife und wenn ja, dann sendet er an das object mit der id links davon dass es sich bewegen soll.

    GML-Quellcode

    1. //in der doppel for schleife
    2. if enemygrid[# xx,yy] == 0;
    3. {
    4. if enemygrid[# xx-1,yy] != 0 //links von der Lücke existiert ein Gegner
    5. {
    6. with(enemygrid[# xx-1,yy])
    7. {
    8. x += offsetx;
    9. enemygrid[# xx,yy] = enemygrid[# xx-1,yy]; //kopier die id nach rechts;
    10. enemygrid[# xx-1,yy] = 0; //lösche den alten Platz der nun leer sein soll
    11. }
    12. }
    13. }
    Alles anzeigen


    Wenn du diese Schleife von 0 nach 7 abfragst dann wird nur jeden step ein Gegner eins weiter rücken, wenn du sie von 7 nach 0 abfragst dann verschiebt er alle Gegner in einem Step.
    Falls du die Gegner noch langsamer verschieben lassen willst, dann musst du etwas anders daran ran gehn und dem Gegner zB eine variable umschalten lassen zum nach rechts bewegen und wenn er 32x um einen pixel nach rechts gerückt ist, dann wird das grid "aufgeräumt" mit dem obigen Code.

    Ich hoffe das hat dir grids und die nützlichkeit nähergebracht :)

    ancient-pixel.com
    youtube.com/user/SebastianMerkl <<< ich freu mich über einen Besuch ;)
  • wau,.. das ist sch... geil!!
    Ehrlich! Und du hast dir auch noch die Zeit genommen das " noob- like " zu erklären! Danke dafür.
    Ich hab mich gestern noch bis mitten in die Nacht noch damit beschäftigt.

    Ich würde gerne Grids für mein Spiel verwenden. Da sie mir echt super helfen können für meine " spawn- formationen" an gegnern.
    Leider ist mir noch absolut unklar ....
    wie ich
    1.- Das grid von " spawn_punkt " verschieben kann. Also momentan entsteht das grid links oben in der ecke.
    und 2. - wie ich es denn verscheiben kann ,... mit samt in den zellen gefüllten gegern. Die sollen ja nicht starr einfach auf dem Bildschirm bleiben.

    Lg neogeo
  • Kein Problem :)

    Es ist egal wo sich das grid oder gridobjekt befindet, das ist das gute dran, dass grid zeigt den Gegnern nur wie die Formation gerade aussieht. Damit die Gegner dann an ihrem eigtl Startpunkt spawnen, musst du nur noch den Links -obersten Punkt der Formation angeben beim instance_createn.

    GML-Quellcode

    1. instance_create((xx*offsetx)+96,(yy*offsety)+32,obj_enemy);


    Verschieben musst du es dann auch nicht, sondern die Gegner wandern von selbst. Das kannst du auf mehrere Arten lösen, zB in dem du eine Variable hast die aussagt ob die Gegner nach links oder rechts gehen und wie weit sie gehen. Das kannst du im Create Event vom Gegner einstellen.

    GML-Quellcode

    1. go_right = true;
    2. distance = 64;

    und das im step

    GML-Quellcode

    1. if go_right == true
    2. {
    3. if distance < 64 //solang distance nicht erreicht geh nach rechts
    4. {
    5. x += 1;
    6. distance += 1;
    7. }
    8. else
    9. {
    10. go_right == false;
    11. y += 4; //falls der Gegner eine Reihe runter rutschen soll.
    12. distance = 0; //stell distance wieder auf 0 damit er wieder von vorne anfängt zu zählen
    13. }
    14. }
    15. if go_right == 0
    16. {
    17. //selbe wie oben nur dass rechts wieder true wird wenn die distance erreicht ist.
    18. }
    Alles anzeigen


    Wie gesagt, da gibt aber noch andere Möglichkeiten, es kommt einfach drauf an, wie du die Gegner bis jetzt bewegt hast und wie es aussehen soll, wenn sie sich bewegen. Das grid system von oben beeinflusst aber die Bewegung nicht, die Gegner könnten auch in einem Kreis stehn und das grid würde einfach nur dafür sorgen dass der richtige Gegner die Lücke füllt wenn einer stirbt.

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