Objekt in der Nähe

Wichtiger Hinweis: Bitte ändert nicht manuell die Schriftfarbe auf schwarz sondern belasst es bei der Standardeinstellung. Somit tragt ihr dazu bei dass euer Text auch bei Verwendung unseren dunklen Forenstils noch lesbar ist!

Tipp: Ihr wollt längere Codeausschnitte oder Logfiles bereitstellen? Benutzt unseren eigenen PasteBin-Dienst Link
  • Ich habe mal eine kleine Frage:
    Wie kann ich abfragen welches Objekt in meiner Nähe ist.


    Ich habe das jetzt so gemacht:

    #define MAX_TREE 16


    new Float:baum[MAX_TREE][3] =
    {
    {1504.9000244,-1710.6999512,13.6999998},
    {1421.2171630,-980.4489140,1639.3854980},
    {1424.6304930,-980.5266720,1639.3714600},
    {1417.7136230,-980.4751590,1639.3635250},
    {-1835.6014400,63.2456100,1054.8320300},
    {1000.0999800,-917.0999800,42.0000000},
    {1504.9000200,-1710.6999500,13.7000000},
    {1421.2171600,-980.4489100,1639.3855000},
    {1424.6304900,-980.5266700,1639.3714600},
    {1417.7136200,-980.4751600,1639.3635300},
    {-1835.6014400,63.2456100,1054.8320300},
    {1476.9000200,-1803.1999500,15.1000000},
    {1421.2171600,-980.4489100,1639.3855000},
    {1424.6304900,-980.5266700,1639.3714600},
    {1417.7136200,-980.4751600,1639.3635300},
    {-1835.6014400,63.2456100,1054.8320300}
    };


    stock IsPlayerAtTREE(playerid)
    {
    for(new i=0; i<MAX_TREE; i++)
    {
    if(IsPlayerInRangeOfPoint(playerid,5, baum[i][0], baum[i][1], baum[i][2])) return 1;
    }
    return 0;
    }



    Das fragt jetzt ab, ob die erstellten Objekte in meiner nähe sind.
    Jetzt will ich aber wissen, welches genau davon, damit ich diese dann löschen kann.


    Danke im vorraus
    Hammerfaul

  • stock GetTREEinRange(playerid)
    {
    for(new i=0; i<MAX_TREE; i++)
    {
    if(IsPlayerInRangeOfPoint(playerid,5, baum[i][0], baum[i][1], baum[i][2])) return i;
    }
    return -1;
    }


    wird -1 ausgeben wenn kein Baum in der nähe ist und den array index des baumes der in der nähe ist.


    Vorsicht der Code gibt den ersten baum in der nähe aus und nicht den nähsten Baum


  • Aber doch nur in dem Radius der angegeben ist, oder?
    Ich frage deshalb, weil ich gerade an einem ähnlichen Problem hocke.


    genau der erste baum in Radius, mal sehen ob ich schnell ne grafik mit paint zaubern kann.


    edit:

    quelle: selbstgemacht mit Paint (sollte Künstler werden


    wie man auf dem Bild erkennt ist sowohl Baum 5 als auch Baum 3 in der Range des Players, es wird Baum 3 augegeben (3 kleiner 5) obwohl der Spieler näher an Baum 5 steht

  • GetNearestTree(playerid)
    {
    new Float:Distance = 100000.0;
    new nearesttree;
    for(new i = 0; i<MAX_TREE; i++)
    {
    new Float:dist = GetPlayerDistanceFromPoint(playerid, baum[i][0], baum[i][1], baum[i][2]);
    if(dist < Distance)nearesttree = i, Distance = GetPlayerDistanceFromPoint(playerid, baum[i][0], baum[i][1], baum[i][2]);
    }
    return nearesttree;
    }
    So rechnest du den am nächsten stehenden Baum aus :)

  • Muss man halt einen passenden Radius wählen und dann ist das kein Ding.


    naja ich finde es immer als störend wenn mehrere sachen doch mal was enger an einander sind und aufeinmal hat man das falsche gelöscht, ist vorallem bei Fahrzeugen blöd.


    edit:
    @SynonymouZ:
    dein code ist schon ganz gut doch fehlt mir etwas: sollte es gar keinen Baum geben wird 0 augegeben, was man als Baum ansehen könnte, zudem kann man keinen Radius auswählen weshalb ich es wie folgt ändern würde:


    GetNearestTree(playerid,Float:radi)
    {
    new Float:Distance = 100000.0;
    new nearesttree=-1;
    for(new i = 0; i<MAX_TREE; i++)
    {
    if(IsPlayerInRangeOfPoint(playerid,radi, baum[i][0], baum[i][1], baum[i][2]))
    {
    new Float:dist = GetPlayerDistanceFromPoint(playerid, baum[i][0], baum[i][1], baum[i][2]);
    if(dist < Distance)nearesttree = i, Distance = GetPlayerDistanceFromPoint(playerid, baum[i][0], baum[i][1], baum[i][2]);
    }
    }
    return nearesttree;
    }

  • naja ich finde es immer als störend wenn mehrere sachen doch mal was enger an einander sind und aufeinmal hat man das falsche gelöscht, ist vorallem bei Fahrzeugen blöd.

  • [DT]Sniper:
    Dann würde ich es aber so machen:
    GetNearestTree(playerid, Float:radi = 100000.0)
    {
    new nearesttree = -1;
    for(new i = 0; i<MAX_TREE; i++)
    {
    new Float:dist = GetPlayerDistanceFromPoint(playerid, baum[i][0], baum[i][1], baum[i][2]);
    if(dist < radi)nearesttree = i, radi = GetPlayerDistanceFromPoint(playerid, baum[i][0], baum[i][1], baum[i][2]);
    }
    return nearesttree;
    }


    Habe jetzt noch die farge wie ich das nearesttree auslesen soll.
    kann ich da nicht einfach eine globale Variabel erstellen?


    Was genau meinst du?


    Das GetNearestTree gibt die ID vom Baum aus, also sagen wir der Baum baum[5] ist am nächsten, dann gibt die Funktion 5 aus.

  • Habe jetzt noch die farge wie ich das nearesttree auslesen soll.
    Kann ich da nicht einfach eine globale Variabel erstellen?


    Die wird doch durch die Funktion ausgelesen..


    Beispiel:

    new tree = GetNearestTree(playerid); // Da gibt er dir die nähste Baum-ID des Baumes aus..


  • Die wird doch durch die Funktion ausgelesen..


    Beispiel:

    new tree = GetNearestTree(playerid); // Da gibt er dir die nähste Baum-ID des Baumes aus..



    Bitte hier noch eine Abfrage hinzufügen ob -1 zurück geben wird.


    Wenn man auf einen negativen Index zurückgreift bei einem Array schmiert der Server ab.


    //edit


    Hammerfaul
    um den Baum zu löschen musst die die Objekt-ID , welche vom CreateDynamicObject oder CreateObject zurück geben wird in einer variable zwischenspeichern.