001         package com.croftsoft.core.animation.component;
002    
003         import java.awt.Graphics2D;
004         import java.awt.Rectangle;
005         import java.awt.geom.Rectangle2D;
006         import java.awt.image.BufferStrategy;
007    
008         import com.croftsoft.core.animation.AnimatedComponent;
009         import com.croftsoft.core.animation.ComponentAnimator;
010         import com.croftsoft.core.animation.RepaintCollector;
011         import com.croftsoft.core.animation.factory.DefaultAnimationFactory;
012         import com.croftsoft.core.lang.NullArgumentException;
013         import com.croftsoft.core.util.loop.FixedDelayLoopGovernor;
014         import com.croftsoft.core.util.loop.LoopGovernor;
015    
016         /*********************************************************************
017         * AnimatedComponent subclass that uses a BufferStrategy.
018         *
019         * @version
020         *   2003-07-24
021         * @since
022         *   2002-03-08
023         * @author
024         *   <a href="https://www.croftsoft.com/">David Wallace Croft</a>
025         *********************************************************************/
026    
027         public class  BufferStrategyAnimatedComponent
028           extends AnimatedComponent
029         //////////////////////////////////////////////////////////////////////
030         //////////////////////////////////////////////////////////////////////
031         {
032    
033         protected final BufferStrategy  bufferStrategy;
034    
035         //
036    
037         private final Rectangle  componentBounds;
038    
039         private final Rectangle  clipBounds;
040    
041         //////////////////////////////////////////////////////////////////////
042         // constructor methods
043         //////////////////////////////////////////////////////////////////////
044    
045         /*********************************************************************
046         * Main constructor.
047         *********************************************************************/
048         public  BufferStrategyAnimatedComponent (
049           ComponentAnimator  componentAnimator,
050           RepaintCollector   repaintCollector,
051           LoopGovernor       loopGovernor,
052           BufferStrategy     bufferStrategy )
053         //////////////////////////////////////////////////////////////////////
054         {
055           super ( componentAnimator, repaintCollector, loopGovernor );
056    
057           NullArgumentException.check (
058             this.bufferStrategy = bufferStrategy );
059    
060           componentBounds = new Rectangle ( );
061    
062           clipBounds      = new Rectangle ( );
063         }
064    
065         public  BufferStrategyAnimatedComponent (
066           ComponentAnimator  componentAnimator,
067           BufferStrategy     bufferStrategy )
068         //////////////////////////////////////////////////////////////////////
069         {
070           this (
071             componentAnimator,
072             DefaultAnimationFactory.INSTANCE.createRepaintCollector ( ),
073             new FixedDelayLoopGovernor ( 0, 0 ),
074             bufferStrategy );
075         }
076    
077         //////////////////////////////////////////////////////////////////////
078         // protected methods
079         //////////////////////////////////////////////////////////////////////
080    
081         protected void  animate ( )
082         //////////////////////////////////////////////////////////////////////
083         {
084           componentAnimator.update ( this );
085    
086           int  count = repaintCollector.getCount ( );
087    
088           Rectangle [ ]  repaintRegions
089             = repaintCollector.getRepaintRegions ( );
090    
091           getBounds ( componentBounds );
092    
093           Graphics2D  graphics2D
094             = ( Graphics2D ) bufferStrategy.getDrawGraphics ( );
095    
096           for ( int  i = 0; i < count; i++ )
097           {
098             Rectangle  repaintRegion = repaintRegions [ i ];
099    
100             if ( !componentBounds.intersects ( repaintRegion ) )
101             {
102               continue;
103             }
104    
105             Rectangle2D.intersect (
106               componentBounds, repaintRegion, clipBounds );
107    
108             graphics2D.setClip ( clipBounds );
109    
110             componentAnimator.paint ( this, graphics2D );
111           }
112    
113           bufferStrategy.show ( );
114    
115           graphics2D.dispose ( );
116    
117           repaintCollector.reset ( );
118         }
119    
120         //////////////////////////////////////////////////////////////////////
121         //////////////////////////////////////////////////////////////////////
122         }