#include #include #include #include #include #include #include #define POPULATION_LIMIT 20 #define PEASANT_HEALTH 25 Gamebuino gb; unsigned long int global_timer; class Unit { public: Unit(); ~Unit(); inline short GetX(void){return _x;} inline short GetY(void){return _y;} inline const byte * GetSprite(void){return _sprite;} protected: unsigned char _health; unsigned char _team; unsigned char _strength; unsigned char _armor; bool _walking; bool _direction; short _x; short _y; const byte * _sprite; }; class Peasant: public Unit { public: Peasant(short x, short y); ~Peasant(); private: }; class Team { public: Team(unsigned char number); ~Team(); void IncreasePopulation(void); inline bool LimitReached(void){return _limit_reached;} template T *createUnit(short x, short y); inline int GetPopulation(void){return _unitArrayIterator;} Unit * GetUnit(int i){return _unitArray[i];} private: Unit * _unitArray[POPULATION_LIMIT]; unsigned char _team_number; int _unitArrayIterator; bool _limit_reached; }; const byte BarracksSpr[] PROGMEM = {24,24, 0xE7,0x0,0xE7, 0xBD,0x0,0xBD, 0xE7,0xFF,0xE7, 0xBD,0x0,0xBD, 0x81,0xFF,0x81, 0xE7,0x0,0xE7, 0xA5,0x0,0xA5, 0xBD,0xFF,0xBD, 0xA5,0x0,0xA5, 0xA5,0x0,0xA5, 0xA5,0x0,0xA5, 0xA5,0x0,0xA5, 0xA5,0x0,0xA5, 0xA5,0x0,0xA5, 0xA5,0x0,0xA5, 0xA5,0x0,0xA5, 0xE7,0x0,0xE7, 0xBD,0x0,0xBD, 0xE7,0xFF,0xE7, 0xBD,0x0,0xBD, 0x81,0xFF,0x81, 0x81,0x18,0x81, 0x81,0x24,0x81, 0xFF,0xFF,0xFF, }; const byte BarracksShadowSpr[] PROGMEM = {24,24, 0x0,0x0,0x0, 0x0,0x0,0xFE, 0xFE,0x0,0xFE, 0xFE,0x0,0x3E, 0x3E,0x0,0xFE, 0xFE,0x0,0xFE, 0xFE,0x0,0x1E, 0x1E,0x0,0x1E, 0x1E,0x0,0x1E, 0x1E,0x0,0x1E, 0x1E,0x0,0x1E, 0x1E,0x0,0x1E, 0x1E,0x0,0x1E, 0x1E,0x0,0x1E, 0x1E,0x0,0x1E, 0x1E,0x0,0x1E, 0x1E,0x0,0x1E, 0x1E,0x0,0x1E, 0x1E,0x0,0xFE, 0xFE,0x0,0xFE, 0xFE,0x0,0x3E, 0x3E,0x0,0xFE, 0xFE,0x0,0xFE, 0xFE,0x0,0xFE, }; const byte TowerSpr[] PROGMEM = {16,32, 0xF,0xF0, 0x8,0x10, 0x8,0x10, 0xF,0xF0, 0x8,0x10, 0x8,0x10, 0x8,0x10, 0x8,0x10, 0x1B,0xD8, 0x2A,0x54, 0x4A,0x52, 0xFB,0xDF, 0x8,0x10, 0x8,0x10, 0x8,0x10, 0x9,0x90, 0x9,0x90, 0x8,0x10, 0x8,0x10, 0x8,0x10, 0x8,0x10, 0x9,0x90, 0x9,0x90, 0x8,0x10, 0x8,0x10, 0x8,0x10, 0x8,0x10, 0x8,0x10, 0xB,0xD0, 0xA,0x50, 0xA,0x50, 0xF,0xF0, }; const byte Peasant_UpDownSpr[] PROGMEM = {8,6, 0x3C, 0x42, 0x99, 0xA5, 0x66, 0x18, }; const byte Peasant_Walking_UpDownSpr[] PROGMEM = {8,8, 0x2, 0x1D, 0x67, 0xA5, 0x99, 0xC2, 0xBC, 0x60, }; const byte Peasant_LeftRightSpr[] PROGMEM = {8,8, 0x30, 0x48, 0x64, 0x94, 0x94, 0x64, 0x48, 0x30, }; Team::Team(unsigned char number) { _team_number = number; _unitArrayIterator = 0; _limit_reached = false; } Team::~Team(void) { } Team Player(0); Unit::Unit(void) { } Unit::~Unit(void) { } void Team::IncreasePopulation(void) { _unitArrayIterator++; if(_unitArrayIterator >= POPULATION_LIMIT) { _limit_reached = true; } } template T* Team::createUnit(short x, short y) { T* ptr = new T(x,y); _unitArray[_unitArrayIterator] = ptr; IncreasePopulation(); return ptr; } Peasant::Peasant(short x, short y) { _health = PEASANT_HEALTH; _armor = 0; _x = x; _y = y; _sprite = Peasant_UpDownSpr; } Peasant::~Peasant(void) { } void setup() { // put your setup code here, to run once: gb.begin(); gb.titleScreen(F("Pocket Empires")); global_timer = 0; } void loop() { // put your main code here, to run repeatedly: if(gb.update() ) { /*gb.display.drawBitmap(x,y,bitmap,rotation,flip);*/ gb.display.drawBitmap(7,0,BarracksSpr); gb.display.drawBitmap(32,0,TowerSpr); gb.display.setColor(GRAY, WHITE); gb.display.drawBitmap(0,0,BarracksShadowSpr); gb.display.setColor(BLACK, WHITE); /*if(global_timer & 1) { gb.display.drawBitmap(0,0,BarracksShadowSpr); }*/ if(gb.buttons.pressed(BTN_B) == true) { Player.createUnit(rand() % 20,rand() % 20); } for(int i = 0; i < Player.GetPopulation() ; i++) { gb.display.drawBitmap(Player.GetUnit(i)->GetX(), Player.GetUnit(i)->GetY(),Player.GetUnit(i)->GetSprite() ); } // gb.display.println(F("Hello World!")); global_timer++; } }