176 lines
4.1 KiB
C
176 lines
4.1 KiB
C
/* *************************************
|
|
* 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;
|
|
}
|