summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXaviDCR92 <xavi.dcr@gmail.com>2018-08-05 17:58:03 +0200
committerXaviDCR92 <xavi.dcr@gmail.com>2018-08-05 17:58:03 +0200
commit4efe5ad6f9c8abb53df1e06921ce010ced24868e (patch)
tree24bae4ac1f561fec6af339ab0a2ce7de0ad28718
parentc501d0e4e732e09a4a75d873e976b2c801ef7920 (diff)
* Sprite data width and height is now extracted from Sprite class.
-rw-r--r--BaseUnit.cpp33
-rw-r--r--BaseUnit.h2
-rw-r--r--Camera.cpp18
-rw-r--r--Camera.h35
-rw-r--r--Sprite.cpp34
-rw-r--r--Sprite.h2
6 files changed, 97 insertions, 27 deletions
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 <stdbool.h>
#include <stdint.h>
#include <Gamebuino.h>
@@ -24,6 +26,8 @@
* Local variables definition
* ******************************************************************/
+static const Camera* cam;
+
/* *******************************************************************
* Local prototypes declaration
* ******************************************************************/
@@ -71,6 +75,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);
+
+ if (cam != NULL)
+ {
+ const uint8_t x = cam->getX(_x - w);
+ const uint8_t y = cam->getY(_y - h);
- gb.display.drawRect(_x, _y, w, 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 <stdbool.h>
#include <stdint.h>
+#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<uint16_t>(x + _xOffset);
+}
+
+uint16_t Camera::getRealY(const int16_t y) const
+{
+ return static_cast<uint16_t>(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<int16_t>(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<int16_t>(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 <stdint.h>
#include <stdbool.h>
-/* *************************************
+/* *******************************************************************
* 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;