Frage zu instance_nearest()

  • GM 7

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

  • Frage zu instance_nearest()

    Hi Leute,

    Ich bräuchte wieder mal Hilfe für ein kleines Problem:

    Ich benötige eine Funktion oder einen Script, der es ermöglicht,
    die am nächsten gelegenen Objekte zu finden.

    instance_nearest() gibt ja das am wenigsten entfernte Objekt an.
    Ich muss aber 4 Objekte wissen, die am nächsten sind.

    Beispiel:
    Ich habe vier Soldaten, und jeder soll sich sein eigenes Ziel suchen, das ihm zwar am nähesten ist,
    aber auf das noch nicht geschossen wird, damit sich die Feuerkraft nicht auf ein Objekt konzentriert, sondern
    dass das Feuer aufgeteilt wird.

    Ich hoffe, Ihr versteht meine Frage^^

    lg, Lev
    Dieser Beitrag wurde bereits 8.675.628 mal editiert, zuletzt von »levarris07« (Heute, 11:33)
  • Hm... mit collision_circle() oder?

    Ich hätte da eine Idee, weiß aber nicht ob es funktioniert:

    GML-Quellcode

    1. i=instance_nearest(x,y,obj)
    2. if point_distance(i)<200 && i.checked=false
    3. {
    4. i.checked=true
    5. }


    Oder sooo :pinch:
    Dieser Beitrag wurde bereits 8.675.628 mal editiert, zuletzt von »levarris07« (Heute, 11:33)
  • Du könntest, sobald du die Instanz, die am nähesten ist, gefunden hast, diese deaktivieren und weitersuchen. Nach den 4 Suchroutinen aktivierst du wieder alle.

    GML-Quellcode

    1. var i;
    2. for (i=0; i<4; i+=1)
    3. {
    4. inst[i]=instance_nearest(x,y,bla);
    5. instance_deactivate_object(inst[i]);
    6. }
    7. instance_activate_object(bla);

    Somit hast du die vier nähesten Instanzen in einem Array.

    © 2008 by Teamgrill Productions
  • Ok, Danke. Ich werde es mal versuchen^^

    Könnte mir noch jemand erklären was "for" ist?
    Welche argumente muss man in die Klammer schreiben?
    Muss man das wie einen if-Satz behandeln?

    lg, Lev
    Dieser Beitrag wurde bereits 8.675.628 mal editiert, zuletzt von »levarris07« (Heute, 11:33)
  • Kreise Ziehen?
    Als GML-fortgeschrittene hier sollte man besseres wissen. Collision_circle ist langsamer je mehr Objecte es gibt.
    Hier ist ein sehr optimiertes Skript um die nthe-Instanz zu finden:

    GML-Quellcode

    1. /*
    2. ** Usage:
    3. ** inst = instance_nth_nearest(x,y,obj,n);
    4. **
    5. ** Arguments:
    6. ** x,y a point
    7. ** obj an object_index, or keyword "all"
    8. ** n proximity
    9. **
    10. ** Return:
    11. ** inst (n)th nearest instance id of type
    12. ** (object) to the given point (x,y),
    13. ** or keyword "noone" if none found.
    14. **
    15. ** GMLscripts.com
    16. */
    17. {
    18. var pointx,pointy,object,n,list,nearest;
    19. pointx = argument0;
    20. pointy = argument1;
    21. object = argument2;
    22. n = argument3;
    23. n = min(max(1,n),instance_number(object));
    24. list = ds_priority_create();
    25. nearest = noone;
    26. with (object) ds_priority_add(list,id,distance_to_point(pointx,pointy));
    27. repeat (n) nearest = ds_priority_delete_min(list);
    28. ds_priority_destroy(list);
    29. return nearest;
    30. }
    Alles anzeigen


    Man kann es so umändern das es überprüft ob irgendwas übereinstimmt mit den Objecten.
    Also zumbeispiel ob beschossen = 0 ist. Du muss dann einfach einsetzen zwischen with und ds_priority_add:

    with (object) if beschossen = 0 ds_priority_add(list,id,distance_to_point(pointx,pointy));

    Willst du auf diese Drachen und -eier klicken?
    Sie werden sich freuen ;)
  • DragonGamer schrieb:

    Kreise Ziehen?
    Als GML-fortgeschrittene hier sollte man besseres wissen. Collision_circle ist langsamer je mehr Objecte es gibt.
    Hier ist ein sehr optimiertes Skript um die nthe-Instanz zu finden:

    GML-Quellcode

    1. /*
    2. ** Usage:
    3. ** inst = instance_nth_nearest(x,y,obj,n);
    4. **
    5. ** Arguments:
    6. ** x,y a point
    7. ** obj an object_index, or keyword "all"
    8. ** n proximity
    9. **
    10. ** Return:
    11. ** inst (n)th nearest instance id of type
    12. ** (object) to the given point (x,y),
    13. ** or keyword "noone" if none found.
    14. **
    15. ** GMLscripts.com
    16. */
    17. {
    18. var pointx,pointy,object,n,list,nearest;
    19. pointx = argument0;
    20. pointy = argument1;
    21. object = argument2;
    22. n = argument3;
    23. n = min(max(1,n),instance_number(object));
    24. list = ds_priority_create();
    25. nearest = noone;
    26. with (object) ds_priority_add(list,id,distance_to_point(pointx,pointy));
    27. repeat (n) nearest = ds_priority_delete_min(list);
    28. ds_priority_destroy(list);
    29. return nearest;
    30. }
    Alles anzeigen


    Man kann es so umändern das es überprüft ob irgendwas übereinstimmt mit den Objecten.
    Also zumbeispiel ob beschossen = 0 ist. Du muss dann einfach einsetzen zwischen with und ds_priority_add:

    with (object) if beschossen = 0 ds_priority_add(list,id,distance_to_point(pointx,pointy));


    Das Script ist zwar gut, aber ein klarer Overkill, wenn er die 4 nähesten Objekte haben will und nicht irgendwelche. MasterXY's Lösung ist noch die performanteste.
    "Als GML-fortgeschrittene hier sollte man besseres wissen." :pinch:

    © 2008 by Teamgrill Productions
  • Soul Reaver schrieb:

    DragonGamer schrieb:

    Kreise Ziehen?
    Als GML-fortgeschrittene hier sollte man besseres wissen. Collision_circle ist langsamer je mehr Objecte es gibt.
    Hier ist ein sehr optimiertes Skript um die nthe-Instanz zu finden:

    GML-Quellcode

    1. /*
    2. ** Usage:
    3. ** inst = instance_nth_nearest(x,y,obj,n);
    4. **
    5. ** Arguments:
    6. ** x,y a point
    7. ** obj an object_index, or keyword "all"
    8. ** n proximity
    9. **
    10. ** Return:
    11. ** inst (n)th nearest instance id of type
    12. ** (object) to the given point (x,y),
    13. ** or keyword "noone" if none found.
    14. **
    15. ** GMLscripts.com
    16. */
    17. {
    18. var pointx,pointy,object,n,list,nearest;
    19. pointx = argument0;
    20. pointy = argument1;
    21. object = argument2;
    22. n = argument3;
    23. n = min(max(1,n),instance_number(object));
    24. list = ds_priority_create();
    25. nearest = noone;
    26. with (object) ds_priority_add(list,id,distance_to_point(pointx,pointy));
    27. repeat (n) nearest = ds_priority_delete_min(list);
    28. ds_priority_destroy(list);
    29. return nearest;
    30. }
    Alles anzeigen


    Man kann es so umändern das es überprüft ob irgendwas übereinstimmt mit den Objecten.
    Also zumbeispiel ob beschossen = 0 ist. Du muss dann einfach einsetzen zwischen with und ds_priority_add:

    with (object) if beschossen = 0 ds_priority_add(list,id,distance_to_point(pointx,pointy));


    Das Script ist zwar gut, aber ein klarer Overkill, wenn er die 4 nähesten Objekte haben will und nicht irgendwelche. MasterXY's Lösung ist noch die performanteste.
    "Als GML-fortgeschrittene hier sollte man besseres wissen." :pinch:


    Oh, ok hast recht xD

    Man könnte aber die Vier werte aber aus dem obigen Skript direct in den Array aufnehmen. Also in etwa so:
    Glaube aber das ist nicht wirklich performanter, ka.

    GML-Quellcode

    1. {
    2. var pointx,pointy,object,n,list,nearest;
    3. pointx = argument0;
    4. pointy = argument1;
    5. object = argument2;
    6. n = argument3;
    7. n = min(max(1,n),instance_number(object));
    8. list = ds_priority_create();
    9. with (object) ds_priority_add(list,id,distance_to_point(pointx,pointy));
    10. for(a = 0; a < n; a += 1;)
    11. nearest[a] = ds_priority_delete_min(list);
    12. ds_priority_destroy(list);
    13. }
    Alles anzeigen

    Damit kannst du per Argument bestimmen wieviele Objecte in die Liste aufgenommen werden sollen.

    Willst du auf diese Drachen und -eier klicken?
    Sie werden sich freuen ;)