Instance_nearest_erweitert

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

  • Instance_nearest_erweitert

    Mahlzeit x)

    Ich war jetzt lange Zeit (ca. ein Jahr) im GM nicht mehr aktiv und hab letzte woche beschlossen mich wieder mit meinem Projekt zu beschäftigen.
    Dabei bin ich auf eine Frage gestoßen, an der ich schon vor einem jahr rumgekaut hab, aber bei der ich nicht wirklich auf eine lösung gekommen bin.

    Das Problem ist folgendes:


    - ich bin der schwarze punkt (auf der skizze)
    - die roten punkte sind verschiedene objekte, die sozusagen in mein team gehören.
    - die blauen punkte sind ebenfalls objekte, auch verschiedene (aussehen, variablen etc.), die ins gegnerische team gehören
    - der weiße hintergrund ist mit unwichtigen objekten gespickt, wie bäume oder was weiß ich
    - die roten linien sind mein sichtbereich

    ich möchte nun eine variable haben, die ausgibt welches objekt mir am nächsten ist. allerdings müssen folgende bedingungen gelten:
    - es darf kein unwichtiges objekt vom weißen hintergrund sein
    - es darf kein blaues sein
    - es darf nur ein rotes in meinem sichtbereich sein

    ich hab schon ewig überlegt wie ich das problem mit möglichst wenig nutzung von systemressourcen löse, bin aber auf keinen nenner gekommen. ich hoffe ihr könnt mir helfen.

    schon mal danke für die bemühungen.
    grüße fantscher
    hallo erstmal....
  • Mmh... Wir hatten doch irgendwo ein Exemple... *such*
    Ha! gefunden! :D
    Hier.

    EDIT:
    Huch, falsch verstanden... Aber das kann man auch machen:

    GML-Quellcode

    1. for (a=0;a<instance_number(obj_rot);a+=1)
    2. {
    3. i=instance_nearest_ext(x,y,obj_rot,a)
    4. if point_direction(x,y,i.x,i.y)<direction-45 and point_direction(x,y,i.x,i.y)>direction+45
    5. {
    6. break
    7. }
    8. }

    Das müsste glaub ich klappen...

    EDIT²: Syntax-Error beseitigt.
    kostenlose Android-Spiele:
    hexavirScribble Triple

    Mr. Peperonico auf Facebook

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von RoFra ()

  • nein, weil wie gesagt die roten objekte alles andere sind.
    soweit war ich schon, aber leider sind es praktisch die objekte obj_playerrot1, obj_playerrot 2, usw... bis 7
    genauso mit den blauen.
    aber danke schonmal :)
    hallo erstmal....
  • Du kannst ein Dummy-Objekt machen (obj_rot_parent), das Du in den roten Objekten als Parent verwendest. dann kannst Du den o.g. Code benutzen.

    Für die gegnerischen Objekte kannst Du ebenso ein Parent-Objekt machen.

    Diese Parents müssen sonst nichts tun, sie können passiv sein.

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

  • hmm oke danke ich probiers gleich mal aus...
    hab noch nie mit parents gearbeitet. kenn ich eigentlich nur aus ogre ^^

    edit://

    GML-Quellcode

    1. for (a=0;a<instance_number(obj_red_parent);a+=1)
    2. {
    3. i=instance_nearest_ext(x,y,obj_red_parent,1)
    4. if point_direction(x,y,i.x,i.y)<direction-40 and point_direction(x,y,i.x,i.y)>direction+40
    5. {
    6. break
    7. }
    8. }


    ich habe den code auf das geändert, da er wenn man a reinschreibt das objekt angibt das am weitesten weg ist (ist logisch, da er ja dann das objekt sucht, das am agrument3-weitesten entfernt ist), allerdings berücksichtigt er dabei noch nicht, ob das objekt im sichtfeld liegt...

    edit2://

    GML-Quellcode

    1. var queue, result;
    2. queue = ds_priority_create();
    3. with (argument2){if point_direction(argument0.x,argument0.y,x,y)<argument0.direction-argument1/2 and point_direction(argument0.x,argument0.y,x,y)>argument0.direction+argument1/2{
    4. ds_priority_add(queue, id, point_distance(x, y, argument0.x, argument0.y))}};
    5. repeat (argument3-1){ds_priority_delete_min(queue)};
    6. if (ds_priority_empty(queue)){result = noone}else{result = ds_priority_find_min(queue)};
    7. ds_priority_destroy(queue);
    8. return result;


    ich hab das script mal umgeschrieben, da man die direction abfrage noch vor der instance_nearest machen sollte... aber iwie bekomm ich da nicht wirklich ein logisches ergebnis raus (anstatt einer objekt id nur "-4")

    edit3://
    argument0 = ich ^^
    argument1 = sichtfeldgröße
    argument2 = obj_red_parent
    argument3 = x-Nächste
    hallo erstmal....

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von fantscher ()

  • hmm jetzt bin ich erst drauf gekommen, was du meinst rofra...
    die schleife und das alles. das problem war, dass das objekt beweglich ist. habs jetzt richtig gestellt

    GML-Quellcode

    1. for (a=0;a<instance_number(obj_red);a+=1){
    2. i=instance_nearest_ext(x,y,obj_red,a);
    3. if abs(direction-(point_direction(x,y,i.x,i.y) mod (320)))<50{
    4. break;}}

    sry, dass ich solang gebraucht hab, aber ich hab zu meiner entschuldigung schon lang nichts mehr gemacht xD

    danke nochmal an euch beide
    hallo erstmal....

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