Objekte im Umkreis

  • GM 7
  • Objekte im Umkreis

    Hallo zusammen,

    Wie ich prüfen kann, was passieren soll, wenn sich mehrere gleichfarbene Objekte treffen, ist von oben keine Sache, aber ich würde gerne einen grösseren Umkreis, sprich links und rechts, auch noch checken ob z.B. 3 Objekte nebeneinander liegen.

    Wie gehe ich am Besten vor?


    Vielen Dank für schnelle Antworten
    Mfg
    Das Problem zu erkennen ist wichtiger,
    als die Lösung zu erkennen,
    denn die genaue Darstellung des Problems führt zur Lösung.
    ( Albert Einstein )


    I am an according to the gml n00b test!

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von xx-XtremeX-xx ()

  • Im Umkreis:

    GML-Quellcode

    1. global.count=0;
    2. with obj_count {
    3. if (distance_to_object(other)<dein_umkreis) {
    4. global.count+=1;
    5. }
    6. if (global.count>2) {
    7. // wenn mehr als 2 vorhanden ist (2 nicht mit inbegriffen, also müssen mindestens 3 vorhanden sein) dann wird dieser code ausgeführt
    8. }


    Ich hoffe das hilft dir weiter, Viel Glück!
  • Vielen Dank für deine Antwort. :)

    Ja, ich glaube, so in etwa könnte es funktionnieren. Ich probiere es einmal aus.


    EDIT: Ich habe es so versucht, hat aber leider nicht geklappt, auch nicht mit dem Zerstören nach zB. 3 Käfer.
    Die Käfer sollen zerstört werden, wenn 3 oder mehrere Käfer entweder horizontal, oder vertikal beieinander sind.


    Kann mir bitte jemand helfe, ich komme einfach nicht ganz draus, wie ich das machen soll.

    Ich habe die GM - Datei angehängt. --> EDIT: Datei gelöscht


    Mfg
    Das Problem zu erkennen ist wichtiger,
    als die Lösung zu erkennen,
    denn die genaue Darstellung des Problems führt zur Lösung.
    ( Albert Einstein )


    I am an according to the gml n00b test!

    Dieser Beitrag wurde bereits 8 mal editiert, zuletzt von xx-XtremeX-xx ()

  • if(place_meeting(x,y-1,object_index)&&place_meeting(x,y+1,object_index))||(place_meeting(x-1,y,object_index)&&place_meeting(x+1,y,object_index))
    {
    zerstöre deine objekte;
    }

    Ich denke, damit sollte es gehen, wenn du nur Horizontal und Vertikal willst.
    Er prüft so, ob links und rechts von ihm einer ist, bzw oben und unten. Natürlich müsstest du für 4 oder mehr nen anderen Weg gehen.
    Dafür könnte man z.B. anstelle von x+-1 und y+-1 die Werte durch die Breite/Höhe des Sprites ersetzen und in na for-schleife abfragen.

    Hoffe das hilft.
    So far, Schattenphoenix~
    _____________________________________________________________________________
    "Who needs a stairway to heaven...
    If there is an elevator to hell... ?
    "
    - Vergessen
    "Auch ein perfektes Chaos ist etwas vollkommenes."
    - Jean Genet
  • Vielen Dank für deine Hilfe, Schattenphoenix!

    Noch ne kleine Frage: Ist das 'object_index' eine Funktion, oder muss ich das mit dem entsprechenden Käfer ersetzen? Dieser Script wäre dann Pro Käfer in den Step-Event zu packen, oder?



    Danke

    Mfg
    Das Problem zu erkennen ist wichtiger,
    als die Lösung zu erkennen,
    denn die genaue Darstellung des Problems führt zur Lösung.
    ( Albert Einstein )


    I am an according to the gml n00b test!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von xx-XtremeX-xx ()

  • Die Variable object_index gibt die ID des Objekts von einer Instanz zurück. Beispiel:

    GML-Quellcode

    1. instance_nearest(obj_gegner).object_index // instance_nearest(obj) gibt eine Instanz ID wieder, welche wir mit object_index dann in die ID des Objekts 'obj_gegner' umwandeln können
    MfG,
    -fabse64
  • So, der Code läuft eigentlich schon fast, wie er sollte.

    Was muss ich denn bei

    {
    zerstöre deine objekte;
    }

    reinschreiben? Wenn ich nur instance_destroy() ausführe, wird nur immer der dritte Käfer, der den Script dann auslöst gelöscht.
    Und das mit dem Tempo muss ich auch noch ändern --> Wenn der Käfer von Oben kommt Z.B wird er viel zu früh schon gelöscht bzw. wenn Punkt 1 (oben) geregelt wäre; die ganze Kette.

    Wie kann ich auf Objekte, die wie hier in einer Auswahl stehen, zugreiffen und dann löschen?
    Beim 2. Punkt (Geschwindigkeit) könnte man evt. abfragen, ob sich das Objekt nicht mehr bewegt (speed = 0), oder so etwas?


    Mfg
    Das Problem zu erkennen ist wichtiger,
    als die Lösung zu erkennen,
    denn die genaue Darstellung des Problems führt zur Lösung.
    ( Albert Einstein )


    I am an according to the gml n00b test!
  • Da zerstörst du die Objekte halt...

    Kommt drauf an wie du es machen möchtest.
    Du könntest z.B. die ID's der Instanzen oben/unten bzw. links/rechts speichern. Die kriegst du mit beispielsweise
    instance_place(x+-deinwert,y+-deinwert,object_index)

    Mit den ID's kannst du problemlos auch die spezifischen Objekte zerstören.
    Bedenke, dass du nich einfach z.B. instance_destroy(id); machen kannst sondern du with(id){instance_destroy();} brauchst.
    Bei ID musst du natürlich nicht ID sondern die Variable in der die ID des zu zerstörenden Objekts gespeichert ist.

    Ich denke, wenn ich das jetzt mache, werden viele Leute denken, ich würde das alles zu kompliziert machen, aber ich setz mich mal kurz ran.
    Edit folgt.

    Nicht lachen:
    Spoiler anzeigen

    GML-Quellcode

    1. for(i=0;i<4;i+=1)
    2. {
    3. iid[i]=instance_place(x+lengthdir_x(1,i*90),y+lengthdir_y(1,i*90),object_index);
    4. }
    5. if(iid[0]&&iid[2])||(iid[1]&&iid[3])
    6. {
    7. for(i=0;i<4;i+=1)
    8. {
    9. with(iid[i])
    10. {
    11. instance_destroy();
    12. }
    13. iid[i]=0;
    14. }
    15. }
    Alles anzeigen
    So far, Schattenphoenix~
    _____________________________________________________________________________
    "Who needs a stairway to heaven...
    If there is an elevator to hell... ?
    "
    - Vergessen
    "Auch ein perfektes Chaos ist etwas vollkommenes."
    - Jean Genet

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

  • Ich denke, ich weiß wodrauf du hinaus willst.
    Da ich selber schonmal sowas in einem Spiel benutzt habe, kann ich dich auf ein Problem hinweisen (vielleicht war es jedoch auch nur bei mir).
    Mein Code sah ähnlich wie der von Schattenphönix aus. Nachdem ein Block zerstört wurde und die anderen daraufhin zerstört werden sollten, ist das Spiel hängengeblieben.
    Habs abgeändert, dass ich einen Alarm auf 1 setzte, im Alarm-Event das Objekt zerstört wurde und beim Destroy-Event jeweils der Alarm des "angeknüpften" Objektes auf 1 gesetzt wurde (in dem passiert dann wiederum das selbe).
  • Mist! Der Script funzt leider nicht :( ausserdem sind die Käfer sehr langsam geworden --> wenn ich mit Pfeil runter den Room-speed auf 240 erhöhe geht es immer noch langsam.

    Ich habe nicht gewusst, dass es so schwer wird. 8|
    Könntet ihr mir ein Beispiel machen, dass keine Zeitverzögerung hat und wenn es verikal oder horizontal 3 oder mehr Käfer hat dass die dann zerstört werden?

    Es wäre wirklich sehr nett von euch, denn ich krieg das nicht hin. Ich versteh leider den Code, wie man diese Objekte, die links und rechts sind, speichern und zertören kann auch nicht ganz.

    Mfg

    Der neuste Versuch: --> EDIT: Datei gelöscht
    Das Problem zu erkennen ist wichtiger,
    als die Lösung zu erkennen,
    denn die genaue Darstellung des Problems führt zur Lösung.
    ( Albert Einstein )


    I am an according to the gml n00b test!

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von xx-XtremeX-xx ()

  • Das kommt halt drauf an, wie weit sie auseinander sein sollen. Ich ging davon aus, die nur zu werten, wenn sie direkt nebeneinander sind.
    So far, Schattenphoenix~
    _____________________________________________________________________________
    "Who needs a stairway to heaven...
    If there is an elevator to hell... ?
    "
    - Vergessen
    "Auch ein perfektes Chaos ist etwas vollkommenes."
    - Jean Genet
  • Hallo, also, der Abstand musste ich auf 32 setzen nicht 64. ^^. Dies darum, weil ich die Käfer in einem Abstand von 32px platziere.
    Also, das würde jetzt funzen, ich habe jedoch noch ein paar ??? zu klären.

    1) Wenn Z.B. zwei Käfer horizontal nebeneinander liegen, und von oben ein Dritter Käfer hinabfällt, werden alle Käfer schon gelöscht, bevor der Käfer von Oben das Ende seiner Kolonne erreicht hat.
    Das ist natürlich ziemlich ungünstig, denn wenn der Käfer, der herunterfällt, gar nicht auf der Höhe der anderen kommen würde, würde auch gar nichts geschehen.

    Was muss ich da machen?
    Ich habe zwar schon einen Lösungsvorschlag, jedoch weiss ich nicht, ob man das so lösen kann.

    IDEE:
    --------
    Ich muss zusätzlich zu eurem Code überprüfen, ob bei diesem "nicht ganz sicheren" Treffen, die Geschwindigkeit des Käfers, der herunterfällt gleich 0 ist. --> Die Geschwindigkeit wird = 0, wenn der Käfer irgendwo anstösst (entweder ganz unten am Rand, oder auf einem schon vorhandenen Käfer).

    Um den Ganzen Script von euch noch zu optimieren, könnte man vielleicht noch überprüfen, ob sich, die in einer Reihe befindenden Käfer, auch alle den gleichen y-Wert aufweisen.
    --------

    2) Mir ist aufgefallen, dass die Käfer-Kolonnen nicht gleich hoch sind und dass offenbar die Abstände der Einzelnen Käfer nicht identisch zu sein scheinen.
    Dieser Sache bin ich auf den Grund gegangen.

    Mein Ergebniss:
    --------
    Alle Käfer haben die Bildgrösse 64*64px (Grünes Quardrat; ist der Hintergrund; transparente Farbe) sind also schon so einmal identisch.
    Weiter sind alle Käfer Zentriert also 32*32 (Mitte).
    Die Länge ist genau 64px, die Breite 34px. (Diese Breite ist kleiner, weil die Sprites nicht die ganze Breite ausfüllt).

    Trotzdem sind die Abstände unterschiedlich!

    Die Scripts in den Step-Eventen sind auch alle identisch.
    Hier einmal der Script:

    GML-Quellcode

    1. if(position_empty(x, y + 32))
    2. {
    3. speed = 4;
    4. direction = 270;
    5. }
    6. else
    7. {
    8. speed = 0;
    9. }


    Darum komme ich nicht darauf, woran es liegt. :headtouch:

    3)
    --------
    Und dann noch als drittes ^^.
    Das man dieses GM-File auch Spiel nennen kann, muss ich natürlich noch einiges Ändern. Die Score, Leben etc. bringe ich locker selbst auf die Reihe.

    Aber wie so oft, fehlt mir die Überlegunswege zum Ziel.
    Ich möchte die Funktionen von meinem Player erweitern. --> Im Moment kann man nur beim drücken der Space-Tast den Room-Speed erhöhen.

    Also, ich möchte am Anfang des Spiels den ersten Käfer als Player definieren, der erstellt wird. Diesen möchte ich dann auch Farbig noch hervorheben (Spritewechsel mache ich warscheinlich).
    Mit den Tasten W,A,S,D soll man den nächsten Käfer oberhalb, links, unterhalb oder rechts des aktuellen Käfers, den man gerade steuert (Player-Käfer), auswählen.

    Mit dem Player kann man sich dann nach links und rechts mit Hilfe der Pfeiltasten bewegen.
    --------


    Wenn diese 3 Probleme behoben bzw. gelöst sind, bringe ich alles selber Zustande. Es geht mir nur um den Ansatz, den Rest kann ich wirklich selber machen.
    Vielen Dank für das lesen

    Mfg
    Dateien
    • kaeferfalle.rar

      (47,75 kB, 180 mal heruntergeladen, zuletzt: )
    Das Problem zu erkennen ist wichtiger,
    als die Lösung zu erkennen,
    denn die genaue Darstellung des Problems führt zur Lösung.
    ( Albert Einstein )


    I am an according to the gml n00b test!
  • Du musst mal in der Hilfe schauen "move_contact_all" bzw "move_contact_solid" hilft dir dabei.
    So far, Schattenphoenix~
    _____________________________________________________________________________
    "Who needs a stairway to heaven...
    If there is an elevator to hell... ?
    "
    - Vergessen
    "Auch ein perfektes Chaos ist etwas vollkommenes."
    - Jean Genet
  • Danke für die Antwort...
    Das mit den Höhenunterschieden hat sich gekärt, alle Käfer sind nun gleich hoch bzw. halten im gleichen Abstand.

    Was hat denn "move_contact_all(dir,maxdist)" oder "move_contact_solid(dir,maxdist)" mit meinen Fragen zu tun?
    Meinst du, anstelle des Codes mit dem place_meeting? Wenn ja, ich habe es getestet.

    Obwohl der Käfer ja eigenlich anhalten sollte, wenn eine Instanz im Weg ist, fiel er einfach durch die anderen Käfer durch. --> Ich habe folgenden Code benutzt: move_contact_solid(270,500).


    Aber das mit meinem Code geht auch so, also lass ich das lieber weg.


    Was meine anderen Fragen anbelangt, ich müsste noch wissen, was ihr dazu denkt.

    Mfg
    Das Problem zu erkennen ist wichtiger,
    als die Lösung zu erkennen,
    denn die genaue Darstellung des Problems führt zur Lösung.
    ( Albert Einstein )


    I am an according to the gml n00b test!