aboutsummaryrefslogtreecommitdiff
path: root/Source/Camera.c
diff options
context:
space:
mode:
authorXavier Del Campo <xavi.dcr@gmail.com>2017-02-04 14:49:08 +0100
committerXavier Del Campo <xavi.dcr@gmail.com>2017-02-04 14:49:08 +0100
commit189ecf754d0c8131464bfdff98fb56e7752556b1 (patch)
tree89e7d02128bbc7b2d3f5c19a3da14ec14291982a /Source/Camera.c
downloadairport-189ecf754d0c8131464bfdff98fb56e7752556b1.tar.gz
Initial commit
Diffstat (limited to 'Source/Camera.c')
-rwxr-xr-xSource/Camera.c201
1 files changed, 201 insertions, 0 deletions
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 );*/
+}