22.10.2011, 00:45
(
Last edited by Lorenc_; 22/10/2011 at 07:55 AM.
)
A tutorial to creating camera rotating
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)
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..
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;
}
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;
}
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;
}
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;
}
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.