Eine Steinfalle

  • Win

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

  • Eine Steinfalle

    Nabend zusammen! :)

    Folgendes: Ich habe in mein Spiel eine "Steinfalle" eingebaut. Die besteht aus 2 Objekten. Einem Schalter am Boden und einem Stein.
    Wenn der Spieler den Schalter berührt tadaa der Stein fällt runter und der Schalter verschwindet. Ganz simpel.

    Habe das so gelöst:
    Spieler läuft auf schalter -> Schalter sucht den Stein der am nähsten ist (instance_nearest) -> Bei stein wird Event ausgeführt das er runterfällt -> Schalter verschwindet.

    Nun habe ich ein Problem. Das ganze funktioniert ganz prächtig, wenn nur ein Schalter und ein Stein in der nähe sind.

    Wenn ich nun 2 Schalter / Steine nebeneinander mache kann es natürlich sein das der 2te stein näher am ersten Schalter ist, und der erste Schalter den 2ten Stein auslöst
    und nicht den ersten Stein wie er eig sollte.
    Und falls man in der zeit wo der erste stein runterfällt auf den 2ten Schalter geht löst der natürlich im "näheren" (wegen fallen) ersten stein das Event aus und nicht
    im 2ten Stein. Der bleibt locker flockig einfach oben hängen...

    Wie könnte ich es bewerkstelligen das der Schalter einen dazugehörigen stein hat? Also das die 2 Instanzen zusammenarbeiten?
    Das Schalter 1 Stein 1 bewegt und nicht Stein 2 obwohl der näher ist?

    Da ich natürlich mehrere von diesen Fallen in einem Level haben dachte ich mir ich könnte iwie über den Creation Code im Level Editor etwas bewerkstelligen
    das ich beiden instanzen zb eine Variable mitgebe oder etc. Aber leider weiss ich nicht so ganz wie ich das dann coden könnte...

    Danke im Vorraus für eure Ideen, Anregungen und Tipps :D
  • Also das die erste Sache kapier ich nicht soo ganz, denn der Schalter weis ja nicht welchem Stein er gehört. Wenn er herunterfällt gibt es diese Lösung:

    GML-Quellcode

    1. distance = 0
    2. for (i = 0; i < instance_count; i += 1;)
    3. {
    4. if i = obj_stein
    5. and distance_to_object(i) > distance
    6. and i.vspeed != 0
    7. {
    8. distance = distance_to_object(i)
    9. obj = i
    10. }
    11. }
    Alles anzeigen


    Dabei muss das Fallen mit vspeed geschehen aber das kann man ja noch ändern falls es mit gravity oder sonst was ist
    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
  • Nabend Husi.

    Na ich habe das relativ einfach gemacht. Im schalter Collisions Event mit Player:

    GML-Quellcode

    1. with (instance_nearest(x, y, npc_rock1))
    2. {
    3. event_user(0)
    4. }


    Und dann im User Event 0 vom Stein mit Drag & Drop Start Moving in a Direction, nach unten... und bei berührung mit Boden wird er zerstört.
    Fertig :D

    Wie gesagt er sucht nur den nähsten Stein, der Stein führt die Bewegung nach unten aus und der Schalter wird zerstört.

    Wenn ich nun Zwei Schalter habe und Zwei Steine, dann kann es natürlich sein das wenn der Zweite stein etwas tiefer hängt,
    näher an Schalter Eins ist und Schalter Eins, Stein 2 runterfallen lässt.

    Aber ich will natürlich das der erste Schalter nur den ersten Stein runterfallen lässt. Und ja das ist mein Problem: Der Schalter weiss nicht
    welcher Stein zu ihm gehört. Er sucht sich einfach den aus der am nähsten an ihm dran ist.



    btw: Ist "nähsten" eig ein deutsches Wort? xD
  • klar hätte ich auch so ähnlich gemacht, nur es ging mir darum, wenn der Stein herunterfällt der nächstliegende gesucht wird der nicht herunterfällt.
    aber mir fällt da noch was ein:
    mach ein skript istance_nearest2 oder so:

    GML-Quellcode

    1. var distance, i, obj,j,obj2,distance2;
    2. distance = 0;
    3. distance2 = 0;
    4. j = 0;
    5. obj2 = ""
    6. for (i = 0; i < instance_count; i += 1;)
    7. {
    8. if i = argument0
    9. and distance_to_object(i) > distance
    10. and i.vspeed != 0
    11. {
    12. distance = distance_to_object(i);
    13. obj[j] = i;
    14. if j > argument1
    15. obj2 = obj[j]-4
    16. j += 1;
    17. }
    18. }
    19. if instance_exists(argument0)
    20. return obj;
    21. else
    22. return false;
    Alles anzeigen

    so dann das zum ausführen :D
    Create:

    GML-Quellcode

    1. gut = false;
    2. for (i = 0; true;i += 1;)
    3. {
    4. obj = instance_nearest2(obj_stein,i);
    5. obj.obj = id;
    6. with (obj)
    7. {
    8. if instance_nearest2(obj_schalter) = obj
    9. and vergeben = false
    10. {
    11. obj.gut = true;
    12. vergeben = true;
    13. }
    14. }
    15. if gut
    16. break;
    17. }
    Alles anzeigen

    dann ist obj der Stein
    im obj_stein muss vergeben = false; hinein gemacht werden

    Wenn Fehler sind Sorry, hab es nicht getestet


    PS: zu nähste: ist ein ä drinne also ist es Deutsch :D
    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
  • Nabend :)

    Danke Husi für deinen Einsatz / Code. Aber das ganze schießt etwas am Ziel vorbei. Das muss simpler gehen ;)

    Ich habe es nun so "gelöst" oder besser lösen wollen.

    Ich übergebe im Creation Code der Schalter einfach eine Variable. Die die Instanz des Stein objekts enthält. Das sieht so dann aus:

    GML-Quellcode

    1. myfriend = "inst_E1299A5A"


    Soll heissen: MyFriend ist genau Explizit dieser Stein. Mit der ID:inst_E1299A5A.

    Nun will ich von dem Object mit der ID MyFriend den User Event 0 abspielen lassen einfach...

    Aber das klappt nicht -.-°

    Habe es schon auf viele Arten dann versucht... zb:

    GML-Quellcode

    1. message_show(string(myfriend))
    2. with myfriend
    3. {
    4. event_user(0)
    5. }


    oder

    GML-Quellcode

    1. message_show(string(myfriend))
    2. event_perform_object(myfriend, ev_other, ev_user0)


    Die erste Zeile dient nur um mir die Variable anzeigen zu lassen.
    Einen Fehler bekomme ich keinen. Es Passiert einfach nur nichts... Der Stein hängt mich auslachend an der Decke und bewegt sich nicht :(

    Also ich so: :headtouch:
    und der Stein so: :vogel:

    Wie kann ich den von genau dieser Instanz, des Objekts, den Event User Code starten lassen? Ideen? Anregungen? :D

    Danke im vorraus.
  • Bin mir gerade nicht sicher, aber kann man überhaupt auf die Instanz-ID (Die im Room-Editor) zugreifen (in diesem Fall per String?).
    Hab mich damit jedenfalls noch nicht beschäftigt, seit sie das ID-System geändert haben.

    Jedenfalls... probiere es ohne ID und gib dem Schalter z.B eine Variable "channel" mit dem Wert 0 (oder bei dir: myfriend = 0)

    Dem Stein-Objekt, das mit dem Schalter verbunden werden soll, gibst du dann auch eine channel-variable mit dem selben Wert

    Je nachdem Welcher Schalter mit welchem Stein verbunden sein muss, gibst du ihnen einen anderen "Channel", also z.B.:

    Schalter channel = 0
    Stein channel = 0

    Schalter channel = 1
    Stein channel = 1

    usw.


    Im Schalter dann noch den richtigen Stein suchen:

    GML-Quellcode

    1. with (Stein)
    2. {
    3. if (other.channel == channel)
    4. {
    5. event_user(0); break;
    6. }
    7. }


    Habs zwar nicht getestet, müsste aber theoretisch funktionieren ;)

    MfG Funcestor
  • Hi

    Hatte vor ein paar Jahre ein ähnliches Problem, mir hat damals Skywalker einen guten Tipp gegeben und ein Programmcode.
    So mal schauen ob ich das noch einiger maßen hin bekomme.
    Du weist jeweils einen Schalter und dem entsprechenden Stein ein Objekt zu. Er hat das damals als Connector bezeichnet.

    Im Objekt, Ich habe sie so bezeichnet obj_conn_01
    Create

    GML-Quellcode

    1. /*
    2. Neben dem do (wenn auch irrelevant), war (wie ich ja auch als mögliche Ursache genannt hatte
    3. der Connector zu weit von der Tür entfernt. Es waren 72 Pixel, anstatt die maximal 16, auf die du prüfst.
    4. Du musst hier darauf achten, dass es nicht reicht, dass sich die Instanzen im GM-Editor überlagern.
    5. Es zählen die eingestellten Origins der verwendeten Sprites, die mit (0, 0) bei dem Connector und (0, 32)
    6. bei der Tür, zu weit auseinander lagen. Ich hab den Connector also einfach ein Stück nach unten und links
    7. verschoben und schon geht das ganze. Zudem hab ich noch dafür gesorgt, dass danach die beteiligten Connectoren
    8. automatisch gelöscht werden...
    9. **/
    10. ///////////////////////////////
    11. // den Connector weist dem //
    12. // Schalter_ID die richtige //
    13. // Tor_ID zu //
    14. ///////////////////////////////
    15. globalvar id_Schalter_01, id_Tor_01;
    16. id_Schalter = 0;
    17. id_Tor = 0;
    18. id_Schalter = instance_nearest(x, y, obj_Schalter_Tor);
    19. id_Schalter_01[room] = id_Schalter; // als globale Variabel abspeichern mit dem Index vom Raum
    20. if (point_distance(x, y, id_Schalter.x, id_Schalter.y) < 16) // das Connector Objekt ist in der Nähe vom Schalter
    21. {
    22. with (obj_conn_01)
    23. {
    24. if(id!=other.id)
    25. {
    26. other.id_Tor = instance_nearest(x, y, obj_Tor); // Partner Connector Objekt wurde gefunden (Ein Schalter kann auch mehrere Türen öffnen...)
    27. id_Tor_01[room] = other.id_Tor; // als globale Variabel abspeichern mit dem Index vom Raum
    28. instance_destroy();
    29. }
    30. }
    31. }
    Alles anzeigen


    Du muss den Connector 1 in der nähe vom Schalter und den Stein platzieren. Am besten überlappen.
    Sobald du mit dem schlaten kollidierst, habe ich damals ein Script aufgerufen

    GML-Quellcode

    1. ////////////////////////////////////////////
    2. // Jetzt das Script aufrufen damit die //
    3. // ID vom dem richtigen Tor geholt wird //
    4. // damit diese auf geht //
    5. ////////////////////////////////////////////
    6. id_Tor = scr_id_Schalter_Tor(id_Schalter); // hier ist die ID von dem Tor das aufgehen soll


    Script

    GML-Quellcode

    1. var id_Instance;
    2. id_Instance = 0;
    3. //////////////////////////////////////////////////////
    4. // Schalter dem Tor zuweisen //
    5. //////////////////////////////////////////////////////
    6. if (argument0 == id_Schalter_01[room])
    7. {
    8. id_Instance = id_Tor_01[room]
    9. }
    10. //show_message("die ID vom Tor ist = " + string(id_Instance));
    11. return id_Instance; // Rückgabewert des ID für das Tor
    Alles anzeigen


    Du muss natürlich den Text auf deine Objekte abstimmen. Bei mir waren es damals Schalter und Tor
    Für jeden weiten Schalter mit Stein, brauchst du natürlich einen neuen Connector. Im neuen Raum kannst du dann wieder von vorne anfangen.
    Also bei mir hat das damals gut geklappt.

    Gruss Drachen
  • Heureka!

    Funcestor´s Lösung hat funktioniert ;)
    Etwas abgeändert aber...

    Habe wie schon gesagt 2 Objekte. Einen Schalter einen Stein.

    Habe im Create Event des Schalter Objekts die Variable

    GML-Quellcode

    1. channel = 0


    eingestellt. Dann aber im Creation Code von der Schalter Instanz die Variable verändert in

    GML-Quellcode

    1. channel = 1


    Das selbe natürlich beim Stein Objekt was dazu gehört zum Schalter auch.

    Dann bei Kollision mit dem Schalter:

    GML-Quellcode

    1. with (npc_rock1)
    2. {
    3. if (other.channel == channel)
    4. {
    5. event_perform(ev_other, ev_user0)
    6. }
    7. }


    und schwupps es hat geklappt :D

    @Drachen:

    Danke für deine Mühen. Deinen Code habe ich auch ca 30-40 minuten probiert, hatte es aber nich zum laufen gebracht :(
    Danke trotzdem!

    Edit:

    Grad etwas rumgespielt noch und es ist echt praktisch. So kann ich auch mit einem Schalter X beliebig viele Steine runterfallen lassen etc, wenn sie den selben "channel" haben. Echt praktisch :D

    Aber hätte da nun noch ne Frage:

    Was wird den genau zuerst ausgeführt? Der Create Event vom Objekt oder der Creation Code von der Objekt Instanz?
    Allem anschein nach ja der Create Event vom Objekt denke ich mal

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