001 package com.croftsoft.apps.sprite; 002 003 import java.awt.*; 004 import java.awt.event.*; 005 import java.awt.image.*; 006 import java.security.*; 007 import javax.swing.*; 008 import javax.swing.event.*; 009 010 import com.croftsoft.core.gui.BufferCapabilitiesLib; 011 import com.croftsoft.core.gui.LifecycleWindowListener; 012 import com.croftsoft.core.lang.ClassLib; 013 import com.croftsoft.core.lang.lifecycle.Lifecycle; 014 import com.croftsoft.core.animation.AnimatedComponent; 015 016 /********************************************************************* 017 * Main SpriteDemo class. 018 * 019 * @version 020 * $Date: 2008/04/19 21:31:00 $ 021 * @since 022 * 2001-03-04 023 * @author 024 * <a href="https://www.croftsoft.com/">David Wallace Croft</a> 025 *********************************************************************/ 026 027 // rename this to AnimationDemo 028 029 public final class SpriteDemo 030 extends JApplet 031 implements ChangeListener, ItemListener, Lifecycle, SpriteConstants 032 ////////////////////////////////////////////////////////////////////// 033 ////////////////////////////////////////////////////////////////////// 034 { 035 036 private final BufferStrategy bufferStrategy; 037 038 // 039 040 private AnimatedComponent animatedComponent; 041 042 private SpriteAnimator spriteAnimator; 043 044 private SpinnerNumberModel spriteVelocitySpinnerNumberModel; 045 046 private SpinnerNumberModel frameRateSpinnerNumberModel; 047 048 private JCheckBoxMenuItem paintBackgroundCheckBox; 049 050 private JCheckBoxMenuItem paintBricksCheckBox; 051 052 private JCheckBoxMenuItem paintSpritesCheckBox; 053 054 private JCheckBoxMenuItem paintCloudsCheckBox; 055 056 private JCheckBoxMenuItem paintFogNightCheckBox; 057 058 private JCheckBoxMenuItem onlySpriteUpdatesCheckBox; 059 060 private JCheckBoxMenuItem onlySpriteRegionsCheckBox; 061 062 private JCheckBoxMenuItem useSystemClockCheckBox; 063 064 private JCheckBoxMenuItem useFixedDelayCheckBox; 065 066 private JCheckBoxMenuItem useSwingRepainterCheckBox; 067 068 private JCheckBoxMenuItem useDoubleBufferingCheckBox; 069 070 ////////////////////////////////////////////////////////////////////// 071 ////////////////////////////////////////////////////////////////////// 072 073 public static void main ( String [ ] args ) 074 ////////////////////////////////////////////////////////////////////// 075 { 076 JFrame jFrame = new JFrame ( FRAME_TITLE ); 077 078 try 079 { 080 jFrame.setIconImage ( ClassLib.getResourceAsImage ( 081 SpriteDemo.class, FRAME_ICON_FILENAME ) ); 082 } 083 catch ( Exception ex ) 084 { 085 ex.printStackTrace ( ); 086 } 087 088 BufferStrategy bufferStrategy = null; 089 090 GraphicsConfiguration graphicsConfiguration 091 = jFrame.getGraphicsConfiguration ( ); 092 093 GraphicsDevice graphicsDevice 094 = graphicsConfiguration.getDevice ( ); 095 096 if ( graphicsDevice.isFullScreenSupported ( ) ) 097 { 098 try 099 { 100 // jFrame.setUndecorated ( ); 101 102 // jFrame.setIgnoreRepaint ( true ); 103 104 graphicsDevice.setFullScreenWindow ( jFrame ); 105 106 System.out.println ( "full screen" ); 107 108 jFrame.createBufferStrategy ( 2 ); 109 110 bufferStrategy = jFrame.getBufferStrategy ( ); 111 112 BufferCapabilitiesLib.print ( 113 bufferStrategy.getCapabilities ( ) ); 114 } 115 catch ( AccessControlException ex ) 116 { 117 } 118 } 119 120 System.out.println ( bufferStrategy ); 121 122 SpriteDemo spriteDemo = new SpriteDemo ( bufferStrategy ); 123 124 jFrame.setContentPane ( spriteDemo ); 125 126 if ( bufferStrategy == null ) 127 { 128 LifecycleWindowListener.launchFrameAsDesktopApp ( 129 jFrame, 130 new Lifecycle [ ] { spriteDemo }, 131 FRAME_SIZE, 132 SHUTDOWN_CONFIRMATION_PROMPT ); 133 } 134 else 135 { 136 jFrame.setDefaultCloseOperation ( 137 WindowConstants.DO_NOTHING_ON_CLOSE ); 138 139 jFrame.addWindowListener ( 140 new LifecycleWindowListener ( 141 new Lifecycle [ ] { spriteDemo }, 142 SHUTDOWN_CONFIRMATION_PROMPT ) ); 143 144 // jFrame.show ( ); 145 } 146 } 147 148 ////////////////////////////////////////////////////////////////////// 149 ////////////////////////////////////////////////////////////////////// 150 151 public SpriteDemo ( BufferStrategy bufferStrategy ) 152 ////////////////////////////////////////////////////////////////////// 153 { 154 this.bufferStrategy = bufferStrategy; 155 } 156 157 public SpriteDemo ( ) 158 ////////////////////////////////////////////////////////////////////// 159 { 160 this ( null ); 161 } 162 163 ////////////////////////////////////////////////////////////////////// 164 ////////////////////////////////////////////////////////////////////// 165 166 public String getAppletInfo ( ) 167 ////////////////////////////////////////////////////////////////////// 168 { 169 return INFO; 170 } 171 172 ////////////////////////////////////////////////////////////////////// 173 ////////////////////////////////////////////////////////////////////// 174 175 public void init ( ) 176 ////////////////////////////////////////////////////////////////////// 177 { 178 System.out.println ( INFO ); 179 180 spriteAnimator = new SpriteAnimator ( bufferStrategy ); 181 182 animatedComponent = spriteAnimator.getAnimatedComponent ( ); 183 184 animatedComponent.init ( ); 185 186 // 187 188 spriteVelocitySpinnerNumberModel = new SpinnerNumberModel ( 189 DEFAULT_SPRITE_VELOCITY, 190 0.0, 191 999.9, 192 1.0 ); 193 194 spriteVelocitySpinnerNumberModel.addChangeListener ( this ); 195 196 // 197 198 frameRateSpinnerNumberModel = new SpinnerNumberModel ( 199 DEFAULT_FRAME_RATE, 200 0.1, 201 999.9, 202 1.0 ); 203 204 frameRateSpinnerNumberModel.addChangeListener ( this ); 205 206 // 207 208 JPanel southPanel = new JPanel ( new GridBagLayout ( ), true ); 209 210 GridBagConstraints gridBagConstraints = new GridBagConstraints ( ); 211 212 // 213 214 gridBagConstraints.gridx = 0; 215 216 gridBagConstraints.gridy = 0; 217 218 gridBagConstraints.weightx = 1.0; 219 220 gridBagConstraints.fill = GridBagConstraints.HORIZONTAL; 221 222 gridBagConstraints.insets = new Insets ( 1, 2, 2, 1 ); 223 224 southPanel.add ( 225 new JLabel ( "Sprite Velocity (pixels/sec)", SwingConstants.RIGHT ), 226 gridBagConstraints ); 227 228 gridBagConstraints.gridx = 1; 229 230 gridBagConstraints.gridy = 0; 231 232 gridBagConstraints.weightx = 0.0; 233 234 southPanel.add ( 235 new JSpinner ( spriteVelocitySpinnerNumberModel ), 236 gridBagConstraints ); 237 238 // 239 240 gridBagConstraints.gridx = 0; 241 242 gridBagConstraints.gridy = 1; 243 244 gridBagConstraints.weightx = 1.0; 245 246 southPanel.add ( 247 new JLabel ( "Frame Rate (frames/sec)", SwingConstants.RIGHT ), 248 gridBagConstraints ); 249 250 gridBagConstraints.gridx = 1; 251 252 gridBagConstraints.gridy = 1; 253 254 gridBagConstraints.weightx = 0.0; 255 256 southPanel.add ( 257 new JSpinner ( frameRateSpinnerNumberModel ), 258 gridBagConstraints ); 259 260 // 261 262 JMenuBar menuBar = new JMenuBar ( ); 263 264 setJMenuBar ( menuBar ); 265 266 // 267 268 JMenu optionsMenu = new JMenu ( "Options" ); 269 270 optionsMenu.setMnemonic ( KeyEvent.VK_O ); 271 272 menuBar.add ( optionsMenu ); 273 274 // 275 276 paintBackgroundCheckBox 277 = new JCheckBoxMenuItem ( "Paint background?", true ); 278 279 optionsMenu.add ( paintBackgroundCheckBox ); 280 281 paintBackgroundCheckBox.addItemListener ( this ); 282 283 // 284 285 paintBricksCheckBox 286 = new JCheckBoxMenuItem ( "Paint bricks?", true ); 287 288 optionsMenu.add ( paintBricksCheckBox ); 289 290 paintBricksCheckBox.addItemListener ( this ); 291 292 // 293 294 paintSpritesCheckBox 295 = new JCheckBoxMenuItem ( "Paint sprites?", true ); 296 297 optionsMenu.add ( paintSpritesCheckBox ); 298 299 paintSpritesCheckBox.addItemListener ( this ); 300 301 // 302 303 paintCloudsCheckBox 304 = new JCheckBoxMenuItem ( "Paint clouds?", true ); 305 306 optionsMenu.add ( paintCloudsCheckBox ); 307 308 paintCloudsCheckBox.addItemListener ( this ); 309 310 // 311 312 paintFogNightCheckBox 313 = new JCheckBoxMenuItem ( "Paint fog and night?", false ); 314 315 optionsMenu.add ( paintFogNightCheckBox ); 316 317 paintFogNightCheckBox.addItemListener ( this ); 318 319 // 320 321 onlySpriteUpdatesCheckBox 322 = new JCheckBoxMenuItem ( "Only sprite updates?", false ); 323 324 optionsMenu.add ( onlySpriteUpdatesCheckBox ); 325 326 onlySpriteUpdatesCheckBox.addItemListener ( this ); 327 328 // 329 330 onlySpriteRegionsCheckBox 331 = new JCheckBoxMenuItem ( "Only sprite regions?", false ); 332 333 optionsMenu.add ( onlySpriteRegionsCheckBox ); 334 335 onlySpriteRegionsCheckBox.addItemListener ( this ); 336 337 // 338 339 useSystemClockCheckBox 340 = new JCheckBoxMenuItem ( "Use system clock?", false ); 341 342 optionsMenu.add ( useSystemClockCheckBox ); 343 344 useSystemClockCheckBox.addItemListener ( this ); 345 346 // 347 348 useFixedDelayCheckBox 349 = new JCheckBoxMenuItem ( "Use fixed delay?", false ); 350 351 optionsMenu.add ( useFixedDelayCheckBox ); 352 353 useFixedDelayCheckBox.addItemListener ( this ); 354 355 // 356 357 useSwingRepainterCheckBox 358 = new JCheckBoxMenuItem ( "Use Swing RepaintManager?", false ); 359 360 optionsMenu.add ( useSwingRepainterCheckBox ); 361 362 useSwingRepainterCheckBox.addItemListener ( this ); 363 364 // 365 366 useDoubleBufferingCheckBox 367 = new JCheckBoxMenuItem ( "Use double-buffering?", true ); 368 369 optionsMenu.add ( useDoubleBufferingCheckBox ); 370 371 useDoubleBufferingCheckBox.addItemListener ( this ); 372 373 // 374 375 Container contentPane = getContentPane ( ); 376 377 contentPane.setLayout ( new BorderLayout ( ) ); 378 379 contentPane.add ( animatedComponent, BorderLayout.CENTER ); 380 381 contentPane.add ( southPanel, BorderLayout.SOUTH ); 382 383 validate ( ); 384 } 385 386 public void start ( ) { animatedComponent.start ( ); } 387 388 public void stop ( ) { animatedComponent.stop ( ); } 389 390 public void destroy ( ) 391 ////////////////////////////////////////////////////////////////////// 392 { 393 animatedComponent.destroy ( ); 394 395 RepaintManager.currentManager ( animatedComponent ) 396 .setDoubleBufferingEnabled ( true ); 397 } 398 399 ////////////////////////////////////////////////////////////////////// 400 ////////////////////////////////////////////////////////////////////// 401 402 public void itemStateChanged ( ItemEvent itemEvent ) 403 ////////////////////////////////////////////////////////////////////// 404 { 405 Object item = itemEvent.getItem ( ); 406 407 if ( item == paintBackgroundCheckBox ) 408 { 409 spriteAnimator.setPaintBackground ( 410 paintBackgroundCheckBox.isSelected ( ) ); 411 } 412 else if ( item == paintBricksCheckBox ) 413 { 414 spriteAnimator.setPaintBricks ( 415 paintBricksCheckBox.isSelected ( ) ); 416 } 417 else if ( item == paintSpritesCheckBox ) 418 { 419 spriteAnimator.setPaintSprites ( 420 paintSpritesCheckBox.isSelected ( ) ); 421 } 422 else if ( item == paintCloudsCheckBox ) 423 { 424 spriteAnimator.setPaintClouds ( 425 paintCloudsCheckBox.isSelected ( ) ); 426 } 427 else if ( item == paintFogNightCheckBox ) 428 { 429 spriteAnimator.setPaintFogNight ( 430 paintFogNightCheckBox.isSelected ( ) ); 431 } 432 else if ( item == onlySpriteUpdatesCheckBox ) 433 { 434 spriteAnimator.setOnlySpriteUpdates ( 435 onlySpriteUpdatesCheckBox.isSelected ( ) ); 436 } 437 else if ( item == onlySpriteRegionsCheckBox ) 438 { 439 spriteAnimator.setOnlySpriteRegions ( 440 onlySpriteRegionsCheckBox.isSelected ( ) ); 441 } 442 else if ( item == useSystemClockCheckBox ) 443 { 444 spriteAnimator.setUseSystemClock ( 445 useSystemClockCheckBox.isSelected ( ) ); 446 } 447 else if ( item == useFixedDelayCheckBox ) 448 { 449 setLoopGovernor ( ); 450 } 451 else if ( item == useSwingRepainterCheckBox ) 452 { 453 spriteAnimator.setUseSwingRepaintCollector ( 454 useSwingRepainterCheckBox.isSelected ( ) ); 455 } 456 else if ( item == useDoubleBufferingCheckBox ) 457 { 458 spriteAnimator.setUseDoubleBuffering ( 459 useDoubleBufferingCheckBox.isSelected ( ) ); 460 } 461 } 462 463 public void stateChanged ( ChangeEvent changeEvent ) 464 ////////////////////////////////////////////////////////////////////// 465 { 466 Object source = changeEvent.getSource ( ); 467 468 if ( source == spriteVelocitySpinnerNumberModel ) 469 { 470 Double value 471 = ( Double ) spriteVelocitySpinnerNumberModel.getValue ( ); 472 473 spriteAnimator.setSpriteVelocity ( value.doubleValue ( ) ); 474 } 475 else if ( source == frameRateSpinnerNumberModel ) 476 { 477 setLoopGovernor ( ); 478 } 479 } 480 481 ////////////////////////////////////////////////////////////////////// 482 // private methods 483 ////////////////////////////////////////////////////////////////////// 484 485 private void setLoopGovernor ( ) 486 ////////////////////////////////////////////////////////////////////// 487 { 488 // what if the frequency is zero? 489 490 spriteAnimator.setLoopGovernor ( 491 useFixedDelayCheckBox.isSelected ( ), 492 ( ( Double ) frameRateSpinnerNumberModel.getValue ( ) ) 493 .doubleValue ( ) ); 494 } 495 496 ////////////////////////////////////////////////////////////////////// 497 ////////////////////////////////////////////////////////////////////// 498 }