In diesem Thread können nützliche Codeschnipsel gepostet werden, die man immer mal wieder benötigt.
Es wäre toll wenn man dazu ein kleines Verwendungsbeispiel (muss kein komplettes Script sein) schreiben würde, dann wird es leichter zu verstehen wie man es verwendet.
Hier bitte keine Scriptfragen stellen!
------------------------------------------------------------------------------------------------------------------------
Animierte Kamera
In diesem Beispielscript wird gezeigt wie man durch Verwendung eines Timers mehr oder weniger weiche Kamerabewegungen von Punkt zu Punkt hinbekommt.
#include <a_samp>
enum COORD {
Float:coord_x,
Float:coord_y,
Float:coord_z
}
enum CAMMOVEMENT {
steps,
currentstep,
Float:amount_x,
Float:amount_y,
Float:amount_z,
Float:look_x,
Float:look_y,
Float:look_z,
CameraMoveTimerID
}
forward Float:GetDistanceBetweenPoints(Float:x1, Float:y1, Float:z1, Float:x2, Float:y2, Float:z2);
forward CameraMoveTimer(playerid);
new Float:gPlayerCameraPos[MAX_PLAYERS][COORD];
new Float:gPlayerCamMovement[MAX_PLAYERS][CAMMOVEMENT];
main() {
}
//-------------------------------------------------------------------
public OnGameModeInit() {
AddPlayerClass(0,2040.2158,1355.9232,10.6719,267.2625,0,0,0,0,0,0);
return 1;
}
//-------------------------------------------------------------------
public OnPlayerSpawn(playerid) {
SetPlayerCameraPosEx(playerid, 2052.1799,1384.5262,10.6719,2040.2158,1355.9232,10.6719);
MoveCamera(playerid, 2053.9204,1348.7130,18.6719, 2040.2158,1355.9232,10.6719, 0.2);
return 1;
}
//-------------------------------------------------------------------
stock MoveCamera(playerid, Float:dest_x, Float:dest_y, Float:dest_z, Float:lookat_x, Float:lookat_y, Float:lookat_z, Float:speed) {
new Float:distance;
distance = GetDistanceBetweenPoints(gPlayerCameraPos[playerid][coord_x],
gPlayerCameraPos[playerid][coord_y],
gPlayerCameraPos[playerid][coord_z],
dest_x,
dest_y,
dest_z);
gPlayerCamMovement[playerid][steps] = floatround(distance / speed);
gPlayerCamMovement[playerid][currentstep] = 0;
gPlayerCamMovement[playerid][amount_x] = (dest_x - gPlayerCameraPos[playerid][coord_x]) / gPlayerCamMovement[playerid][steps];
gPlayerCamMovement[playerid][amount_y] = (dest_y - gPlayerCameraPos[playerid][coord_y]) / gPlayerCamMovement[playerid][steps];
gPlayerCamMovement[playerid][amount_z] = (dest_z - gPlayerCameraPos[playerid][coord_z]) / gPlayerCamMovement[playerid][steps];
gPlayerCamMovement[playerid][look_x] = lookat_x;
gPlayerCamMovement[playerid][look_y] = lookat_y;
gPlayerCamMovement[playerid][look_z] = lookat_z;
gPlayerCamMovement[playerid][CameraMoveTimerID] = SetTimerEx("CameraMoveTimer", 50, 1, "i", playerid);
return 1;
}
//-------------------------------------------------------------------
stock SetPlayerCameraPosEx(playerid, Float:cam_x, Float:cam_y, Float:cam_z, Float:lookat_x, Float:lookat_y, Float:lookat_z) {
SetPlayerCameraPos(playerid, cam_x, cam_y, cam_z);
SetPlayerCameraLookAt(playerid, lookat_x, lookat_y, lookat_z);
gPlayerCameraPos[playerid][coord_x] = cam_x;
gPlayerCameraPos[playerid][coord_y] = cam_y;
gPlayerCameraPos[playerid][coord_z] = cam_z;
return 1;
}
//-------------------------------------------------------------------
stock Float:GetDistanceBetweenPoints(Float:x1, Float:y1, Float:z1, Float:x2, Float:y2, Float:z2) {
return floatsqroot(floatpower(x1 - x2, 2) + floatpower(y1 - y2, 2) + floatpower(z1 - z2, 2));
}
//-------------------------------------------------------------------
public CameraMoveTimer(playerid) {
if (gPlayerCamMovement[playerid][currentstep] <= gPlayerCamMovement[playerid][steps] - 1) {
gPlayerCameraPos[playerid][coord_x] = gPlayerCameraPos[playerid][coord_x] + gPlayerCamMovement[playerid][amount_x];
gPlayerCameraPos[playerid][coord_y] = gPlayerCameraPos[playerid][coord_y] + gPlayerCamMovement[playerid][amount_y];
gPlayerCameraPos[playerid][coord_z] = gPlayerCameraPos[playerid][coord_z] + gPlayerCamMovement[playerid][amount_z];
SetPlayerCameraPos(playerid, gPlayerCameraPos[playerid][coord_x], gPlayerCameraPos[playerid][coord_y], gPlayerCameraPos[playerid][coord_z]);
SetPlayerCameraLookAt(playerid, gPlayerCamMovement[playerid][look_x], gPlayerCamMovement[playerid][look_y], gPlayerCamMovement[playerid][look_z]);
gPlayerCamMovement[playerid][currentstep]++;
} else {
KillTimer(gPlayerCamMovement[playerid][CameraMoveTimerID]);
}
return 1;
}
Um es in einen Gamemmode zu verwenden ist folgendes zu tun:
- Zeilen 3 bis 25 oben in den Gamemode, unter den #include Anweisungen einfügen
- Zeilen 48 bis 108 an das Ende vom Gamemode einfügen
Dann könnt ihr folgende Funktionen benutzen:
SetPlayerCameraPosEx
stock SetPlayerCameraPosEx(playerid, Float:cam_x, Float:cam_y, Float:cam_z, Float:lookat_x, Float:lookat_y, Float:lookat_z)
Eine Kombination von SetPlayerCameraPos() und SetPlayerCameraLookat(). Diese Funktion muss vor MoveCamera() aufgerufen werden, da hier die Kameraposition in einer Variable gespeichert wird, weiln diese später benötigt wird (es gibt keine GetCameraPos Funktion)
MoveCamera
stock MoveCamera(playerid, Float:dest_x, Float:dest_y, Float:dest_z, Float:lookat_x, Float:lookat_y, Float:lookat_z, Float:speed)
Initialisiert einige Variablen und richtet einen Timer ein, der die Kamera letztendlich bewegt. Die lookat_* Parameter werden verwendet um die Kamera auf eine Koordinate zu richten, während diese bewegt wird.