[Tutorial] How to make a rotating camera on class selection
#1


A tutorial to creating camera rotating
Why? What? Why'd you make this?

Out of boredom, I decided to make a class rotating camera tutorial. Would be nice for A/D servers to have such a feature.

What you'll need in this tutorial:
  • A little bit about trignometry (using COS, SIN)
  • A brain (which you all have :P)
Okay, note that this is not even close to what Dice7 wrote a long time ago on his class rotating camera selection. So yeah, don't say it is.

The camera rotates around the player and goes by the circumference of this circle. Some options are tweak-able to adjust the camera though you must get rid of your current camera inside of your gamemode before using.

Basic structure - Diagram


Lets script!
Variables
Using variables/constants looks more neater than defining for me (yes, I'm creating some 32 bit variables facepalm.jpg)
pawn Code:
/* ** Server Data ** */
const // Constant values, you may change it to "new" if they're going to be modified once rotating.
    Float: spawnX = 0.0,     // The SPAWN X you're willing to work from
    Float: spawnY = 0.0,     // The SPAWN Y you're willing to work from
    Float: spawnZ = 5.0,     // The SPAWN Y you're willing to work from
    Float: camRadius = 20.0, // The radius of the camera rotating
    Float: camSpeed  = 1.25, // The speed of the camera moving around. MUST NOT BE NULL; IT WONT MOVE IF SO!
    Float: camHeight = 6.0   // The height of the camera once moving!
;

/* ** Player Data ** */
new
    prc_Timer                   [MAX_PLAYERS],  // The timer for the movement.
    bool: prc_Moving            [MAX_PLAYERS],  // Check if the player is moving his camera
    Float: prc_Degree           [MAX_PLAYERS]   // The degree counter to show which the player is on.
;

forward MoveCamera(playerid); // We'll add this here to prevent future warnings..
OnPlayerRequestClass
pawn Code:
public OnPlayerRequestClass(playerid, classid)
{
    SetPlayerPos(playerid, spawnX, spawnY, spawnZ); // Set the player at those 3 const spawn values from before.
   
    if(prc_Moving[playerid] == false) // Check whether the camera is already set.
    {
        prc_Degree[playerid] = 0; // Reseting the variable
        prc_Timer[playerid] = SetTimerEx("MoveCamera", 75, true, "d", playerid); // Setting the timer
        prc_Moving[playerid] = true; // okay, now we're going to activate the moving variable
    }
    return 1;
}
Camera movement
pawn Code:
public MoveCamera(playerid) // The core of the movement
{
    static // Static for the repeation :O
        Float: nX,  // The newX
        Float: nY   // the newY
    ;
    if(prc_Moving[playerid] == false) // check whether the timer is activated and the variable isn't.
    {
        KillTimer(prc_Timer[playerid]); // Killing the timer, ofc we don't want a 75 ms timer always running.
        prc_Degree[playerid] = 0; // Reseting the variable
    }
    if(prc_Degree[playerid] >= 360) prc_Degree[playerid] = 0; // If the rotation is past 360, reset to 0 (looks more neater)
    prc_Degree[playerid] += camSpeed; // For some smooth rotation, I'm using 1.25
   
    nX = spawnX + camRadius * floatcos(prc_Degree[playerid], degrees);
    nY = spawnY + camRadius * floatsin(prc_Degree[playerid], degrees);
   
    // So, we're going to get the spawn axis and add the radius in to them.
    // Then we use the trignometric functions to apply such angles to the movement
    // making it look nice.
    SetPlayerCameraPos(playerid, nX, nY, spawnZ + camHeight); // Setting the Camera position around the player
    SetPlayerCameraLookAt(playerid, spawnX, spawnY, spawnZ); // Looking at the player position from there :)
    SetPlayerFacingAngle(playerid, prc_Degree[playerid] - 90.0); // to make it face the camera :)
    return 1;
}
OnPlayerDisconnect
pawn Code:
public OnPlayerDisconnect(playerid, reason)
{
    if(prc_Moving[playerid] == true)
    {
        KillTimer(prc_Timer[playerid]); // Killing the timer, ofc we don't want a 75 ms timer always running.
        prc_Degree[playerid] = 0; // Reseting the variable
        prc_Moving[playerid] = false; // Reseting the variable
    }
    return 1;
}
OnPlayerSpawn
pawn Code:
public OnPlayerSpawn(playerid)
{
    if(prc_Moving[playerid] == true)
    {
        KillTimer(prc_Timer[playerid]); // Killing the timer, ofc we don't want a 75 ms timer always running.
        prc_Degree[playerid] = 0; // Reseting the variable
        prc_Moving[playerid] = false; // Reseting the variable
        SetCameraBehindPlayer(playerid); // Preventing bugs from appearing.
    }
    return 1;
}
Screenshots
I rather have screenies than a video, since ******* wrecks the video quality for me - Uploaded with imageShack, sorry for people that cannot view it!




Download

Example gamemode with the default structure

Problems?
If there is any problems which mostly said not to be, please report them and I'll fix them.
Reply
#2

Looking good Lorenc, Gonna use it on BlackOps or it is on? :P

Basic tutorial, could help me in the future
Reply
#3

Quote:
Originally Posted by ©•Riddy•©
View Post
Looking good Lorenc, Gonna use it on BlackOps or it is on? :P

Basic tutorial, could help me in the future
Yeah I might for 0.3d, basically rotating the player just to see how his player looks
Still have a lot to improve on that gamemode for 0.3d, hoping for it to be the most epic/realistic CoD server around (I would say yes in realism of the server between the actual blackops game)

Thanks for the comment Riddy
Reply
#4

Looks good
Reply
#5

Hmm its good however you could explain better.Btw its good tutorial GG.
Reply
#6

Looking good once again ! Good job.
Reply
#7

Nice one. Good job.
Reply
#8

wow awesome, I was always wondering how to create something like this
Reply
#9

Awesome work Lorenc.
Reply
#10

Quote:
Originally Posted by vassilis
View Post
Hmm its good however you could explain better.Btw its good tutorial GG.
IF YOU DON'T KNOW TRIGNOMETRY THEN READ THIS
Reply
#11

lmao of course i know trigonometry and i am not talking about that i am talking about that,however its a very good tutorial which is full of experience
Reply
#12

The example gamemode with the default structure is doesn't work!
btw: nice tutorial, I just looking tutorial like that

EDIT: That's works - thanks
Reply
#13

Quote:
Originally Posted by juraska
View Post
The example gamemode with the default structure is doesn't work!
btw: nice tutorial, I just looking tutorial like that

EDIT: That's works - thanks
lol

Thanks for the comments.
Reply
#14

Lorenc i added your account system to the useful tutorials topic
Regards,
Reply
#15

Thanks for this, been wanting to know how to do it for quite a while.
Reply
#16

No problem, suggestions are welcome :3
Reply
#17

Great Job
When i firstly Look on it , i thought its the old topic which other guy made.
But when i read it I came to know that it even looks better
Keep It Up !!
Reply
#18

Awesome ! New idea for my future server
Reply
#19

Nice man! But can i ask something? Why does the player move too?
Reply
#20

Quote:
Originally Posted by [RaZ]Hal_Moore
View Post
Nice man! But can i ask something? Why does the player move too?
I just wanted something fancy going on though you can remove that by deleting the line "SetPlayerFacingAngle"
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)