Akira

World.as update sequence control.

Nov 26th, 2013
56
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.     /**
  2.      * Brings the Entity to be first updated in update sequence.
  3.      * @param e Entity which will be moved in update sequence.
  4.      */
  5.     public function bringUpdateFirst(e:Entity):Boolean
  6.     {
  7.       // _updateFirst exists and not equals to me.
  8.       if (_updateFirst !== e) return false;
  9.      
  10.       // Remove me from update sequence
  11.       if (e._updatePrev) e._updatePrev._updateNext = e._updateNext; // If I'm last in update sequence, updateNext will be null anyway, so I don't care about checking
  12.       if (e._updateNext) e._updateNext._updatePrev = e._updatePrev;
  13.      
  14.       // Bring me to front.
  15.       _updateFirst._updatePrev = e;
  16.       e._updateNext = _updateFirst;
  17.       e._updatePrev = null;
  18.       _updateFirst = e;
  19.       return true;
  20.     }
  21.    
  22.     /**
  23.      * Send the Entity to be updated last in update sequence
  24.      * @param e Entity which will be moved in update sequence.
  25.      */
  26.     public function sendUpdateLast(e:Entity):Boolean
  27.     {
  28.       // _updateFirst exists and I'm is not last updated entity
  29.       if (_updateFirst && e._updateNext)
  30.       {
  31.         var lastEnt:Entity = e._updateNext;
  32.        
  33.         // Remove me from update sequence
  34.         if (e._updatePrev) e._updatePrev._updateNext = lastEnt;
  35.        
  36.         if (e === _updateFirst) _updateFirst = e._updateNext; // If first, set next as first
  37.         lastEnt._updatePrev = e._updatePrev;
  38.        
  39.         // Find last updated entity
  40.         while (lastEnt._updateNext) lastEnt = lastEnt._updateNext;
  41.        
  42.         // Set as last updated entity
  43.         lastEnt._updateNext = e;
  44.         e._updatePrev = lastEnt;
  45.         e._updateNext = null;
  46.         return true;
  47.       }
  48.       return false;
  49.     }
  50.    
  51.     /**
  52.      * Brings the Entity to be updated right before second given entity.
  53.      * @param e Entity which will be moved in update sequence.
  54.      * @param before Entity, in front of which will be inserted first Entity.
  55.      */
  56.     public function bringUpdateBefore(e:Entity, before:Entity):Boolean
  57.     {
  58.       if (_updateFirst && before._updatePrev !== e)
  59.       {
  60.         // Remove from current sequence
  61.         if (e._updatePrev) e._updatePrev._updateNext = e._updateNext;
  62.         if (e._updateNext) e._updateNext._updatePrev = e._updatePrev;
  63.        
  64.         // Add to new sequence
  65.         e._updatePrev = before._updatePrev;
  66.         if (e._updatePrev) e._updatePrev._updateNext = e;
  67.        
  68.         e._updateNext = before;
  69.         before._updatePrev = e;
  70.        
  71.         if (_updateFirst === before) _updateFirst = e;
  72.         return true;
  73.       }
  74.       return false;
  75.     }
  76.    
  77.     /**
  78.      * Sends the entity to be updated right after the second given entity.
  79.      * @param e Entity which will be moved in update sequence.
  80.      * @param after Entity, after which will be inserted first Entity.
  81.      */
  82.     public function sendUpdateAfter(e:Entity, after:Entity):Boolean
  83.     {
  84.       if (_updateFirst && after._updateNext !== e)
  85.       {
  86.         // Remove from current sequence
  87.         if (e === _updateFirst) _updateFirst = e._updateNext;
  88.         if (e._updatePrev) e._updatePrev._updateNext = e._updateNext;
  89.         if (e._updateNext) e._updateNext._updatePrev = e._updatePrev;
  90.        
  91.         // Add to new sequence
  92.         e._updateNext = after._updateNext;
  93.         if (e._updateNext) e._updateNext._updatePrev = e;
  94.        
  95.         e._updatePrev = after;
  96.         after._updateNext = e;
  97.         return true;
  98.       }
  99.       return false;
  100.     }
  101.    
  102.     /**
  103.      * Beings the entity forward in update sequence. (Will be updated earlier)
  104.      * @param e Entity which will be moved in update sequence.
  105.      */
  106.     public function bringUpdateForward(e:Entity):Boolean
  107.     {
  108.       if (_updateFirst && e._updatePrev)
  109.       {
  110.         var prev:Entity = e._updatePrev;
  111.         prev._updateNext = e._updateNext;
  112.         if (e._updateNext) prev._updateNext._updatePrev = prev;
  113.        
  114.         e._updatePrev = prev._updatePrev;
  115.         if (prev._updatePrev) e._updatePrev._updateNext = e;
  116.        
  117.         e._updateNext = prev;
  118.         prev._updatePrev = e;
  119.         if (prev === _updateFirst) _updateFirst = e;
  120.         return true;
  121.       }
  122.       return false;
  123.     }
  124.    
  125.     /**
  126.      * Sends the entity backward in update sequence. (Will be updated later)
  127.      * @param e Entity which will be moved in update sequence.
  128.      */
  129.     public function sendUpdateBackward(e:Entity):Boolean
  130.     {
  131.       if (_updateFirst && e._updateNext)
  132.       {
  133.         var next:Entity = e._updateNext;
  134.         next._updatePrev = e._updatePrev;
  135.         if (e._updatePrev) next._updatePrev._updateNext = next;
  136.        
  137.         e._updateNext = next._updateNext;
  138.         if (next._updateNext) e._updateNext._updatePrev = e;
  139.        
  140.         next._updateNext = e;
  141.         e._updatePrev = next;
  142.         if (e === _updateFirst) _updateFirst = next;
  143.         return true;
  144.       }
  145.       return false;
  146.     }
  147.    
  148.     /**
  149.      * Swaps two entities in update sequence.
  150.      * @param first First entity to swap.
  151.      * @param second Second entity to swap.
  152.      */
  153.     public function swapUpdateEntities(first:Entity, second:Entity):Boolean
  154.     {
  155.       if (_updateFirst)
  156.       {
  157.         var temp:Entity = first._updatePrev;
  158.         first._updatePrev = second._updatePrev;
  159.         second._updatePrev = temp;
  160.        
  161.         temp = first._updateNext;
  162.         first._updateNext = second._updateNext;
  163.         second._updateNext = temp;
  164.        
  165.         return true;
  166.       }
  167.       return false;
  168.     }
Advertisement
Add Comment
Please, Sign In to add comment