Moving camera
#1

How to make a camera that moves?
If you saw this, like on Red County Roleplay when you should login.
With timers and SetCameraPos?
Reply
#2

seifcam.inc
pawn Код:
/*
                                    SeifCam - Camera include by Seif
                                   
        *-----------------------------------------------*
        | This include allows you to move the camera to |
        | a certain place smoothly and easily. It even  |
        | calls a callback when the camera finishes     |
        | to move at the destination. The callback is   |
        | 'OnPlayerCameraMoved'.                        |
        *-----------------------------------------------*
*/

/*x---------------------------------Important-------------------------------------x*/
//**INCLUDES**//
#include <a_samp>
//**PRAGMAS**//

//**MISC**//
#if !defined function
    #define function%0(%1) forward%0(%1); public%0(%1)
#endif
/*x---------------------------------Defining-------------------------------------x*/
//**VARIABLES**//
enum sciInfo
{
    Float:sciPOSX,
    Float:sciPOSY,
    Float:sciPOSZ,
    Float:sciLOOKX,
    Float:sciLOOKY,
    Float:sciLOOKZ,
    Float:sciDestX,
    Float:sciDestY,
    Float:sciDestZ,
    Float:sciMaxDest,
    Float:sciMove,
    bool:sciMoving,
    Float:sciFinalDestX,
    Float:sciFinalDestY,
    Float:sciFinalDestZ,
   
    Float:sciLookDestX,
    Float:sciLookDestY,
    Float:sciLookDestZ,
    Float:sciLookMaxDest,
    Float:sciLookMove,
    bool:sciLookMoving,
    Float:sciLookFinalDestX,
    Float:sciLookFinalDestY,
    Float:sciLookFinalDestZ,
    Float:sciAngle,
    Float:sciFirstAngle,
    Float:sciFinalAngle,
}
new SeifCamInfo[MAX_PLAYERS][sciInfo];
// **NATIVES** //
/*
native SetPlayerCameraPos(playerid, Float:x, Float:y, Float:z);
native SetPlayerCameraLookAt(playerid, Float:x, Float:y, Float:z);
native MovePlayerCamera(playerid, Float:x, Float:y, Float:z);
native ResetPlayerCamera(playerid);
*/

/*x---------------------------------CallBacks-------------------------------------x*/
function SetPlayerCameraPosEx(playerid, Float:x, Float:y, Float:z)
{
    if (!IsPlayerConnected(playerid)) return 0;
   
    SeifCamInfo[playerid][sciPOSX] = x;
    SeifCamInfo[playerid][sciPOSY] = y;
    SeifCamInfo[playerid][sciPOSZ] = z;
    SetPlayerCameraPos(playerid, x, y, z);
    return 1;
}

function SetPlayerCameraLookAtEx(playerid, Float:x, Float:y, Float:z)
{
    if (!IsPlayerConnected(playerid)) return 0;

    SeifCamInfo[playerid][sciLOOKX] = x;
    SeifCamInfo[playerid][sciLOOKY] = y;
    SeifCamInfo[playerid][sciLOOKZ] = z;
    SetPlayerCameraLookAt(playerid, x, y, z);
    new Float:a;
    GetPlayerFacingAngle(playerid, a);
    SeifCamInfo[playerid][sciAngle] = a;
    return 1;
}

Float:GetPlayerCameraFacingPos(playerid)
{
    new Float:x, Float:y, Float:a;
    GetPlayerCameraLookAt(playerid, x, y, a);
    x += 800.0;
    y += 300.0;
    new Float:px, Float:py, Float:pz;
    GetPlayerCameraLookAt(playerid, px, py, pz);
    a = floatabs(atan((py-y)/(px-x)));
    //printf("%f", a);

    if (px <= x && py >= y)         a = floatsub(180, a);
    else if (px < x && py < y)      a = floatadd(a, 180);
    else if (px >= x && py <= y)    a = floatsub(360.0, a);
    //printf("%f", a);

    a = floatsub(a, 90.0);
    //printf("%f", a);

    if (a >= 360.0) a = floatsub(a, 360.0);
    if (a < 0.0) a = 360.0;
    //printf("%f", a);
    return a;
}

