001 package com.croftsoft.apps.mars.view; 002 003 import java.awt.*; 004 import java.util.*; 005 import javax.swing.JComponent; 006 007 import com.croftsoft.core.animation.ComponentAnimator; 008 import com.croftsoft.core.animation.painter.ColorPainter; 009 import com.croftsoft.core.awt.image.ImageCache; 010 import com.croftsoft.core.lang.NullArgumentException; 011 import com.croftsoft.core.media.sound.AudioClipCache; 012 013 import com.croftsoft.apps.mars.model.AmmoDumpAccessor; 014 import com.croftsoft.apps.mars.model.BulletAccessor; 015 import com.croftsoft.apps.mars.model.ModelAccessor; 016 import com.croftsoft.apps.mars.model.ObstacleAccessor; 017 import com.croftsoft.apps.mars.model.TankAccessor; 018 import com.croftsoft.apps.mars.model.WorldAccessor; 019 020 /********************************************************************* 021 * ComponentAnimator that maps Models to views. 022 * 023 * @version 024 * 2003-04-17 025 * @since 026 * 2003-04-14 027 * @author 028 * <a href="https://www.croftsoft.com/">David Wallace Croft</a> 029 *********************************************************************/ 030 031 public final class WorldAnimator 032 implements ComponentAnimator 033 ////////////////////////////////////////////////////////////////////// 034 ////////////////////////////////////////////////////////////////////// 035 { 036 037 private static final Color COLOR_BULLET = Color.MAGENTA; 038 039 private static final Color COLOR_OBSTACLE = Color.BLACK; 040 041 // 042 043 private final AudioClipCache audioClipCache; 044 045 private final ImageCache imageCache; 046 047 private final Map componentAnimatorMap; 048 049 private final WorldAccessor worldAccessor; 050 051 // 052 053 private ModelAccessor [ ] modelAccessors; 054 055 ////////////////////////////////////////////////////////////////////// 056 ////////////////////////////////////////////////////////////////////// 057 058 public WorldAnimator ( 059 WorldAccessor worldAccessor, 060 AudioClipCache audioClipCache, 061 ImageCache imageCache ) 062 ////////////////////////////////////////////////////////////////////// 063 { 064 NullArgumentException.check ( this.worldAccessor = worldAccessor ); 065 066 NullArgumentException.check ( this.audioClipCache = audioClipCache); 067 068 NullArgumentException.check ( this.imageCache = imageCache ); 069 070 componentAnimatorMap = new HashMap ( ); 071 072 modelAccessors = new ModelAccessor [ 0 ]; 073 } 074 075 ////////////////////////////////////////////////////////////////////// 076 // interface ComponentAnimator methods 077 ////////////////////////////////////////////////////////////////////// 078 079 public void update ( JComponent component ) 080 ////////////////////////////////////////////////////////////////////// 081 { 082 modelAccessors = worldAccessor.getModelAccessors ( modelAccessors ); 083 084 for ( int i = 0; i < modelAccessors.length; i++ ) 085 { 086 ModelAccessor modelAccessor = modelAccessors [ i ]; 087 088 if ( modelAccessor == null ) 089 { 090 break; 091 } 092 093 ComponentAnimator componentAnimator 094 = getComponentAnimator ( modelAccessor ); 095 096 componentAnimator.update ( component ); 097 } 098 } 099 100 public void paint ( 101 JComponent component, 102 Graphics2D graphics ) 103 ////////////////////////////////////////////////////////////////////// 104 { 105 for ( int i = 0; i < modelAccessors.length; i++ ) 106 { 107 ModelAccessor modelAccessor = modelAccessors [ i ]; 108 109 if ( modelAccessor == null ) 110 { 111 break; 112 } 113 114 ComponentAnimator componentAnimator 115 = getComponentAnimator ( modelAccessors [ i ] ); 116 117 componentAnimator.paint ( component, graphics ); 118 } 119 } 120 121 ////////////////////////////////////////////////////////////////////// 122 // private methods 123 ////////////////////////////////////////////////////////////////////// 124 125 private ComponentAnimator getComponentAnimator ( 126 ModelAccessor modelAccessor ) 127 ////////////////////////////////////////////////////////////////////// 128 { 129 ComponentAnimator componentAnimator = ( ComponentAnimator ) 130 componentAnimatorMap.get ( modelAccessor ); 131 132 if ( componentAnimator == null ) 133 { 134 if ( modelAccessor instanceof AmmoDumpAccessor ) 135 { 136 componentAnimator = new AmmoDumpAnimator ( 137 ( AmmoDumpAccessor ) modelAccessor, audioClipCache ); 138 } 139 else if ( modelAccessor instanceof BulletAccessor ) 140 { 141 componentAnimator 142 = new ModelAnimator ( modelAccessor, COLOR_BULLET ); 143 } 144 else if ( modelAccessor instanceof ObstacleAccessor ) 145 { 146 componentAnimator 147 = new ModelAnimator ( modelAccessor, COLOR_OBSTACLE ); 148 } 149 else if ( modelAccessor instanceof TankAccessor ) 150 { 151 componentAnimator = new TankAnimator ( 152 ( TankAccessor ) modelAccessor, imageCache, audioClipCache ); 153 } 154 else 155 { 156 componentAnimator = new ModelAnimator ( modelAccessor ); 157 } 158 159 componentAnimatorMap.put ( modelAccessor, componentAnimator ); 160 } 161 162 return componentAnimator; 163 } 164 165 ////////////////////////////////////////////////////////////////////// 166 ////////////////////////////////////////////////////////////////////// 167 }