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 }