Float:GetPlayerCameraFacingPosEx(playerid, Float:px, Float:py, Float:pz)
{
    #pragma unused pz
   
    new Float:x, Float:y, Float:a;
    GetPlayerCameraLookAt(playerid, x, y, a);
    a = floatabs(atan((py-y)/(px-x)));
    //printf("%f", a);

    if (px <= x && py >= y)         a = floatsub(180, a);
    else if (px < x && py < y)      a = floatadd(a, 180);
    else if (px >= x && py <= y)    a = floatsub(360.0, a);
    //printf("%f", a);

    a = floatsub(a, 90.0);
    //printf("%f", a);

    if (a >= 360.0) a = floatsub(a, 360.0);
    if (a < 0.0) a = 360.0;
    //printf("%f", a);
    return a;
}

function MovePlayerCamera(playerid, Float:posx, Float:posy, Float:posz/*, Float:lookatx, Float:lookaty, Float:lookatz*/, Float:speed)
{
    if (!IsPlayerConnected(playerid)) return 0;
    //printf("player %d: %f, %f, %f", playerid, posx, posy, posz);
    //if (posx != SeifCamInfo[playerid][sciLOOKX] || posy != SeifCamInfo[playerid][sciLOOKY] || posz != SeifCamInfo[playerid][sciLOOKZ]) return RotatePlayerCamera(playerid, posx, posy, posz, speed);
   
    SetPlayerCameraLookAtEx(playerid, posx, posy, posz);
    new Float:oldx = SeifCamInfo[playerid][sciPOSX],
        Float:oldy = SeifCamInfo[playerid][sciPOSY],
        Float:oldz = SeifCamInfo[playerid][sciPOSZ];
    new Float:destX, Float:destY, Float:destZ;
   
    /*new Float:oldlookx = SeifCamInfo[playerid][sciLOOKX],
        Float:oldlooky = SeifCamInfo[playerid][sciLOOKY],
        Float:oldlookz = SeifCamInfo[playerid][sciLOOKZ];
    new Float:destlookX, Float:destlookY, Float:destlookZ;*/

   
    if (posx > oldx) destX = posx-oldx;
    else destX = oldx-posx;
    if (posy > oldy) destY = posy-oldy;
    else destY = oldy-posy;
    if (posz > oldz) destZ = posz-oldz;
    else destZ = oldz-posz;

    /*if (lookatx > oldlookx) destlookX = lookatx-oldlookx;
    else destlookX = oldlookx-lookatx;
    if (lookaty > oldlooky) destlookY = lookaty-oldlooky;
    else destlookY = oldlooky-lookaty;
    if (lookatz > oldlookz) destlookZ = lookatz-oldlookz;
    else destlookZ = oldlookz-lookatz;*/

   
    new Float:desttime;
    if (destX >= destY && destX >= destZ) desttime = destX;
    else if (destY >= destX && destY >= destZ) desttime = destY;
    else if (destZ >= destX && destZ >= destY) desttime = destZ;
    desttime /= speed;
   
    /*new Float:lookdesttime;
    if (destlookX >= destlookY && destlookX >= destlookZ) lookdesttime = destlookX;
    else if (destlookY >= destlookX && destlookY >= destlookZ) lookdesttime = destlookY;
    else if (destlookZ >= destlookX && destlookZ >= destlookY) lookdesttime = destlookZ;*/

   
    //SeifCamInfo[playerid][sciDestX] = x;
    //SeifCamInfo[playerid][sciDestY] = y;
    //SeifCamInfo[playerid][sciDestZ] = z;
    SeifCamInfo[playerid][sciMaxDest] = desttime; // number to divide each destX/Y/Z so you can move the camera to the destination with every coordinate arriving at the same time.
    SeifCamInfo[playerid][sciDestX] = destX/desttime;
    SeifCamInfo[playerid][sciDestY] = destY/desttime;
    SeifCamInfo[playerid][sciDestZ] = destZ/desttime;
    SeifCamInfo[playerid][sciMove] = desttime; // amount of times left before arriving to the destination. since desttime is the max number to divide, it's set to it.
    SeifCamInfo[playerid][sciMoving] = true;
    SeifCamInfo[playerid][sciFinalDestX] = posx;
    SeifCamInfo[playerid][sciFinalDestY] = posy;
    SeifCamInfo[playerid][sciFinalDestZ] = posz;
    //new Float:x, Float:y, Float:z;
    //GetPlayerPos(playerid, x, y, z);
    SetTimerEx("MoveCamTimer", 50, 0, "d", playerid);
    return 1;
}

function RotatePlayerCamera(playerid, Float:posx, Float:posy, Float:posz, Float:speed)
{
    SeifCamInfo[playerid][sciLookMaxDest] = speed; // number to divide each destX/Y/Z so you can move the camera to the destination with every coordinate arriving at the same time.
    /*SeifCamInfo[playerid][sciLookDestX] = destlookX/lookdesttime;
    SeifCamInfo[playerid][sciLookDestY] = destlookY/lookdesttime;
    SeifCamInfo[playerid][sciLookDestZ] = destlookZ/lookdesttime;*/

    SeifCamInfo[playerid][sciAngle] = GetPlayerCameraFacingPos(playerid); // this will change
    SeifCamInfo[playerid][sciFirstAngle] = GetPlayerCameraFacingPos(playerid); // this will stay the same
    SeifCamInfo[playerid][sciFinalAngle] = GetPlayerCameraFacingPosEx(playerid, posx, posy, posz); // this will stay the same
    //SetPlayerFacingAngle(playerid, GetPlayerCameraFacingPos(playerid));
    //SeifCamInfo[playerid][sciLookMove] = ((SeifCamInfo[playerid][sciFirstAngle]>SeifCamInfo[playerid][sciFinalAngle]) ? ((SeifCamInfo[playerid][sciFirstAngle]-SeifCamInfo[playerid][sciFinalAngle])/speed) : ((SeifCamInfo[playerid][sciFinalAngle]-SeifCamInfo[playerid][sciFirstAngle])/speed)); // amount of times left before arriving to the destination angle.
    SeifCamInfo[playerid][sciLookMoving] = true;
    SeifCamInfo[playerid][sciLookFinalDestX] = posx;
    SeifCamInfo[playerid][sciLookFinalDestY] = posy;
    SeifCamInfo[playerid][sciLookFinalDestZ] = posz;
    printf("move: %f", SeifCamInfo[playerid][sciAngle]);
    SetTimerEx("RotCamTimer", 50, 0, "d", playerid);
    return 1;
}

function ResetPlayerCamera(playerid)
{
    if (!IsPlayerConnected(playerid)) return 0;

    SeifCamInfo[playerid][sciMoving] = false;
    SetCameraBehindPlayer(playerid);
    SeifCamInfo[playerid][sciPOSX] = 0.0;
    SeifCamInfo[playerid][sciPOSY] = 0.0;
    SeifCamInfo[playerid][sciPOSZ] = 0.0;
    SeifCamInfo[playerid][sciLOOKX] = 0.0;
    SeifCamInfo[playerid][sciLOOKY] = 0.0;
    SeifCamInfo[playerid][sciLOOKZ] = 0.0;
    SeifCamInfo[playerid][sciMove] = 0.0;
    SeifCamInfo[playerid][sciDestX] = 0.0;
    SeifCamInfo[playerid][sciDestY] = 0.0;
    SeifCamInfo[playerid][sciDestZ] = 0.0;
    SeifCamInfo[playerid][sciFinalDestX] = 0.0;
    SeifCamInfo[playerid][sciFinalDestY] = 0.0;
    SeifCamInfo[playerid][sciFinalDestZ] = 0.0;

    SeifCamInfo[playerid][sciLookMoving] = false;
    SeifCamInfo[playerid][sciLookMove] = 0.0;
    SeifCamInfo[playerid][sciLookDestX] = 0.0;
    SeifCamInfo[playerid][sciLookDestY] = 0.0;
    SeifCamInfo[playerid][sciLookDestZ] = 0.0;
    SeifCamInfo[playerid][sciLookFinalDestX] = 0.0;
    SeifCamInfo[playerid][sciLookFinalDestY] = 0.0;
    SeifCamInfo[playerid][sciLookFinalDestZ] = 0.0;
    SetCameraBehindPlayer(playerid);
    return 1;
}

function GetPlayerCamPos(playerid, &Float:x, &Float:y, &Float:z)
{
    x = SeifCamInfo[playerid][sciPOSX];
    y = SeifCamInfo[playerid][sciPOSY];
    z = SeifCamInfo[playerid][sciPOSZ];
}

function GetPlayerCameraLookAt(playerid, &Float:x, &Float:y, &Float:z)
{
    x = SeifCamInfo[playerid][sciLOOKX];
    y = SeifCamInfo[playerid][sciLOOKY];
    z = SeifCamInfo[playerid][sciLOOKZ];
}

/*Float:GetPlayerCameraFacingPos(playerid)
{
    new Float:x = SeifCamInfo[playerid][sciLOOKX],Float:y = SeifCamInfo[playerid][sciLOOKY],Float:a = SeifCamInfo[playerid][sciLOOKZ];
    new Float:px = SeifCamInfo[playerid][sciLookFinalDestX], Float:py = SeifCamInfo[playerid][sciLookFinalDestY];
    a = floatabs(atan((py-y)/(px-x)));

    if (px <= x && py >= y)         a = floatsub(180, a);
    else if (px < x && py < y)      a = floatadd(a, 180);
    else if (px >= x && py <= y)    a = floatsub(360.0, a);

    a = floatsub(a, 90.0);

    if (a >= 360.0) a = floatsub(a, 360.0);

    return a;
}*/


function MoveCamTimer(playerid)
{
    if (!IsPlayerConnected(playerid)) return 0;
    if (SeifCamInfo[playerid][sciMoving] == false)
    {
        OnPlayerCameraMoved(playerid, SeifCamInfo[playerid][sciPOSX], SeifCamInfo[playerid][sciPOSY], SeifCamInfo[playerid][sciPOSZ]);
        //SetPlayerCameraLookAt(playerid, sciX, sciY, sciZ);
        //printf("player %d DONE: %f, %f, %f", playerid, SeifCamInfo[playerid][sciPOSX], SeifCamInfo[playerid][sciPOSY], SeifCamInfo[playerid][sciPOSZ]);
        return 1;
    }
   
    if (SeifCamInfo[playerid][sciFinalDestX] > SeifCamInfo[playerid][sciPOSX]) SeifCamInfo[playerid][sciPOSX] += SeifCamInfo[playerid][sciDestX];
    else SeifCamInfo[playerid][sciPOSX] -= SeifCamInfo[playerid][sciDestX];
    if (SeifCamInfo[playerid][sciFinalDestY] > SeifCamInfo[playerid][sciPOSY]) SeifCamInfo[playerid][sciPOSY] += SeifCamInfo[playerid][sciDestY];
    else SeifCamInfo[playerid][sciPOSY] -= SeifCamInfo[playerid][sciDestY];
    if (SeifCamInfo[playerid][sciFinalDestZ] > SeifCamInfo[playerid][sciPOSZ]) SeifCamInfo[playerid][sciPOSZ] += SeifCamInfo[playerid][sciDestZ];
    else SeifCamInfo[playerid][sciPOSZ] -= SeifCamInfo[playerid][sciDestZ];
    SeifCamInfo[playerid][sciMove] -= float(1);
    //printf("move: %f", SeifCamInfo[playerid][sciMove]);
    if (SeifCamInfo[playerid][sciMove] <= float(1)) SeifCamInfo[playerid][sciMoving] = false;
    SetPlayerCameraPos(playerid, SeifCamInfo[playerid][sciPOSX], SeifCamInfo[playerid][sciPOSY], SeifCamInfo[playerid][sciPOSZ]);
    SetPlayerCameraLookAt(playerid, SeifCamInfo[playerid][sciLOOKX], SeifCamInfo[playerid][sciLOOKY], SeifCamInfo[playerid][sciLOOKZ]);
    SetTimerEx("MoveCamTimer", 50, 0, "d", playerid);
    return 1;
}

function RotCamTimer(playerid)
{
    if (!IsPlayerConnected(playerid)) return 0;
    if (SeifCamInfo[playerid][sciLookMoving] == false)
    {
        OnPlayerCameraRotated(playerid, SeifCamInfo[playerid][sciLOOKX], SeifCamInfo[playerid][sciLOOKY], SeifCamInfo[playerid][sciLOOKZ]);
        return 1;
    }

    if ((SeifCamInfo[playerid][sciFirstAngle]-SeifCamInfo[playerid][sciFinalAngle]) > 180) SeifCamInfo[playerid][sciAngle] -= SeifCamInfo[playerid][sciLookMaxDest];
    else SeifCamInfo[playerid][sciAngle] += SeifCamInfo[playerid][sciLookMaxDest];
   
    SeifCamInfo[playerid][sciLOOKX] -= floatsin(SeifCamInfo[playerid][sciAngle], degrees);
    SeifCamInfo[playerid][sciLOOKY] -= floatcos(SeifCamInfo[playerid][sciAngle], degrees);
   
    if (SeifCamInfo[playerid][sciAngle] <= 0.0 && SeifCamInfo[playerid][sciFinalAngle] > 0.0) SeifCamInfo[playerid][sciAngle] = 360.0;
    else if (SeifCamInfo[playerid][sciAngle] >= 360.0 && SeifCamInfo[playerid][sciFinalAngle] < 360.0) SeifCamInfo[playerid][sciAngle] = 0.0;
   
    if ((SeifCamInfo[playerid][sciAngle] >= (SeifCamInfo[playerid][sciFinalAngle]-SeifCamInfo[playerid][sciLookMaxDest]) && SeifCamInfo[playerid][sciAngle] <= (SeifCamInfo[playerid][sciFinalAngle]+SeifCamInfo[playerid][sciLookMaxDest])) || SeifCamInfo[playerid][sciAngle] == SeifCamInfo[playerid][sciFinalAngle]) printf("done: %f/%f", SeifCamInfo[playerid][sciAngle], SeifCamInfo[playerid][sciFinalAngle]), SeifCamInfo[playerid][sciLookMoving] = false;
    printf("%f/%f", SeifCamInfo[playerid][sciAngle], SeifCamInfo[playerid][sciFinalAngle]);
    SetPlayerCameraPos(playerid, SeifCamInfo[playerid][sciPOSX], SeifCamInfo[playerid][sciPOSY], SeifCamInfo[playerid][sciPOSZ]);
    SetPlayerCameraLookAt(playerid, SeifCamInfo[playerid][sciLOOKX], SeifCamInfo[playerid][sciLOOKY], SeifCamInfo[playerid][sciLOOKZ]);
    SetTimerEx("RotCamTimer", 50, 0, "d", playerid);
    return 1;
}

//**FUNCTION RENAMES**//
#define SetPlayerCameraPos SetPlayerCameraPosEx
#define SetPlayerCameraLookAt SetPlayerCameraLookAtEx
//**FUNCTION FORWARDS**//
forward OnPlayerCameraMoved(playerid, Float:destinationX, Float:destinationY, Float:destinationZ);
forward OnPlayerCameraRotated(playerid, Float:destinationX, Float:destinationY, Float:destinationZ);
            // you MUST put the following callback in your script that uses this include! Exclude the /* and */ !
/*

public OnPlayerCameraMoved(playerid, Float:destinationX, Float:destinationY, Float:destinationZ)
{
    return 1;
}
public OnPlayerCameraRotated(playerid, Float:destinationX, Float:destinationY, Float:destinationZ)
{
    return 1;
}

*/
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)