/* ************************************* * Includes * *************************************/ #include "Camera.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); static bool CameraSpecialConditions(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; } TYPE_COLLISION_BLOCK CameraApplyCoordinatesToCoordinates( TYPE_CAMERA * ptrCamera, uint16_t x, uint16_t y ) { TYPE_COLLISION_BLOCK cb; memset(&cb, 0, sizeof(TYPE_COLLISION_BLOCK)); 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() == true) { if(PadButtonPressed(PAD_LEFT) == true) { if(ptrCamera->X_Speed < 0) { ptrCamera->X_Speed += 2; } else if(ptrCamera->X_Speed < MAX_CAMERA_SPEED) { ptrCamera->X_Speed++; } } if(PadButtonPressed(PAD_UP) == true) { if(ptrCamera->Y_Speed < 0) { ptrCamera->Y_Speed += 2; } else if(ptrCamera->Y_Speed < MAX_CAMERA_SPEED) { ptrCamera->Y_Speed++; } } if(PadButtonPressed(PAD_DOWN) == true) { if(ptrCamera->Y_Speed > 0) { ptrCamera->Y_Speed -= 2; } else if(ptrCamera->Y_Speed > -MAX_CAMERA_SPEED) { ptrCamera->Y_Speed--; } } if(PadButtonPressed(PAD_RIGHT) == true) { 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) ) { if(ptrCamera->X_Speed > 0) { ptrCamera->X_Speed--; } else if(ptrCamera->X_Speed < 0) { ptrCamera->X_Speed++; } } if( (PadButtonPressed(PAD_UP) == false) && (PadButtonPressed(PAD_DOWN) == false) ) { if(ptrCamera->Y_Speed > 0) { ptrCamera->Y_Speed--; } else if(ptrCamera->Y_Speed < 0) { ptrCamera->Y_Speed++; } } } void CameraHandler(TYPE_CAMERA * ptrCamera) { if(CameraSpecialConditions(ptrCamera) == true) { 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; } /*char str[8]; snprintf(str, 8, "%u", ptrCamera->Y_Offset); GfxPrintText(str, 40, 40);*/ 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; } } bool CameraSpecialConditions(TYPE_CAMERA * ptrCamera) { return false; }