/* ************************************* * Includes * *************************************/ #include "Camera.h" #include "Gfx.h" #include "Pad.h" /* ************************************* * Defines * *************************************/ #define SPEED_CALCULATION_TIME 3 #define MAX_CAMERA_SPEED 5 #define MIN_CAMERA_SPEED 1 /* ************************************* * Local Prototypes * *************************************/ static void CameraUpdateSpeed(TYPE_CAMERA* ptrCamera); void CameraInit(TYPE_CAMERA* ptrCamera) { ptrCamera->X_Offset = 0; ptrCamera->Y_Offset = 0; ptrCamera->X_Speed = 0; ptrCamera->Y_Speed = 0; ptrCamera->Speed_Timer = SPEED_CALCULATION_TIME; ptrCamera->locked = false; } TYPE_COLLISION_BLOCK CameraApplyCoordinatesToCoordinates( TYPE_CAMERA* ptrCamera, uint16_t x, uint16_t y ) { TYPE_COLLISION_BLOCK cb = {0}; cb.x = x + ptrCamera->X_Offset; cb.y = y + ptrCamera->Y_Offset; return cb; } void CameraApplyCoordinatesToSprite(TYPE_CAMERA* ptrCamera, TYPE_SPRITE* spr, uint16_t x, uint16_t y ) { spr->x = (uint8_t)(x + ptrCamera->X_Offset); spr->y = (uint8_t)(y + ptrCamera->Y_Offset); } void CameraUpdateSpeed(TYPE_CAMERA* ptrCamera) { if (PadDirectionKeyPressed() != false) { if (PadButtonPressed(PAD_LEFT) != false) { if (ptrCamera->X_Speed < 0) { ptrCamera->X_Speed += 2; } else if (ptrCamera->X_Speed < MAX_CAMERA_SPEED) { ptrCamera->X_Speed++; } } if (PadButtonPressed(PAD_UP) != false) { if (ptrCamera->Y_Speed < 0) { ptrCamera->Y_Speed += 2; } else if (ptrCamera->Y_Speed < MAX_CAMERA_SPEED) { ptrCamera->Y_Speed++; } } if (PadButtonPressed(PAD_DOWN) != false) { if (ptrCamera->Y_Speed > 0) { ptrCamera->Y_Speed -= 2; } else if (ptrCamera->Y_Speed > -MAX_CAMERA_SPEED) { ptrCamera->Y_Speed--; } } if (PadButtonPressed(PAD_RIGHT) != false) { if (ptrCamera->X_Speed > 0) { ptrCamera->X_Speed -= 2; } else if (ptrCamera->X_Speed > -MAX_CAMERA_SPEED) { ptrCamera->X_Speed--; } } } if ( (PadButtonPressed(PAD_LEFT) == false) && (PadButtonPressed(PAD_RIGHT) == false) ) { ptrCamera->X_Speed = 0; } if ( (PadButtonPressed(PAD_UP) == false) && (PadButtonPressed(PAD_DOWN) == false) ) { ptrCamera->Y_Speed = 0; } } void CameraHandler(TYPE_CAMERA* ptrCamera) { if (ptrCamera->locked != false) { ptrCamera->X_Speed = 0; ptrCamera->Y_Speed = 0; return; } if (ptrCamera->Speed_Timer < SPEED_CALCULATION_TIME) { ptrCamera->Speed_Timer++; } else { ptrCamera->Speed_Timer = 0; CameraUpdateSpeed(ptrCamera); } if ((ptrCamera->X_Offset + ptrCamera->X_Speed) < 0) { ptrCamera->X_Offset += ptrCamera->X_Speed; if (ptrCamera->X_Offset == 0) { ptrCamera->X_Speed = 0; } } else { ptrCamera->X_Offset = 0; ptrCamera->X_Speed = 0; } if ((ptrCamera->Y_Offset + ptrCamera->Y_Speed) < 0) { ptrCamera->Y_Offset += ptrCamera->Y_Speed; if (ptrCamera->Y_Offset == 0) { ptrCamera->Y_Speed = 0; } } else { ptrCamera->Y_Offset = 0; ptrCamera->Y_Speed = 0; } } void CameraSetLock(TYPE_CAMERA* ptrCamera, bool value) { ptrCamera->locked = value; }