#include "Tank.hpp" Tank::Tank(float x, float y, enum direction dir, int animationstep) : Enemy(3,x,y,dir,animationstep) { } int Tank::getScore() { return 500; } static StaticPixelBuffer<13,11> constexpr front[2] = { {{{ {" 1 "}, {" 1 "}, {" 22222 "}, {" 2223222 "}, {" 122222221 "}, {" 151155115 "}, {" 15151115511 "}, {"2222255522222"}, {"2225115151222"}, {"1111515155111"}, {"222 222"} }}}, {{{ {" 1 "}, {" 1 "}, {" 22222 "}, {" 2223222 "}, {" 122222221 "}, {" 151155115 "}, {" 15151115511 "}, {"2222255522222"}, {"1115115151111"}, {"2221515155222"}, {"111 111"} }}} }; static StaticPixelBuffer<13,11> constexpr back[2] = { {{{ {" 1 "}, {" 1 "}, {" 22222 "}, {" 2222222 "}, {" 112222211 "}, {" 151155115 "}, {" 15151115511 "}, {"2222255522222"}, {"2225115151222"}, {"1111515155111"}, {"222 222"} }}}, {{{ {" 1 "}, {" 1 "}, {" 22222 "}, {" 2222222 "}, {" 112222211 "}, {" 151155115 "}, {" 15151115511 "}, {"2222255522222"}, {"1115115151111"}, {"2221515155222"}, {"111 111"} }}} }; static StaticPixelBuffer<17,11> constexpr right[2] = { {{{ {" 1 "}, {" 1 "}, {" 22222 "}, {" 222222222223"}, {" 15111511511 "}, {"1515551515551151 "}, {"55511155511555151"}, {"22222222222222222"}, {"10101010101010101"}, {"01010101010101010"}, {" 010101010101010 "} }}}, {{{ {" 1 "}, {" 1 "}, {" 22222 "}, {" 222222222223"}, {" 15111511511 "}, {"1515551515551151 "}, {"55511155511555151"}, {"22222222222222222"}, {"01010101010101010"}, {"01010101010101010"}, {" 101010101010101 "} }}} }; static StaticPixelBuffer<17,11> constexpr left[2] = { {{{ {" 1 "}, {" 1 "}, {" 22222 "}, {"322222222222 "}, {" 11115511151 "}, {" 1155515115155151"}, {"15511155511111555"}, {"22222222222222222"}, {"10101010101010101"}, {"01010101010101010"}, {" 010101010101010 "} }}}, {{{ {" 1 "}, {" 1 "}, {" 22222 "}, {"322222222222 "}, {" 11115511151 "}, {" 1155515115155151"}, {"15511155511111555"}, {"22222222222222222"}, {"01010101010101010"}, {"01010101010101010"}, {" 101010101010101 "} }}} }; const PixelBuffer& Tank::getSprite() { switch (dir) { case direction::BACK: return back[animationstep]; break; case direction::LEFT: return left[animationstep]; break; case direction::RIGHT: return right[animationstep]; break; default: return front[animationstep]; } }; /*void Tank::shoot() { //TODO how do Projectile? };*/ void Tank::changeDirection() { dir=direction(rand()%4); }; bool Tank::checkmove(FloatSeconds const & Frametime, Level &level) { switch (this->dir) { case direction::BACK: //down if(!level.checkCollision(this->topleft.X, this->topleft.Y - 3*Frametime.count(), this->getSprite().w(), this->getSprite().h())) {this->topleft.Y -= 3*Frametime.count(); return false;} else return true; break; case direction::LEFT: if(!level.checkCollision(this->topleft.X - 3*Frametime.count(), this->topleft.Y, this->getSprite().w(), this->getSprite().h())) {this->topleft.X -= 3*Frametime.count(); return false;} else return true; break; case direction::RIGHT: if(!level.checkCollision(this->topleft.X + 3*Frametime.count(),this->topleft.Y, this->getSprite().w(), this->getSprite().h())) {this->topleft.X += 3*Frametime.count(); return false;} else return true; break; default: if(!level.checkCollision(this->topleft.X, this->topleft.Y + 3*Frametime.count(), this->getSprite().w(), this->getSprite().h())) {this->topleft.Y += 3*Frametime.count(); return false;} else return true; break; } }; void Tank::move(FloatSeconds const & Frametime, Level &level) { if(animationtimer>3*Frametime.count()) { animationstep = 1-animationstep; animationtimer = 0; } else { animationtimer += Frametime.count(); } if(checkmove(Frametime, level)) //Also moved when false; { changeDirection(); } }; void Tank::turnToPlayer(float PlayerX, float PlayerY) { if(abs(this->topleft.X - PlayerX) < 5) //buffer of 5 { if(this->topleft.Y > PlayerY) { dir=direction::FRONT; //up } else { dir=direction::BACK; //down } } else { if(this->topleft.X > PlayerX) { dir=direction::RIGHT; } else { dir=direction::LEFT; } } }; void Tank::doStep(float PlayerX, float PlayerY, FloatSeconds const & Frametime, Level &level) //Pathfinding easier with full level, not used currently. { timetillreload -= Frametime.count(); if(playerdetected(PlayerX,PlayerY, level)) { //Look into each direction, if true turns and shoot! shoot(level); } else { move(Frametime, level); } };