Nähestes Objekt aufsuchen (aus Liste)

  • GM 8

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

  • Nähestes Objekt aufsuchen (aus Liste)

    Hallo zusammen ;)
    Mit instance_nearest(x,y,obj) kann man die nächste Instance dieses Objektes (obj) aufsuchen. Leider immer nur für dieses eine Objekt, ich würde gerne aus einer Liste von Objekten das nächste bestimmen.

    Ich dachte es gibt eventuell eine Alternative dafür, anstatt für jedes Objekt eine Abfrage zu erstellen und diese anschließend zu vergleichen :s

    Grüße ;)
    @7rust-dev
  • GML-Quellcode

    1. var list, nearestDist, nearestId;
    2. list=LISTE;
    3. nearestDist=-1;
    4. nearestId=-1;
    5. var i;
    6. for (i=0;i<ds_list_size(list);i+=1;) {
    7. if (nearestId==-1) {
    8. nearestId=ds_list_find_value(list,i);
    9. nearestDist=distance_to_object(nearestId);
    10. }
    11. else if (nearDist>distance_to_object(ds_list_find_value(list,i))) {
    12. nearestId=ds_list_find_value(list,i);
    13. nearestDist=distance_to_object(nearestId);
    14. }
    15. }
    Alles anzeigen

    (Ungetestet)
    wupto.net/ Nicht meine Seite!
    We love Koalas.

    GM-D-Spam-o-Meter: 32%

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

  • Nicht getestet, müsste aber klappen.

    GML-Quellcode

    1. var nearest;
    2. nearest = noone;
    3. for (i = 0; i < ds_list_size(list); i += 1) {
    4. var obj;
    5. obj = ds_list_find_value(list, i);
    6. if (nearest == noone)
    7. nearest = obj;
    8. else
    9. if (point_distance(nearest.x, nearest.y, x, y) > point_distance(obj.x, obj.y, x, y))
    10. nearest = obj;
    11. }
    Alles anzeigen
    :saint:
  • Was sollen wir denn unter "Allgemeinen Listen" verstehen?

    Und wenn die objekte nicht existieren:

    GML-Quellcode

    1. var nearest;
    2. nearest = noone;
    3. for (i = 0; i < ds_list_size(list); i += 1) {
    4. var obj;
    5. obj = ds_list_find_value(list, i);
    6. if (nearest == noone && instance_exists(obj)) //Prüft ob das objekt in der liste existiert
    7. nearest = obj;
    8. else
    9. if (instance_exists(obj)) //Prüft ob das objekt in der liste existiert
    10. if (point_distance(nearest.x, nearest.y, x, y) > point_distance(obj.x, obj.y, x, y))
    11. nearest = obj;
    12. }
    Alles anzeigen
    :saint:
  • Was sollen wir denn unter "Allgemeinen Listen" verstehen?
    Weiß auch nicht ;)


    Danke an alle ;) :love:

    PS: Ich könnte gerade völlig ausrasten, nicht ein bisschen sondern richtig! :headtouch:
    Den gesamten Tag über hab ich heuute an nem Projekt gearbeitet, mein Kopf brummt und eigentlich wollte ich mich gleich aufs Sofa hauen und schön den Fernseher anmachen und abschalten! Gut, speicher ist also mal mein Projekt mit dem gm:html5...20 Sekunden waren vergangen da kamen einfach Errors mitm beim speichern...Error hier Error da (34x485745...) Ich denke mir gut, speichere ich nochmal..natürlich das selbe. Dann schließe ich einfach mal das Fenster und speichere dann via. Abfrage. BUHM Error, Fenster zu! Gratualtion, 1/5 des Projektes sind noch da, davon 1/10 Codes, der Rest billige Grafiken! Danke Yoyo, das waren ca. 10 Stunden meines Lebens fürn Ar**...Error! Ich bin weg ;)
    @7rust-dev
  • Auch wenn das Thema bereits als erledigt markiert wurde, habe ich dir ein Skript geschrieben, welches die Berechnungen anhand eines Arrays ("die allgemeine Liste") durchführt:

    GML-Quellcode

    1. //
    2. // instance_array_nearest (obj_me, array_objs, array_size)
    3. //
    4. var id_min, sqrd_min_dis;
    5. id_min = 0;
    6. sqrd_min_dis = 0;
    7. for (i = 0; i < argument2; i+=1) {
    8. tmp_id = variable_local_array_get(argument1, i);
    9. if (tmp_id != noone) {
    10. sqrd_dis = power(tmp_id.x - argument0.x, 2) + power(tmp_id.y - argument0.y, 2);
    11. if (!id_min || sqrd_dis < sqrd_min_dis) {
    12. sqrd_min_dis = sqrd_dis;
    13. id_min = tmp_id;
    14. }
    15. }
    16. }
    17. return id_min;
    Alles anzeigen
  • Woups, hatte das Thema zwar als erledigt makiert habe aber doch noch eine Frage, aktuell fragt das Script nur ob sich ein Objekt im Umkreis befinden und gibt dann true oder false aus (habe das Script von Tice genommen).

    Da ich da irgendwie noch nicht so ganz durchblicke und es schon versucht habe aber gescheitert bin muss ich euch nochmal fragen wie das Script denn ausschaut wenn es das Objekt via. return ausgeben soll welches am nähesten sich am Objekt befindet!

    Grüße ;)
    @7rust-dev
  • Wenn du in der Liste die instance_id speicherst, gibt dir Tice sein Skript die id der Instanz die am nächsten ist aus, gespeichert in nearest. Da der GM aber alles was ungleich Null (oder war es größer Null?) als true interpretiert, kannst du das Skript für beides benutzten (wobei man dann schauen müsste, ob noone, falls kein Objekt dort in der nähe ist, auch als false gewertet wird, oder ob man das einfach schnell durch eine null ersetzen muss).

    Zur Ausgabe:
    Einfach am Ende (nach der letzten Klammer) ein "return nearest;". Also wie bei cafaxo.

    MfG.,
    Mokuyobi
    木曜日 (Mokuyōbi)