22.10.2011, 00:45
(
Last edited by Lorenc_; 22/10/2011 at 07:55 AM.
)
![](http://i.imgur.com/rE8Qa.png)
A tutorial to creating camera rotating
![Smiley](images/smilies/smile.png)
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
![](http://i.imgur.com/r62c2.png)
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!
![](/imageshack/img42/1428/samp038od.png)
![](/imageshack/img855/7061/samp039pq.png)
![](/imageshack/img13/9061/samp040qk.png)
![](/imageshack/img148/7253/samp041ja.png)
Download
![](https://addons.opera.com/media/extensions/63/4763/1.0-rev1/icons/icon_64x64.png)
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.