diff --git a/BaseUnit.cpp b/BaseUnit.cpp index 8fde6b4..f374ab1 100644 --- a/BaseUnit.cpp +++ b/BaseUnit.cpp @@ -3,7 +3,9 @@ * ******************************************************************/ #include "BaseUnit.h" +#include "Camera.h" #include "System.h" +#include "Sprite.h" #include #include #include @@ -24,6 +26,8 @@ * Local variables definition * ******************************************************************/ +static const Camera* cam; + /* ******************************************************************* * Local prototypes declaration * ******************************************************************/ @@ -69,6 +73,17 @@ void BaseUnit::handler(void) { } +/*****************************************************************//** + * + * \brief This function sets global camera for all BaseUnit + * instances. + * + *********************************************************************/ +void BaseUnit::setCamera(const Camera* const c) +{ + cam = c; +} + /*****************************************************************//** * * \brief Periodical draw handler for BaseUnit class. @@ -78,19 +93,19 @@ void BaseUnit::drawHandler(const uint8_t* const pu8SprData) { if (isSelected()) { - enum - { - WIDTH_DATA_INDEX, - HEIGHT_DATA_INDEX - }; - /* Retrieve unit width from sprite data. */ - const uint8_t w = pgm_read_byte(&pu8SprData[WIDTH_DATA_INDEX]); + const uint8_t w = Sprite::getWidth(pu8SprData); /* Retrieve unit height from sprite data. */ - const uint8_t h = pgm_read_byte(&pu8SprData[HEIGHT_DATA_INDEX]); + const uint8_t h = Sprite::getHeight(pu8SprData); - gb.display.drawRect(_x, _y, w, h); + if (cam != NULL) + { + const uint8_t x = cam->getX(_x - w); + const uint8_t y = cam->getY(_y - h); + + gb.display.drawRoundRect(x, y, w << 1, h << 1, 2); + } } else { diff --git a/BaseUnit.h b/BaseUnit.h index 269eaf3..5347a6a 100644 --- a/BaseUnit.h +++ b/BaseUnit.h @@ -7,6 +7,7 @@ #include #include +#include "Camera.h" /* ******************************************************************* * Defines @@ -35,6 +36,7 @@ class BaseUnit void handler(void); void drawHandler(const uint8_t* const pu8SprData); void create(const uint16_t x, const uint16_t y); + static void setCamera(const Camera* const c); bool isAlive(void); bool isSelected(void); void setSelected(const bool bSelect); diff --git a/Camera.cpp b/Camera.cpp index 1f75875..34aa15b 100644 --- a/Camera.cpp +++ b/Camera.cpp @@ -51,15 +51,25 @@ Camera::Camera(void) : { } +uint16_t Camera::getRealX(const int16_t x) const +{ + return static_cast(x + _xOffset); +} + +uint16_t Camera::getRealY(const int16_t y) const +{ + return static_cast(y + _yOffset); +} + /*****************************************************************//** * * \brief This function transforms X coordinates for a given * object to camera coordinates. * *********************************************************************/ -uint8_t Camera::getX(const uint8_t x) const +int16_t Camera::getX(const uint16_t x) const { - return x - _xOffset; + return static_cast(x - _xOffset); } /*****************************************************************//** @@ -68,9 +78,9 @@ uint8_t Camera::getX(const uint8_t x) const * object to camera coordinates. * *********************************************************************/ -uint8_t Camera::getY(const uint8_t y) const +int16_t Camera::getY(const uint16_t y) const { - return y - _yOffset; + return static_cast(y - _yOffset); } /*****************************************************************//** diff --git a/Camera.h b/Camera.h index 6ff3045..3b3acad 100644 --- a/Camera.h +++ b/Camera.h @@ -1,25 +1,36 @@ #ifndef CAMERA_H__ #define CAMERA_H__ -/* ************************************* +/* ******************************************************************* * Includes - * *************************************/ + * ******************************************************************/ #include "Cursor.h" #include #include -/* ************************************* +/* ******************************************************************* * Defines - * *************************************/ + * ******************************************************************/ -/* ************************************* - * Structs and enums - * *************************************/ +/* ******************************************************************* + * Global types definition + * ******************************************************************/ -/* ************************************* +/* Forward declaration. */ +class Cursor; + +/* ******************************************************************* + * Global variables declaration + * ******************************************************************/ + +/* ******************************************************************* + * Global functions declaration + * ******************************************************************/ + +/* ******************************************************************* * Class definition - * *************************************/ + * ******************************************************************/ class Camera { @@ -27,8 +38,10 @@ class Camera Camera(void); void adjustLock(const bool bLock); bool isLocked(void) const; - uint8_t getX(const uint8_t x) const; - uint8_t getY(const uint8_t y) const; + int16_t getX(const uint16_t x) const; + int16_t getY(const uint16_t y) const; + uint16_t getRealX(const int16_t x) const; + uint16_t getRealY(const int16_t y) const; /* Event handlers. */ void onLeftBtnPressed(Cursor& cursor); diff --git a/Sprite.cpp b/Sprite.cpp index 49ee2bd..3b93a0d 100644 --- a/Sprite.cpp +++ b/Sprite.cpp @@ -72,12 +72,12 @@ void Sprite::draw(void) if (_cam != NULL) { - const uint8_t x = _followCam ? _cam->getX(_x) : _x; - const uint8_t y = _followCam ? _cam->getY(_y) : _y; + const int16_t x = _followCam ? _cam->getX(_x) : (int16_t)_x; + const int16_t y = _followCam ? _cam->getY(_y) : (int16_t)_y; if (_pu8SprData != NULL) { - gb.display.drawBitmap(x, y, _pu8SprData); + gb.display.drawBitmap((int8_t)x, (int8_t)y, _pu8SprData); } else { @@ -90,6 +90,34 @@ void Sprite::draw(void) } } +uint8_t Sprite::getWidth(const uint8_t* const pu8SprData) +{ + enum + { + WIDTH_DATA_INDEX = 0 + }; + + /* Retrieve unit width from sprite data. */ + const uint8_t w = pgm_read_byte(&pu8SprData[WIDTH_DATA_INDEX]); + + /* Return retrieved width. */ + return w; +} + +uint8_t Sprite::getHeight(const uint8_t* const pu8SprData) +{ + enum + { + HEIGHT_DATA_INDEX = 1 + }; + + /* Retrieve unit height from sprite data. */ + const uint8_t h = pgm_read_byte(&pu8SprData[HEIGHT_DATA_INDEX]); + + /* Return retrieved height. */ + return h; +} + /*****************************************************************//** * * \brief Reportedly, this function updates X/Y coordinates for diff --git a/Sprite.h b/Sprite.h index 20b30a9..55e0e74 100644 --- a/Sprite.h +++ b/Sprite.h @@ -44,6 +44,8 @@ class Sprite { _cam = cam; }; + static uint8_t getWidth(const uint8_t* const pu8SprData); + static uint8_t getHeight(const uint8_t* const pu8SprData); private: const uint8_t* _pu8SprData;