From 189ecf754d0c8131464bfdff98fb56e7752556b1 Mon Sep 17 00:00:00 2001 From: Xavier Del Campo Date: Sat, 4 Feb 2017 14:49:08 +0100 Subject: Initial commit --- Source/Camera.c | 201 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 201 insertions(+) create mode 100755 Source/Camera.c (limited to 'Source/Camera.c') diff --git a/Source/Camera.c b/Source/Camera.c new file mode 100755 index 0000000..9241455 --- /dev/null +++ b/Source/Camera.c @@ -0,0 +1,201 @@ +/* ************************************* + * Includes + * *************************************/ + +#include "Camera.h" + +/* ************************************* + * Defines + * *************************************/ + +#define SPEED_CALCULATION_TIME 3 +#define MAX_CAMERA_SPEED 5 +#define MIN_CAMERA_SPEED 1 +#define CAMERA_INITIAL_X_OFFSET (X_SCREEN_RESOLUTION >> 1) + +/* ************************************* + * Local Prototypes + * *************************************/ + +static void CameraUpdateSpeed(TYPE_PLAYER * ptrPlayer); +static bool CameraSpecialConditions(TYPE_PLAYER * ptrPlayer); + +void CameraInit(TYPE_PLAYER * ptrPlayer) +{ + // Center camera on screen + ptrPlayer->Camera.X_Offset = CAMERA_INITIAL_X_OFFSET; + ptrPlayer->Camera.Y_Offset = 0; + ptrPlayer->Camera.X_Speed = 0; + ptrPlayer->Camera.Y_Speed = 0; + ptrPlayer->Camera.Speed_Timer = SPEED_CALCULATION_TIME; +} + +void CameraApplyCoordinatesToSprite(TYPE_PLAYER * ptrPlayer, GsSprite * spr) +{ + spr->x += (short)ptrPlayer->Camera.X_Offset; + spr->y += (short)ptrPlayer->Camera.Y_Offset; +} + +void CameraApplyCoordinatesToRectangle(TYPE_PLAYER * ptrPlayer, GsRectangle * rect) +{ + dprintf("Rectangle {%d, %d}\n", + rect->x, + rect->y ); + + rect->x += (short)ptrPlayer->Camera.X_Offset; + rect->y += (short)ptrPlayer->Camera.Y_Offset; +} + +void CameraUpdateSpeed(TYPE_PLAYER * ptrPlayer) +{ + if(ptrPlayer->PadDirectionKeyPressed_Callback() == true) + { + if(ptrPlayer->PadKeyPressed_Callback(PAD_LEFT) == true) + { + if(ptrPlayer->Camera.X_Speed < 0) + { + ptrPlayer->Camera.X_Speed += 2; + } + else if(ptrPlayer->Camera.X_Speed < MAX_CAMERA_SPEED) + { + ptrPlayer->Camera.X_Speed++; + } + } + + if(ptrPlayer->PadKeyPressed_Callback(PAD_UP) == true) + { + if(ptrPlayer->Camera.Y_Speed < 0) + { + ptrPlayer->Camera.Y_Speed += 2; + } + else if(ptrPlayer->Camera.Y_Speed < MAX_CAMERA_SPEED) + { + ptrPlayer->Camera.Y_Speed++; + } + } + + if(ptrPlayer->PadKeyPressed_Callback(PAD_DOWN) == true) + { + if(ptrPlayer->Camera.Y_Speed > 0) + { + ptrPlayer->Camera.Y_Speed -= 2; + } + else if(ptrPlayer->Camera.Y_Speed > -MAX_CAMERA_SPEED) + { + ptrPlayer->Camera.Y_Speed--; + } + } + + if(ptrPlayer->PadKeyPressed_Callback(PAD_RIGHT) == true) + { + if(ptrPlayer->Camera.X_Speed > 0) + { + ptrPlayer->Camera.X_Speed -= 2; + } + else if(ptrPlayer->Camera.X_Speed > -MAX_CAMERA_SPEED) + { + ptrPlayer->Camera.X_Speed--; + } + } + } + + if( (ptrPlayer->PadKeyPressed_Callback(PAD_LEFT) == false) + && + (ptrPlayer->PadKeyPressed_Callback(PAD_RIGHT) == false) ) + { + if(ptrPlayer->Camera.X_Speed > 0) + { + ptrPlayer->Camera.X_Speed--; + } + else if(ptrPlayer->Camera.X_Speed < 0) + { + ptrPlayer->Camera.X_Speed++; + } + } + + if( (ptrPlayer->PadKeyPressed_Callback(PAD_UP) == false) + && + (ptrPlayer->PadKeyPressed_Callback(PAD_DOWN) == false) ) + { + if(ptrPlayer->Camera.Y_Speed > 0) + { + ptrPlayer->Camera.Y_Speed--; + } + else if(ptrPlayer->Camera.Y_Speed < 0) + { + ptrPlayer->Camera.Y_Speed++; + } + } +} + +void CameraHandler(TYPE_PLAYER * ptrPlayer) +{ + if(CameraSpecialConditions(ptrPlayer) == true) + { + ptrPlayer->Camera.X_Speed = 0; + ptrPlayer->Camera.Y_Speed = 0; + return; + } + + if(ptrPlayer->Camera.Speed_Timer < SPEED_CALCULATION_TIME) + { + ptrPlayer->Camera.Speed_Timer++; + } + else + { + ptrPlayer->Camera.Speed_Timer = 0; + CameraUpdateSpeed(ptrPlayer); + } + + ptrPlayer->Camera.X_Offset += ptrPlayer->Camera.X_Speed; + ptrPlayer->Camera.Y_Offset += ptrPlayer->Camera.Y_Speed; +} + +bool CameraSpecialConditions(TYPE_PLAYER * ptrPlayer) +{ + if( (ptrPlayer->ShowAircraftData == true) + || + (ptrPlayer->SelectRunway == true) ) + { + // Camera cannot be handled when these states are activated + + return true; + } + + return false; +} + +TYPE_ISOMETRIC_POS CameraGetIsoPos(TYPE_PLAYER * ptrPlayer) +{ + TYPE_ISOMETRIC_POS IsoPos; + TYPE_CARTESIAN_POS CartPos; + + CartPos.x = CAMERA_INITIAL_X_OFFSET - ptrPlayer->Camera.X_Offset; + CartPos.y = (Y_SCREEN_RESOLUTION >> 1) - ptrPlayer->Camera.Y_Offset; + + /*dprintf("CartPos = {%d, %d}\n", CartPos.x, CartPos.y);*/ + + IsoPos = GfxCartesianToIsometric(&CartPos); + + return IsoPos; +} + +void CameraMoveToIsoPos(TYPE_PLAYER * ptrPlayer, TYPE_ISOMETRIC_POS IsoPos) +{ + TYPE_CARTESIAN_POS CartPos = GfxIsometricToCartesian(&IsoPos); + + /*dprintf("Isometric pos = {%d, %d, %d}, " + "Cartesian pos = {%d, %d}\n", + IsoPos.x, + IsoPos.y, + IsoPos.z, + CartPos.x, + CartPos.y );*/ + + ptrPlayer->Camera.X_Offset = CAMERA_INITIAL_X_OFFSET - CartPos.x; + ptrPlayer->Camera.Y_Offset = (Y_SCREEN_RESOLUTION >> 1) - CartPos.y; + + /*dprintf("Moving camera to {%d, %d}\n", + ptrPlayer->Camera.X_Offset, + ptrPlayer->Camera.Y_Offset );*/ +} -- cgit v1.2.3