Beschreibung:
Mit Hilfe der Kamera Vektor - Funktionen ist es nun möglich zu überprüfen, welchen Punkt der Spieler nun ungefähr anguckt.
Dieses kann nur abgefragt werden, wenn der Spieler zu Fuß oder in einem Fahrzeug mit möglicher Zielvorrichtung ist.
Dies ist seit der 0.3a R5 Version von SAMP möglich.
Auf diese Weise ist es nun möglich, schöne RolePlay Funktionen wie zB Feuerwehr (anvisieren brennender Objekte) zu erstellen.
Funktionen:
Folgende Funktionen werden wir für unser Script brauchen, mit dem wir das Anvisieren eines Punktes ermitteln wollen:
GetPlayerCameraPos(playerid, &Float:x, &Float:y, &Float:z);
Diese Funktion ermittelt die Positon der Kamera des Spielers und speichert diese in vorher erstellte Floats.
Zum Beispiel:
new Float:x, Float:y, Float:z;
GetPlayerCameraPos(playerid, x, y, z);
printf("Die Kamera des Spielers befindet sich auf den Koordinaten X: %f, Y: %f, Z: %f.", x, y, z);
GetPlayerCameraFrontVector(playerid, &Float:x, &Float:y, &Float:z);
Diese Funktion ist einfach die Längeneinheiten als Vektor, in welche Richtung der Spieler aus der Kamera-Position anstrebt.
Vorarbeit:
Als erstes erstellen wir eine Funktion, welche die Distanz der Kamera zu einem Punkt berechnet ...
stock Float:ErmittleDistanzZumPunkt(Float:CamX, Float:CamY, Float:CamZ, Float:PunktX, Float:PunktY, Float:PunktZ, Float:FrontX, Float:FrontY, Float:FrontZ) {
new Float:Distanz;
Distanz= floatsqroot((CamX - PunktX) * (CamX - PunktX) + (CamY - PunktY) * (CamY - PunktY) + (CamZ - PunktZ) * (CamZ - PunktZ));
new Float:tmpX, Float:tmpY, Float:tmpZ;
tmpX = FrontX * Distanz+ CamX;
tmpY = FrontY * Distanz+ CamY;
tmpZ = FrontZ * Distanz+ CamZ;
return floatsqroot((tmpX - PunktX) * (tmpX - PunktX) + (tmpY - PunktY) * (tmpY - PunktY) + (tmpZ - PunktZ) * (tmpZ - PunktZ));
}
... und eine die überprüft, ob ein Spieler einen bestimmten Punkt anzielt:
stock ZieltSpielerAufPunkt(playerid, Float:x, Float:y, Float:z, Float:radius)
{
new Float:cx,Float:cy,Float:cz,Float:fx,Float:fy,Float:fz;
GetPlayerCameraPos(playerid, cx, cy, cz);
GetPlayerCameraFrontVector(playerid, fx, fy, fz);
return (radius >= ErmittleDistanzZumPunkt(cx, cy, cz, x, y, z, fx, fy, fz));
}
Gebrauch:
Nun könnt ihr mit einer kleinen Abfrage ermitteln, ob der Spieler einen Punkt anvisiert.
Dazu musst ihr bloss überprüfen, ob der die Funktion ZieltSpielerAufPunkt eintrifft.
Um das zu testen habe ich ein Auto erstellt und dessen Koordinaten in einem enum gespeichert.
Das gleiche könnt ihr aber auch mit Objekten machen. Dies könnt ihr zB dann abfragen, wenn der Spieler die schießen-Taste drückt.
So siehts aus:
if(ZieltSpielerAufPunkt(playerid, Autos[1][Position][X], Autos[1][Position][Y], Autos[1][Position][Z], 2.0)) {
SendClientMessage(playerid, 0x00ff00ff, "Erfolg!");
}
Den Radius könnt ihr bei 1.0 oder 2.0 lassen, je nach dem wie genau der Schuss sein soll.
Schlusswort:
Ich habe in diesem Tutorial extra keine fertige Funktion erstellt, damit ihr selber noch dran denken könnt. Daher ist es nicht für Anfänger, sondern für Leute mit etwas Ahnung von PAWN gedacht. Ich hoffe, ich konnte euch einen kleinen Schritt weiter bringen
Credits:
RedShirt - Distanzermittlungs- Funktion