Advertisement
Guest User

Untitled

a guest
Jan 30th, 2015
273
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.04 KB | None | 0 0
  1. //Tyler Glaiel, 2015
  2.  
  3. //usage:
  4.  
  5. //create an instance of the Tweens class somewhere.
  6. //I recommend you do this on your gameobject class,
  7. //so when the game object gets destroyed it cancels
  8. //all its tweens with it
  9.  
  10. //to make a tween, do myTweens.doTween(&valueToTween, endgoal, time, curve)
  11.  
  12. //you can chain additional tweens to happen after one tween finishes like so:
  13. //doTween(...) -> then (endgoal, time, curve) -> then(...) -> etc;
  14.  
  15. //a single value can only be tweened by one tween at a time, setting new ones will overwrite old ones
  16.  
  17. //to cancel an in progress tween, do myTweens.cancelTween(&valueToTween)
  18. //cancel tween will not fail if there is no tween on that value,
  19. //it will just do nothing
  20.  
  21. //to update ALL tweens, call myTweens.updateTweens(timestep)
  22.  
  23.  
  24. #pragma once
  25. #include <vector>
  26. #include <cmath>
  27.  
  28. struct TweenCurves {
  29.     static float LINEAR(float t){ return t; }
  30.     static float EASEIN(float t){ return t*t; }
  31.     static float EASEOUT(float t){ return 1.0 - (1.0 - t)*(1.0 - t); }
  32.     static float EASEINOUT(float t){ return 1.0 - (std::cos(t*3.141592) + 1.0)*.5f; }
  33.     //write more curves wherever you want
  34. };
  35.  
  36.  
  37. //internal classes
  38. class TweenData_Base {
  39. public:
  40.     void* _value; //only used to detect multiple tweens of the same data
  41.     virtual void updateTween(float t)=0;
  42.     virtual ~TweenData_Base(){};
  43. };
  44.  
  45. template<typename T, typename F>
  46. class TweenData : public TweenData_Base {
  47. public:
  48.     T begin;
  49.     T end;
  50.  
  51.     T* value;
  52.     F curve;
  53.  
  54.     TweenData(T* value, T begin, T end, F curve) : value(value), begin(begin), end(end), curve(curve) {_value=value;}
  55.  
  56.     virtual void updateTween(float t) {
  57.         double t_adj = curve(t);
  58.         *value = begin*(1.0 - t_adj) + end*t_adj;
  59.     }
  60. };
  61.  
  62. //the main tween class
  63. class Tweens {
  64. private:
  65.     struct SingleTween {
  66.         bool active;
  67.         TweenData_Base* tween;
  68.         float t;
  69.         float totaltime;
  70.         SingleTween* chain;
  71.         SingleTween():active(false),tween(0),t(0),chain(0){}
  72.         ~SingleTween(){ delete tween; delete chain; }
  73.  
  74.         template<typename T, typename F>
  75.         SingleTween* then(T end, float totaltime = 1, F curve = TweenCurves::LINEAR){
  76.             delete[] chain;
  77.             TweenData<T, F>* tw = (TweenData<T, F>*)(tween);
  78.  
  79.             chain = new SingleTween();
  80.             chain->active = false;
  81.             chain->tween = new TweenData<T, F>(tw->value, tw->end, end, curve);
  82.             chain->t = 0;
  83.             chain->totaltime = totaltime;
  84.  
  85.             return chain;
  86.         }
  87.     };
  88.     std::vector<SingleTween> tweens;
  89.  
  90.     //assignment, copying forbidden
  91.     Tweens& operator=(const Tweens& rhs);
  92.     Tweens(const Tweens& rhs);
  93. public:
  94.     Tweens(){}
  95.     //curves
  96.  
  97.     template<typename T, typename F>
  98.     SingleTween* doTween(T* value, T end, float totaltime = 1, F curve = TweenCurves::LINEAR){
  99.         CancelTween(value);
  100.         TweenData<T, F> *newTween = new TweenData<T, F>(value, *value, end, curve);
  101.         return addTween(newTween, totaltime);
  102.     }
  103.  
  104.     void CancelTween(void* value){
  105.         for (int i = 0; i < tweens.size(); i++){
  106.             if (tweens[i].active && tweens[i].tween->_value == value){
  107.                 tweens[i].active = false;
  108.             }
  109.         }
  110.     }
  111.  
  112.     SingleTween* AddTweenAt(int i, TweenData_Base* tween, float totaltime){
  113.         delete tweens[i].tween;
  114.         delete tweens[i].chain;
  115.         tweens[i].tween = tween;
  116.         tweens[i].t = 0;
  117.         tweens[i].active = true;
  118.         tweens[i].totaltime = totaltime;
  119.         tweens[i].chain = 0;
  120.         return &tweens[i];
  121.     }
  122.  
  123.     SingleTween* addTween(TweenData_Base* tween, float totaltime){
  124.         for(int i = 0; i<tweens.size(); i++){
  125.             if(!tweens[i].active){
  126.                 return AddTweenAt(i, tween, totaltime);
  127.             }
  128.         }
  129.         tweens.push_back(SingleTween());
  130.         return AddTweenAt(tweens.size()-1, tween, totaltime);
  131.     }
  132.  
  133.  
  134.     void updateTweens(float deltaTime = 1.0/60.0){
  135.         for (int i = 0; i < tweens.size(); i++){
  136.             if (tweens[i].active){
  137.                 tweens[i].t += deltaTime / tweens[i].totaltime;
  138.                 if(tweens[i].t > 1){
  139.                     tweens[i].t = 1;
  140.                     tweens[i].tween->updateTween(1);
  141.  
  142.                     if(tweens[i].chain){
  143.                         delete tweens[i].tween;
  144.                         tweens[i].tween = tweens[i].chain->tween;
  145.                         tweens[i].t = 0;
  146.                         tweens[i].totaltime = tweens[i].chain->totaltime;
  147.                         SingleTween* oldchain = tweens[i].chain;
  148.                         tweens[i].chain = tweens[i].chain->chain;
  149.                         oldchain->chain = 0;
  150.                         oldchain->tween = 0;
  151.                         delete oldchain;
  152.                     } else {
  153.                         tweens[i].active = false;
  154.                     }
  155.                 } else {
  156.                     tweens[i].tween->updateTween(tweens[i].t);
  157.                 }
  158.             }
  159.         }
  160.     }
  161. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement