001         package com.croftsoft.apps.sprite;
002    
003         import java.awt.Rectangle;
004         import javax.swing.Icon;
005         import javax.swing.JComponent;
006    
007         import com.croftsoft.core.lang.NullArgumentException;
008         import com.croftsoft.core.animation.ComponentUpdater;
009         import com.croftsoft.core.animation.sprite.IconSprite;
010    
011         /*********************************************************************
012         * Switches the Icon based upon the Sprite heading.
013         *
014         * @version
015         *   2002-03-23
016         * @since
017         *   2002-02-24
018         * @author
019         *   <a href="https://www.croftsoft.com/">David Wallace Croft</a>
020         *********************************************************************/
021    
022         public final class  LeftRightUpdater
023           implements ComponentUpdater
024         //////////////////////////////////////////////////////////////////////
025         //////////////////////////////////////////////////////////////////////
026         {
027    
028         private final IconSprite  iconSprite;
029    
030         private final Icon        lookLeftIcon;
031    
032         private final Icon        lookRightIcon;
033    
034         private final Rectangle   repaintRegion;
035    
036         //
037    
038         private double  oldHeading;
039    
040         private Icon    oldIcon;
041    
042         //////////////////////////////////////////////////////////////////////
043         //////////////////////////////////////////////////////////////////////
044    
045         public  LeftRightUpdater (
046           IconSprite  iconSprite,
047           Icon        lookLeftIcon,
048           Icon        lookRightIcon )
049         //////////////////////////////////////////////////////////////////////
050         {
051           NullArgumentException.check ( this.iconSprite    = iconSprite    );
052    
053           NullArgumentException.check ( this.lookLeftIcon  = lookLeftIcon  );
054    
055           NullArgumentException.check ( this.lookRightIcon = lookRightIcon );
056    
057           repaintRegion = new Rectangle ( );
058         }
059    
060         //////////////////////////////////////////////////////////////////////
061         //////////////////////////////////////////////////////////////////////
062    
063         public void  update ( JComponent  component )
064         //////////////////////////////////////////////////////////////////////
065         {
066           double  heading = iconSprite.getHeading ( );
067    
068           if ( heading == oldHeading )
069           {
070             return;
071           }
072    
073           oldHeading = heading;
074    
075           Icon  icon = lookRightIcon;
076    
077           if ( ( heading >     Math.PI / 2 )
078             && ( heading < 3 * Math.PI / 2 ) )
079           {
080             icon = lookLeftIcon;
081           }
082    
083           if ( icon == oldIcon )
084           {
085             return;
086           }
087    
088           iconSprite.getPaintBounds ( repaintRegion );
089    
090           component.repaint ( repaintRegion );
091    
092           iconSprite.setIcon ( icon );
093    
094           oldIcon = icon;
095    
096           iconSprite.getPaintBounds ( repaintRegion );
097    
098           component.repaint ( repaintRegion );
099         }
100    
101         //////////////////////////////////////////////////////////////////////
102         //////////////////////////////////////////////////////////////////////
103         }