Advertisement
NachoMan

Task

Jul 4th, 2012
123
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.05 KB | None | 0 0
  1. // task.h
  2.  
  3. #ifndef task_h__
  4. #define task_h__
  5.  
  6. namespace Evanescent
  7. {
  8.     class Unit;
  9.     /*!
  10.     * @class AbstractTask
  11.     *
  12.     * @brief Abstrakte Basisklasse für Aufgaben.
  13.     *
  14.     * @author NachoMan
  15.     */
  16.     class AbstractTask
  17.     {
  18.         void doCopy(const AbstractTask& rhs);
  19.         size_t currentTask_;
  20.         bool hasSubTasksCompleted_;
  21.     protected:
  22.         std::vector<std::unique_ptr<AbstractTask> > subTasks_;
  23.  
  24.         AbstractTask();
  25.         AbstractTask(const AbstractTask& rhs);
  26.         const AbstractTask& operator=(const AbstractTask& rhs);
  27.  
  28.     public:
  29.         virtual ~AbstractTask();
  30.         /**
  31.         * @brief Ruft myUpdate der subTasks in richtiger Reihenfolge auf
  32.         */
  33.         void update(Unit& unit, const float frametime);
  34.        
  35.         /**
  36.         * @brief setzt hasSubTasksCompleted_ zurück
  37.         */
  38.         void restart();
  39.  
  40.         void addTask(AbstractTask *task);
  41.  
  42.         /**
  43.         * @brief Update für die Unit.
  44.         */
  45.         virtual void myUpdate(Unit& unit, const float frametime) = 0;
  46.  
  47.         bool isCompleted();
  48.         virtual bool shouldBeDestroyedIfComplete() = 0;
  49.  
  50.         virtual AbstractTask* getCopy() = 0;
  51.  
  52.     private:
  53.         virtual bool myIsCompleted() = 0;
  54.     };
  55.  
  56.     /*!
  57.     * @class IdleTask
  58.     *
  59.     * @brief Unit macht nichts.
  60.     *
  61.     * @author NachoMan
  62.     */
  63.     class IdleTask : public AbstractTask
  64.     {
  65.     public:
  66.         virtual void myUpdate(Unit& unit, const float frametime)
  67.         {
  68.         }
  69.  
  70.         virtual bool shouldBeDestroyedIfComplete(){return false;}
  71.  
  72.         virtual AbstractTask* getCopy(){return new IdleTask(*this);}
  73.  
  74.     private:
  75.         virtual bool myIsCompleted(){return true;}
  76.     };
  77.    
  78.     /*!
  79.     * @class MoveTask
  80.     *
  81.     * @brief Unit bewegt sich zum übergebenen Punkt.
  82.     *
  83.     * @author NachoMan
  84.     */
  85.     class MoveTask : public AbstractTask
  86.     {
  87.         sf::Vector2f targetPosition_;
  88.         bool completed_;
  89.     public:
  90.  
  91.         MoveTask(const sf::Vector2f& targetPosition);
  92.  
  93.         virtual void myUpdate(Unit& unit, const float frametime);
  94.  
  95.         virtual bool shouldBeDestroyedIfComplete();
  96.  
  97.         virtual AbstractTask* getCopy(){return new MoveTask(*this);}
  98.  
  99.     private:
  100.         virtual bool myIsCompleted();
  101.     };
  102. }
  103.  
  104. #endif // task_h__
  105.  
  106. // .cpp
  107.  
  108. #include "task.h"
  109. #include "unit.h"
  110. #include "util.h"
  111.  
  112. namespace Evanescent
  113. {
  114.  
  115. void AbstractTask::doCopy( const AbstractTask& rhs )
  116. {
  117.     currentTask_ = rhs.currentTask_;
  118.     subTasks_.clear();
  119.     subTasks_.reserve(rhs.subTasks_.size());
  120.     std::vector<std::unique_ptr<AbstractTask> >::const_iterator endIt(rhs.subTasks_.end());
  121.     for(std::vector<std::unique_ptr<AbstractTask> >::const_iterator it(rhs.subTasks_.begin()); it != endIt; ++it)
  122.     {
  123.         subTasks_.push_back(std::unique_ptr<AbstractTask>((*it)->getCopy()));
  124.     }
  125. }
  126.  
  127. AbstractTask::AbstractTask()
  128.     :currentTask_(0),
  129.     subTasks_(),
  130.     hasSubTasksCompleted_(true)
  131. {
  132. }
  133.  
  134. AbstractTask::AbstractTask( const AbstractTask& rhs )
  135. {
  136.     doCopy(rhs);
  137. }
  138.  
  139. const AbstractTask& AbstractTask::operator=( const AbstractTask& rhs )
  140. {
  141.     doCopy(rhs);
  142.     return *this;
  143. }
  144.  
  145. AbstractTask::~AbstractTask()
  146. {
  147. }
  148.  
  149. void AbstractTask::update( Unit& unit, const float frametime )
  150. {
  151.     if(!hasSubTasksCompleted_ && !subTasks_.empty())
  152.     {
  153.         if(subTasks_.size() <= currentTask_)
  154.         {
  155.             currentTask_ = 0;
  156.             hasSubTasksCompleted_ = true;
  157.         }
  158.         else
  159.         {
  160.             std::vector<std::unique_ptr<AbstractTask> >::iterator task(subTasks_.begin()+currentTask_);
  161.             while((*task)->isCompleted())
  162.             {
  163.                 if(subTasks_.size() <= ++currentTask_)
  164.                 {
  165.                     currentTask_ = 0;
  166.                     hasSubTasksCompleted_ = true;
  167.                     return;
  168.                 }
  169.                 task = subTasks_.begin()+currentTask_;
  170.             }
  171.             (*task)->update(unit, frametime);
  172.             if((*task)->isCompleted())
  173.             {
  174.                 if((*task)->shouldBeDestroyedIfComplete())
  175.                 {
  176.                     task = subTasks_.erase(task);
  177.                 }
  178.                 else
  179.                 {
  180.                     ++currentTask_;
  181.                 }
  182.             }
  183.         }
  184.     }
  185.     else
  186.     {
  187.         myUpdate(unit, frametime);
  188.     }
  189. }
  190.  
  191. void AbstractTask::restart()
  192. {
  193.     hasSubTasksCompleted_ = false;
  194.     std::vector<std::unique_ptr<AbstractTask> >::iterator endIt(subTasks_.end());
  195.     for(std::vector<std::unique_ptr<AbstractTask> >::iterator it(subTasks_.begin()); it != endIt; ++it)
  196.     {
  197.         (*it)->restart();
  198.     }
  199. }
  200.  
  201. void AbstractTask::addTask( AbstractTask *task )
  202. {
  203.     subTasks_.push_back(std::unique_ptr<AbstractTask>(task));
  204.     hasSubTasksCompleted_ = false;
  205. }
  206.  
  207. bool AbstractTask::isCompleted()
  208. {
  209.     return hasSubTasksCompleted_ && myIsCompleted();
  210. }
  211.  
  212. MoveTask::MoveTask(const sf::Vector2f& target)
  213.     :targetPosition_(target),
  214.     completed_(false)
  215. {
  216. }
  217.  
  218. void MoveTask::myUpdate( Unit& unit, const float frametime )
  219. {
  220.     sf::Vector2f moveVector;
  221.     {
  222.         sf::Lock lock(unit.mutex_);
  223.         moveVector.x = targetPosition_.x-(unit.rect_.left+unit.rect_.width/2.f);
  224.         moveVector.y = targetPosition_.y-(unit.rect_.top+unit.rect_.height/2.f);
  225.     }
  226.     float squaredLength = calcSquaredLength(moveVector);
  227.     if(squaredLength > 4.0f && squaredLength > unit.speed_*frametime*unit.speed_*frametime)
  228.     {
  229.         float distance = std::sqrt(squaredLength);
  230.         unit.rect_.left += moveVector.x/distance*unit.speed_*frametime;
  231.         unit.rect_.top += moveVector.y/distance*unit.speed_*frametime;
  232.     }
  233.     else
  234.     {
  235.         completed_ = true;
  236.     }
  237. }
  238.  
  239. bool MoveTask::shouldBeDestroyedIfComplete()
  240. {
  241.     return true;
  242. }
  243.  
  244. bool MoveTask::myIsCompleted()
  245. {
  246.     return completed_;
  247. }
  248.  
  249. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement