From 20936e93023c18f54d217c66b0e08fa80f4f7d50 Mon Sep 17 00:00:00 2001 From: XaviDCR92 Date: Tue, 10 Jul 2018 23:17:34 +0200 Subject: [PATCH] Camera is now an independent instance, and HumanPlayer only holds a reference to it. --- BaseUnit.cpp | 16 +- BaseUnit.h | 7 +- Camera.cpp | 113 ++- Camera.h | 6 +- Exe/POCKET.ELF | Bin 30272 -> 31088 bytes Exe/POCKET.HEX | 1659 ++++++++++++++++++++++--------------------- Exe/POCKET.MAP | 863 +++++++++++----------- Game.cpp | 13 +- Game.h | 1 + HumanPlayer.cpp | 22 +- HumanPlayer.h | 4 +- Menu.cpp | 11 +- PocketEmpires.geany | 42 +- Sprite.cpp | 23 +- Sprite.h | 41 +- Unit.cpp | 72 +- Unit.h | 2 +- 17 files changed, 1578 insertions(+), 1317 deletions(-) diff --git a/BaseUnit.cpp b/BaseUnit.cpp index 8de5a05..7831c16 100644 --- a/BaseUnit.cpp +++ b/BaseUnit.cpp @@ -37,12 +37,26 @@ *********************************************************************/ BaseUnit::BaseUnit(void) : _hp(0), -_bAlive(false), +_alive(false), _x(0), _y(0) { } +/*****************************************************************//** + * + * \brief This function is executed when user wants to create + * a new object derived from BaseUnit, and this function + * sets default parameters for a BaseUnit abstract object. + * + *********************************************************************/ +void BaseUnit::create(const uint16_t x, const uint16_t y) +{ + _alive = true; + _x = x; + _y = y; +} + /*****************************************************************//** * * \brief Periodical handler for BaseUnit class. diff --git a/BaseUnit.h b/BaseUnit.h index 4ce1186..aa9e16a 100644 --- a/BaseUnit.h +++ b/BaseUnit.h @@ -33,12 +33,13 @@ class BaseUnit public: explicit BaseUnit(); void handler(void); + void create(const uint16_t x, const uint16_t y); protected: uint16_t _hp; /**< Health points. */ - bool _bAlive; /**< Alive flag. */ - uint8_t _x; /**< X coordinate inside map. */ - uint8_t _y; /**< Y coordinate inside map. */ + bool _alive; /**< Alive flag. */ + uint16_t _x; /**< X coordinate inside map. */ + uint16_t _y; /**< Y coordinate inside map. */ }; #endif /* BASEUNIT_H__ */ diff --git a/Camera.cpp b/Camera.cpp index 6f0fd53..3992863 100644 --- a/Camera.cpp +++ b/Camera.cpp @@ -9,7 +9,9 @@ * Defines * ******************************************************************/ +#define MAX_CAMERA_SPEED ((int8_t)3) #define SPEED_CALCULATION_TIME ((uint8_t)3) +#define CAMERA_ACCELERATION ((int8_t)1) /* ******************************************************************* * Types definition @@ -42,30 +44,85 @@ Camera::Camera(void) : _yOffset(0), _xSpeed(0), _ySpeed(0), - _speedTimer(SPEED_CALCULATION_TIME) + _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 the coordinates for a given + * \brief This function transforms X coordinates for a given * object to camera coordinates. * *********************************************************************/ -void Camera::getCoordinates(int16_t* const x, int16_t* const y) +uint8_t Camera::getX(const uint8_t x) const { - *x += _xOffset; - *y += _yOffset; + 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 button. + * left arrow button. * *********************************************************************/ void Camera::onLeftBtnPressed(void) { + if (_xSpeed < 0) + { + _xSpeed += CAMERA_ACCELERATION << 1; + } + else if (_xSpeed < MAX_CAMERA_SPEED) + { + _xSpeed += CAMERA_ACCELERATION; + } } /*****************************************************************//** @@ -76,4 +133,48 @@ void Camera::onLeftBtnPressed(void) *********************************************************************/ 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; + } } diff --git a/Camera.h b/Camera.h index ff18894..d9d02f0 100644 --- a/Camera.h +++ b/Camera.h @@ -23,15 +23,19 @@ class Camera { public: Camera(void); + void handler(void); void setLock(const bool bLock) { _bLocked = bLock; } - void getCoordinates(int16_t* const x, int16_t* const y); + uint8_t getX(const uint8_t x) const; + uint8_t getY(const uint8_t y) const; /* Event handlers. */ void onLeftBtnPressed(void); void onRightBtnPressed(void); + void onUpBtnPressed(void); + void onDownBtnPressed(void); private: bool _bLocked; diff --git a/Exe/POCKET.ELF b/Exe/POCKET.ELF index 0dfa63e1a771ffa1ad0a0a92f8ba7718d84975a1..ed9a87764c907e27ac5ef45cd7606b6b2579b599 100755 GIT binary patch delta 10328 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 Lv2?iC3d8&l6?>!x delta 9478 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 rekSR{> 1) - 4, - (Y_SCREEN_RESOLUTION >> 1) - 4); -#endif /* 0 */ - do { /* Calculate next frame. */ @@ -100,6 +91,10 @@ static void GameNextFrame(const struct tGameConfig& sGameConfig) pHumanPlayerData->handler(); } } + + /* Update camera position according + * to button pressed events. */ + sGameConfig.cam.handler(); } /*****************************************************************//** diff --git a/Game.h b/Game.h index 2f9760e..265158d 100644 --- a/Game.h +++ b/Game.h @@ -20,6 +20,7 @@ struct tGameConfig { HumanPlayer* pHumanPlayerData; uint8_t u8NHumanPlayers; + Camera& cam; }; /* ******************************************************************* diff --git a/HumanPlayer.cpp b/HumanPlayer.cpp index ae16f97..e83d4e6 100644 --- a/HumanPlayer.cpp +++ b/HumanPlayer.cpp @@ -36,10 +36,11 @@ * \brief Constructor for HumanPlayer class. * *********************************************************************/ -HumanPlayer::HumanPlayer(const char* const strPlayerName) : -Player(strPlayerName) +HumanPlayer::HumanPlayer(const char* const strPlayerName, const Camera& cam) : +Player(strPlayerName), +_cam(cam) { - _unitsMap[0].create(Unit::UNIT_ID_PEASANT); + _unitsMap[0].create(Unit::UNIT_ID_PEASANT, 16, 16); } /*****************************************************************//** @@ -84,12 +85,12 @@ void HumanPlayer::buttonHandler(void) static void (Camera::*const apBtnCameraHandlerTable[NUM_BTN])(void) = { [BTN_LEFT] = &Camera::onLeftBtnPressed, - [BTN_UP] = NULL, + [BTN_UP] = &Camera::onUpBtnPressed, [BTN_RIGHT] = &Camera::onRightBtnPressed, - [BTN_DOWN] = NULL + [BTN_DOWN] = &Camera::onDownBtnPressed }; - if (gb.buttons.pressed(u8Btn)) + if (gb.buttons.timeHeld(u8Btn) > 0) { /* Key has been pressed. Execute both * HumanPlayer and Camera handlers, if available. */ @@ -113,9 +114,12 @@ void HumanPlayer::buttonHandler(void) if (pCameraBtnHandler != NULL) { - /* Camera member function - * pointer is available. Execute. */ - (_cam.*pCameraBtnHandler)(); + /* Camera member function pointer + * is available. + * Note: "const" qualifier must be + * removed since camera button event + * handler modifies Camera class members. */ + ((Camera&)_cam.*pCameraBtnHandler)(); } else { diff --git a/HumanPlayer.h b/HumanPlayer.h index 5f213c4..8a6e598 100644 --- a/HumanPlayer.h +++ b/HumanPlayer.h @@ -23,11 +23,11 @@ class HumanPlayer : public Player { public: - explicit HumanPlayer(const char* const strPlayerName); + explicit HumanPlayer(const char* const strPlayerName, const Camera& cam); void handler(void); private: - Camera _cam; + const Camera& _cam; void buttonHandler(void); void drawHandler(void); diff --git a/Menu.cpp b/Menu.cpp index 9b19069..25c40aa 100644 --- a/Menu.cpp +++ b/Menu.cpp @@ -6,6 +6,7 @@ #include "HumanPlayer.h" #include "Game.h" #include "System.h" +#include "Sprite.h" #include #include @@ -83,20 +84,26 @@ void MainMenu(void) GAMEBUINO_MAX_PLAYER_NAME = 10 }; + Camera cam; + char strName[GAMEBUINO_MAX_PLAYER_NAME] = {0}; /* Fill strName with default user name. */ gb.getDefaultName(strName); /* Declare 1 human player instance. */ - HumanPlayer h(strName); + HumanPlayer h(strName, cam); const struct tGameConfig c = { .pHumanPlayerData = &h, - .u8NHumanPlayers = 1 + .u8NHumanPlayers = 1, + .cam = cam }; + /* Set global camera for sprites. */ + Sprite::setCamera(&c.cam); + /* Initialize game with defined configuration. */ Game(c); } diff --git a/PocketEmpires.geany b/PocketEmpires.geany index 082a8eb..a777ba3 100644 --- a/PocketEmpires.geany +++ b/PocketEmpires.geany @@ -28,28 +28,28 @@ long_line_behaviour=1 long_line_column=120 [files] -current_page=30 +current_page=13 FILE_NAME_0=0;C++;0;EUTF-8;0;1;0;%2Fhome%2Fxavier%2FPocketEmpires%2Fsrc%2FGfx.cpp;0;4 FILE_NAME_1=0;C++;0;EUTF-8;0;1;0;%2Fhome%2Fxavier%2FPocketEmpires%2Fsrc%2Fmain.cpp;0;4 -FILE_NAME_2=3361;C++;0;EUTF-8;0;1;0;%2Fhome%2Fxavier%2FPocketEmpires%2Fsrc%2FMenu.cpp;0;4 +FILE_NAME_2=3160;C++;0;EUTF-8;0;1;0;%2Fhome%2Fxavier%2FPocketEmpires%2Fsrc%2FMenu.cpp;0;4 FILE_NAME_3=317;C++;0;EUTF-8;0;1;0;%2Fhome%2Fxavier%2FPocketEmpires%2Fsrc%2FPad.cpp;0;4 -FILE_NAME_4=772;C++;0;EUTF-8;0;1;0;%2Fhome%2Fxavier%2FPocketEmpires%2Fsrc%2FCamera.h;0;4 +FILE_NAME_4=663;C++;0;EUTF-8;0;1;0;%2Fhome%2Fxavier%2FPocketEmpires%2Fsrc%2FCamera.h;0;4 FILE_NAME_5=665;C++;0;EUTF-8;0;1;0;%2Fhome%2Fxavier%2FPocketEmpires%2Fsrc%2FGfx.h;0;4 FILE_NAME_6=314;C++;0;EUTF-8;0;1;0;%2Fhome%2Fxavier%2FPocketEmpires%2Fsrc%2FGlobal_Inc.h;0;4 FILE_NAME_7=299;C++;0;EUTF-8;0;1;0;%2Fhome%2Fxavier%2FPocketEmpires%2Fsrc%2FMenu.h;0;4 FILE_NAME_8=611;C++;0;EUTF-8;0;1;0;%2Fhome%2Fxavier%2FPocketEmpires%2Fsrc%2FPad.h;0;4 -FILE_NAME_9=728;C++;0;EUTF-8;0;1;0;%2Fhome%2Fxavier%2FPocketEmpires%2Fsrc%2FPlayer.h;0;4 -FILE_NAME_10=543;Make;0;EUTF-8;1;1;0;%2Fhome%2Fxavier%2FPocketEmpires%2Fsrc%2FMakefile;0;4 -FILE_NAME_11=0;C++;0;EUTF-8;0;1;0;%2Fhome%2Fxavier%2FPocketEmpires%2Fsrc%2FSystem.cpp;0;4 -FILE_NAME_12=875;C++;0;EUTF-8;0;1;0;%2Fhome%2Fxavier%2FPocketEmpires%2Fsrc%2FHumanPlayer.h;0;4 -FILE_NAME_13=4115;C++;0;EUTF-8;0;1;0;%2Fhome%2Fxavier%2FPocketEmpires%2Fsrc%2FHumanPlayer.cpp;0;4 -FILE_NAME_14=1662;C++;0;EUTF-8;0;1;0;%2Fhome%2Fxavier%2FPocketEmpires%2Fsrc%2FPlayer.cpp;0;4 -FILE_NAME_15=3287;C++;0;EUTF-8;0;1;0;%2Fhome%2Fxavier%2FPocketEmpires%2Fsrc%2FGame.cpp;0;4 -FILE_NAME_16=1226;C++;0;EUTF-8;0;1;0;%2Fhome%2Fxavier%2FPocketEmpires%2Fsrc%2FGame.h;0;4 -FILE_NAME_17=1965;C++;0;EUTF-8;0;1;0;%2Fhome%2Fxavier%2FPocketEmpires%2Fsrc%2FCamera.cpp;0;4 +FILE_NAME_9=1191;C++;0;EUTF-8;0;1;0;%2Fhome%2Fxavier%2FPocketEmpires%2Fsrc%2FPlayer.h;0;4 +FILE_NAME_10=412;Make;0;EUTF-8;1;1;0;%2Fhome%2Fxavier%2FPocketEmpires%2Fsrc%2FMakefile;0;4 +FILE_NAME_11=2168;C++;0;EUTF-8;0;1;0;%2Fhome%2Fxavier%2FPocketEmpires%2Fsrc%2FSystem.cpp;0;4 +FILE_NAME_12=731;C++;0;EUTF-8;0;1;0;%2Fhome%2Fxavier%2FPocketEmpires%2Fsrc%2FHumanPlayer.h;0;4 +FILE_NAME_13=4068;C++;0;EUTF-8;0;1;0;%2Fhome%2Fxavier%2FPocketEmpires%2Fsrc%2FHumanPlayer.cpp;0;4 +FILE_NAME_14=1460;C++;0;EUTF-8;0;1;0;%2Fhome%2Fxavier%2FPocketEmpires%2Fsrc%2FPlayer.cpp;0;4 +FILE_NAME_15=2083;C++;0;EUTF-8;0;1;0;%2Fhome%2Fxavier%2FPocketEmpires%2Fsrc%2FGame.cpp;0;4 +FILE_NAME_16=571;C++;0;EUTF-8;0;1;0;%2Fhome%2Fxavier%2FPocketEmpires%2Fsrc%2FGame.h;0;4 +FILE_NAME_17=2241;C++;0;EUTF-8;0;1;0;%2Fhome%2Fxavier%2FPocketEmpires%2Fsrc%2FCamera.cpp;0;4 FILE_NAME_18=1377;C;0;EUTF-8;0;1;0;%2Fhome%2Fxavier%2FPocketEmpires%2Fsrc%2FCameraOld.c;0;4 -FILE_NAME_19=586;C++;0;EUTF-8;0;1;0;%2Fhome%2Fxavier%2FPocketEmpires%2Fsrc%2FSprite.h;0;4 -FILE_NAME_20=0;C++;0;EUTF-8;0;1;0;%2Fhome%2Fxavier%2FPocketEmpires%2Fsrc%2FSprite.cpp;0;4 +FILE_NAME_19=768;C++;0;EUTF-8;0;1;0;%2Fhome%2Fxavier%2FPocketEmpires%2Fsrc%2FSprite.h;0;4 +FILE_NAME_20=2844;C++;0;EUTF-8;0;1;0;%2Fhome%2Fxavier%2FPocketEmpires%2Fsrc%2FSprite.cpp;0;4 FILE_NAME_21=818;C++;0;EUTF-8;0;1;0;%2Fhome%2Fxavier%2FPocketEmpires%2Fsrc%2FSystem.h;0;4 FILE_NAME_22=5650;C++;0;EUTF-8;0;1;0;%2Fhome%2Fxavier%2FPocketEmpires%2Fsrc%2FLibs%2Flibgamebuino%2FDisplay.h;0;4 FILE_NAME_23=14993;C++;0;EUTF-8;0;1;0;%2Fhome%2Fxavier%2FPocketEmpires%2Fsrc%2FLibs%2Flibgamebuino%2FGamebuino.cpp;0;4 @@ -57,9 +57,17 @@ FILE_NAME_24=0;C++;0;EUTF-8;0;1;0;%2Fhome%2Fxavier%2FPocketEmpires%2Fsrc%2FLibs% FILE_NAME_25=833;C++;0;EUTF-8;0;1;0;%2Fhome%2Fxavier%2FPocketEmpires%2Fsrc%2FLibs%2Flibgamebuino%2FButtons.cpp;0;4 FILE_NAME_26=0;C++;0;EUTF-8;0;1;0;%2Fhome%2Fxavier%2FPocketEmpires%2Fsrc%2FLibs%2Flibgamebuino%2FButtons.h;0;4 FILE_NAME_27=3441;C;0;EUTF-8;0;1;0;%2Fhome%2Fxavier%2FPocketEmpires%2Fsrc%2FLibs%2Flibgamebuino%2Fsettings.c;0;4 -FILE_NAME_28=22712;C++;0;EUTF-8;0;1;0;%2Fhome%2Fxavier%2FPocketEmpires%2Fsrc%2FLibs%2Flibgamebuino%2FDisplay.cpp;0;4 -FILE_NAME_29=1190;C++;0;EUTF-8;0;1;0;%2Fhome%2Fxavier%2FPocketEmpires%2Fsrc%2FBaseUnit.cpp;0;4 -FILE_NAME_30=1233;C++;0;EUTF-8;0;1;0;%2Fhome%2Fxavier%2FPocketEmpires%2Fsrc%2FBaseUnit.h;0;4 +FILE_NAME_28=19868;C++;0;EUTF-8;0;1;0;%2Fhome%2Fxavier%2FPocketEmpires%2Fsrc%2FLibs%2Flibgamebuino%2FDisplay.cpp;0;4 +FILE_NAME_29=1853;C++;0;EUTF-8;0;1;0;%2Fhome%2Fxavier%2FPocketEmpires%2Fsrc%2FBaseUnit.cpp;0;4 +FILE_NAME_30=1182;C++;0;EUTF-8;0;1;0;%2Fhome%2Fxavier%2FPocketEmpires%2Fsrc%2FBaseUnit.h;0;4 +FILE_NAME_31=1373;C++;0;EUTF-8;0;1;0;%2Fhome%2Fxavier%2FPocketEmpires%2Fsrc%2FUnit.h;0;4 +FILE_NAME_32=2363;C++;0;EUTF-8;0;1;0;%2Fhome%2Fxavier%2FPocketEmpires%2Fsrc%2FUnit.cpp;0;4 +FILE_NAME_33=0;None;0;EUTF-8;0;1;0;%2Fhome%2Fxavier%2FPocketEmpires%2Fsrc%2FBarracksSpr.i;0;4 +FILE_NAME_34=937;None;0;EUTF-8;0;1;0;%2Fhome%2Fxavier%2FPocketEmpires%2Fsrc%2FMouseSpr.i;0;4 +FILE_NAME_35=225;None;0;EUTF-8;0;1;0;%2Fhome%2Fxavier%2FPocketEmpires%2Fsrc%2FPeasantSpr.i;0;4 +FILE_NAME_36=0;None;0;EUTF-8;0;1;0;%2Fhome%2Fxavier%2FPocketEmpires%2Fsrc%2FSoldierSpr.i;0;4 +FILE_NAME_37=0;None;0;EUTF-8;0;1;0;%2Fhome%2Fxavier%2FPocketEmpires%2Fsrc%2FTowerSpr.i;0;4 +FILE_NAME_38=0;None;0;EUTF-8;0;1;0;%2Fhome%2Fxavier%2FPocketEmpires%2Fsrc%2FTownCentre.i;0;4 [VTE] last_dir=/home/xavier/PocketEmpires/src diff --git a/Sprite.cpp b/Sprite.cpp index d948652..131a4f1 100644 --- a/Sprite.cpp +++ b/Sprite.cpp @@ -17,6 +17,8 @@ * Global variables definition * ******************************************************************/ +const Camera* _cam; + /* ******************************************************************* * Local variables definition * ******************************************************************/ @@ -36,6 +38,9 @@ * \param pu8SprData * Pointer to raw sprite data. * + * \param _followCam + * Sprite is moved by camera. Default value is true. + * * \param u8Colour * Sprite colour. Default value is BLACK. * @@ -43,8 +48,9 @@ * Sprite rotation. Default value is NOROT. * *********************************************************************/ -Sprite::Sprite(const uint8_t& pu8SprData, const uint8_t u8Colour, const uint8_t rotation) : +Sprite::Sprite(const uint8_t* pu8SprData, const bool followCam, const uint8_t u8Colour, const uint8_t rotation) : _pu8SprData(pu8SprData), +_followCam(followCam), _colour(u8Colour), _rotation(rotation), _x(0), @@ -73,6 +79,17 @@ void Sprite::setPos(const uint8_t x, const uint8_t y) void Sprite::draw(void) { - gb.display.setColor(_colour); - gb.display.drawBitmap(_x, _y, (const uint8_t*)&_pu8SprData); + gb.display.setColor(_colour, WHITE); + + if (_cam != NULL) + { + const uint8_t x = _followCam ? _cam->getX(_x) : _x; + const uint8_t y = _followCam ? _cam->getY(_y) : _y; + + gb.display.drawBitmap(x, y, _pu8SprData); + } + else + { + /* Error: uninitialized camera. */ + } } diff --git a/Sprite.h b/Sprite.h index c365735..afe9db1 100644 --- a/Sprite.h +++ b/Sprite.h @@ -1,34 +1,53 @@ #ifndef SPRITE_H__ #define SPRITE_H__ -/* ************************************* +/* ******************************************************************* * Includes - * *************************************/ + * ******************************************************************/ +#include "Camera.h" #include #include -/* ************************************* +/* ******************************************************************* * Defines - * *************************************/ + * ******************************************************************/ -/* ************************************* - * Structs and enums - * *************************************/ +/* ******************************************************************* + * Global types definition + * ******************************************************************/ -/* ************************************* +/* ******************************************************************* + * Global variables declaration + * ******************************************************************/ + +extern const Camera* _cam; + +/* ******************************************************************* + * Global functions declaration + * ******************************************************************/ + +/* ******************************************************************* * Class definition - * *************************************/ + * ******************************************************************/ class Sprite { public: - Sprite(const uint8_t& pu8SprData, const uint8_t u8Colour = BLACK, const uint8_t rotation = NOFLIP); + Sprite( const uint8_t* pu8SprData, + const bool followCam = true, + const uint8_t u8Colour = BLACK, + const uint8_t rotation = NOFLIP); void setPos(const uint8_t x, const uint8_t y); void draw(void); + static void setCamera(const Camera* const cam) + { + _cam = cam; + }; private: - const uint8_t& _pu8SprData; + const uint8_t* _pu8SprData; + const bool _followCam; uint8_t _colour; uint8_t _rotation; uint8_t _x; diff --git a/Unit.cpp b/Unit.cpp index 38535e7..a8a5988 100644 --- a/Unit.cpp +++ b/Unit.cpp @@ -25,6 +25,25 @@ * Local variables definition * ******************************************************************/ +/*****************************************************************//** + * + * \brief Bitmap data for idle UNIT_ID_PEASANT. + * + *********************************************************************/ +static const PROGMEM uint8_t au8PeasantSprData[] = +{ + 8, + 8, + 0x00, + 0x3C, + 0x42, + 0x99, + 0xA5, + 0x66, + 0x18, + 0x00 +}; + /* ******************************************************************* * Local prototypes declaration * ******************************************************************/ @@ -44,9 +63,31 @@ _eUnitID(eUnitID) { } -void Unit::create(const enum Unit::tUnitID eUnitID) +/*****************************************************************//** + * + * \brief Creates a Unit instance by setting default parameters + * and X/Y coordinates. + * + *********************************************************************/ +void Unit::create(const enum Unit::tUnitID eUnitID, const uint16_t x, const uint16_t y) { + /* Execute base class function first. */ + BaseUnit::create(x, y); + + /* Assign new ID to selected Unit. */ _eUnitID = eUnitID; + + /* This table relates all available + * unit IDs against a bitmap data table. */ + const uint8_t au8HpData[MAX_UNIT_ID] PROGMEM = + { + [UNIT_ID_NONE] = 0, + [UNIT_ID_PEASANT] = 25, + [UNIT_ID_SWORDMAN] = 35 + }; + + /* Assign health according to unit ID. */ + _hp = au8HpData[eUnitID]; } /*****************************************************************//** @@ -62,36 +103,31 @@ void Unit::handler(void) drawHandler(); } +/*****************************************************************//** + * + * \brief This function checks whether unit is inside screen + * boundaries and draws its associated bitmap. + * + *********************************************************************/ void Unit::drawHandler(void) { if (_eUnitID < MAX_UNIT_ID) { - static const uint8_t au8PeasantSprData[] = - { - 8, - 8, - 0x00, - 0x3C, - 0x42, - 0x99, - 0xA5, - 0x66, - 0x18, - 0x00 - }; - - static const uint8_t* const apu8UnitSpriteDataTable[MAX_UNIT_ID] = + /* This table relates all available + * unit IDs against a bitmap data table. */ + const uint8_t* const apu8UnitSpriteDataTable[MAX_UNIT_ID] PROGMEM = { [UNIT_ID_NONE] = NULL, [UNIT_ID_PEASANT] = au8PeasantSprData, [UNIT_ID_SWORDMAN] = NULL }; + /* Point to appropiate bitmap data given unit ID. */ const uint8_t* const pu8UnitSpriteData = apu8UnitSpriteDataTable[_eUnitID]; - Sprite spr(*pu8UnitSpriteData); + Sprite spr(pu8UnitSpriteData); - spr.setPos(16, 16); + spr.setPos(_x, _y); spr.draw(); } diff --git a/Unit.h b/Unit.h index 960154a..7a5f59f 100644 --- a/Unit.h +++ b/Unit.h @@ -42,7 +42,7 @@ class Unit : public BaseUnit }; explicit Unit(const Unit::tUnitID eUnitID = UNIT_ID_NONE); - void create(const enum Unit::tUnitID eUnitID); + void create(const enum Unit::tUnitID eUnitID, const uint16_t x, const uint16_t y); void handler(void); private: