001         package com.croftsoft.apps.mars.view;
002    
003         import java.applet.*;
004         import java.awt.*;
005         import java.awt.geom.*;
006         import java.awt.image.*;
007         import java.net.*;
008         import java.util.*;
009         import javax.swing.*;
010    
011         import com.croftsoft.core.animation.ComponentAnimator;
012         import com.croftsoft.core.lang.NullArgumentException;
013         import com.croftsoft.core.math.geom.PointXY;
014    
015         import com.croftsoft.apps.mars.ai.StateSpaceNode;
016         import com.croftsoft.apps.mars.model.GameAccessor;
017    
018         /*********************************************************************
019         * Paints the planned path.
020         *
021         * @version
022         *   2003-04-30
023         * @since
024         *   2003-04-30
025         * @author
026         *   <a href="https://www.croftsoft.com/">David Wallace Croft</a>
027         *********************************************************************/
028    
029         public final class  PathAnimator
030           implements ComponentAnimator
031         //////////////////////////////////////////////////////////////////////
032         //////////////////////////////////////////////////////////////////////
033         {
034    
035         private final GameAccessor  gameAccessor;
036    
037         private final double        tankRadius;
038    
039         //
040    
041         private boolean  enabled;
042    
043         //////////////////////////////////////////////////////////////////////
044         // constructor methods
045         //////////////////////////////////////////////////////////////////////
046    
047         /*********************************************************************
048         * Main constructor.
049         *********************************************************************/
050         public  PathAnimator (
051           GameAccessor  gameAccessor,
052           double        tankRadius )
053         //////////////////////////////////////////////////////////////////////
054         {
055           NullArgumentException.check ( this.gameAccessor = gameAccessor );
056    
057           this.tankRadius = tankRadius;
058         }
059    
060         //////////////////////////////////////////////////////////////////////
061         //////////////////////////////////////////////////////////////////////
062    
063         public void  toggle ( )
064         //////////////////////////////////////////////////////////////////////
065         {
066           enabled = !enabled;
067         }
068    
069         //////////////////////////////////////////////////////////////////////
070         // interface ComponentAnimator methods
071         //////////////////////////////////////////////////////////////////////
072    
073         public void  update ( JComponent  component )
074         //////////////////////////////////////////////////////////////////////
075         {
076           if ( enabled )
077           {
078             component.repaint ( );
079           }
080         }
081    
082         public void  paint (
083           JComponent  component,
084           Graphics2D  graphics )
085         //////////////////////////////////////////////////////////////////////
086         {
087           if ( !enabled )
088           {
089             return;
090           }
091    
092           Iterator  iterator = gameAccessor.getPath ( );
093    
094           while ( iterator.hasNext ( ) )
095           {
096             StateSpaceNode  stateSpaceNode
097               = ( StateSpaceNode ) iterator.next ( );
098    
099             PointXY  pointXY = stateSpaceNode.getPointXY ( );
100    
101             graphics.setColor ( Color.RED );
102    
103             graphics.drawOval (
104               ( int ) ( pointXY.getX ( ) - tankRadius ),
105               ( int ) ( pointXY.getY ( ) - tankRadius ),
106               ( int ) ( 2 * tankRadius ),
107               ( int ) ( 2 * tankRadius ) );
108           }
109         }
110    
111         //////////////////////////////////////////////////////////////////////
112         //////////////////////////////////////////////////////////////////////
113         }