181 lines
4.7 KiB
C++
181 lines
4.7 KiB
C++
/* *******************************************************************
|
|
* Includes
|
|
* ******************************************************************/
|
|
|
|
#include "Camera.h"
|
|
#include <stdint.h>
|
|
|
|
/* *******************************************************************
|
|
* Defines
|
|
* ******************************************************************/
|
|
|
|
#define MAX_CAMERA_SPEED ((int8_t)3)
|
|
#define SPEED_CALCULATION_TIME ((uint8_t)3)
|
|
#define CAMERA_ACCELERATION ((int8_t)1)
|
|
|
|
/* *******************************************************************
|
|
* Types definition
|
|
* ******************************************************************/
|
|
|
|
/* *******************************************************************
|
|
* Global variables definition
|
|
* ******************************************************************/
|
|
|
|
/* *******************************************************************
|
|
* Local variables definition
|
|
* ******************************************************************/
|
|
|
|
/* *******************************************************************
|
|
* Local prototypes declaration
|
|
* ******************************************************************/
|
|
|
|
/* *******************************************************************
|
|
* Functions definition
|
|
* ******************************************************************/
|
|
|
|
/*****************************************************************//**
|
|
*
|
|
* \brief Constructor for Camera class.
|
|
*
|
|
*********************************************************************/
|
|
Camera::Camera(void) :
|
|
_bLocked(false),
|
|
_xOffset(0),
|
|
_yOffset(0),
|
|
_xSpeed(0),
|
|
_ySpeed(0),
|
|
_speedTimer(0)
|
|
{
|
|
}
|
|
|
|
void Camera::handler(void)
|
|
{
|
|
_xOffset += _xSpeed;
|
|
_yOffset += _ySpeed;
|
|
|
|
if (++_speedTimer >= SPEED_CALCULATION_TIME)
|
|
{
|
|
_speedTimer = 0;
|
|
|
|
if (_ySpeed < 0)
|
|
{
|
|
_ySpeed += CAMERA_ACCELERATION;
|
|
}
|
|
else if (_ySpeed > 0)
|
|
{
|
|
_ySpeed -= CAMERA_ACCELERATION;
|
|
}
|
|
else
|
|
{
|
|
/* Y speed is already still. Continue. */
|
|
}
|
|
|
|
if (_xSpeed < 0)
|
|
{
|
|
_xSpeed += CAMERA_ACCELERATION;
|
|
}
|
|
else if (_xSpeed > 0)
|
|
{
|
|
_xSpeed -= CAMERA_ACCELERATION;
|
|
}
|
|
else
|
|
{
|
|
/* x speed is alreadx still. Continue. */
|
|
}
|
|
}
|
|
}
|
|
|
|
/*****************************************************************//**
|
|
*
|
|
* \brief This function transforms X coordinates for a given
|
|
* object to camera coordinates.
|
|
*
|
|
*********************************************************************/
|
|
uint8_t Camera::getX(const uint8_t x) const
|
|
{
|
|
return x + _xOffset;
|
|
}
|
|
|
|
/*****************************************************************//**
|
|
*
|
|
* \brief This function transforms Y coordinates for a given
|
|
* object to camera coordinates.
|
|
*
|
|
*********************************************************************/
|
|
uint8_t Camera::getY(const uint8_t y) const
|
|
{
|
|
return y + _yOffset;
|
|
}
|
|
|
|
/*****************************************************************//**
|
|
*
|
|
* \brief Event handler executed when human player presses
|
|
* left arrow button.
|
|
*
|
|
*********************************************************************/
|
|
void Camera::onLeftBtnPressed(void)
|
|
{
|
|
if (_xSpeed < 0)
|
|
{
|
|
_xSpeed += CAMERA_ACCELERATION << 1;
|
|
}
|
|
else if (_xSpeed < MAX_CAMERA_SPEED)
|
|
{
|
|
_xSpeed += CAMERA_ACCELERATION;
|
|
}
|
|
}
|
|
|
|
/*****************************************************************//**
|
|
*
|
|
* \brief Event handler executed when human player presses
|
|
* right arrow button.
|
|
*
|
|
*********************************************************************/
|
|
void Camera::onRightBtnPressed(void)
|
|
{
|
|
if (_xSpeed > 0)
|
|
{
|
|
_xSpeed -= CAMERA_ACCELERATION << 1;
|
|
}
|
|
else if (_xSpeed > -MAX_CAMERA_SPEED)
|
|
{
|
|
_xSpeed -= CAMERA_ACCELERATION;
|
|
}
|
|
}
|
|
|
|
/*****************************************************************//**
|
|
*
|
|
* \brief Event handler executed when human player presses
|
|
* up arrow button.
|
|
*
|
|
*********************************************************************/
|
|
void Camera::onUpBtnPressed(void)
|
|
{
|
|
if (_ySpeed < 0)
|
|
{
|
|
_ySpeed += CAMERA_ACCELERATION << 1;
|
|
}
|
|
else if (_ySpeed < MAX_CAMERA_SPEED)
|
|
{
|
|
_ySpeed += CAMERA_ACCELERATION;
|
|
}
|
|
}
|
|
|
|
/*****************************************************************//**
|
|
*
|
|
* \brief Event handler executed when human player presses
|
|
* down arrow button.
|
|
*
|
|
*********************************************************************/
|
|
void Camera::onDownBtnPressed(void)
|
|
{
|
|
if (_ySpeed > 0)
|
|
{
|
|
_ySpeed -= CAMERA_ACCELERATION << 1;
|
|
}
|
|
else if (_ySpeed < MAX_CAMERA_SPEED)
|
|
{
|
|
_ySpeed -= CAMERA_ACCELERATION;
|
|
}
|
|
}
|