home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 2000 August: Tool Chest / Dev.CD Aug 00 TC Disk 2.toast / pc / sample code / quicktime / quicktime for java / draggingsprites.win / src / draggingsprites.java
Encoding:
Java Source  |  2000-06-23  |  8.0 KB  |  238 lines

  1. /*
  2.  * QuickTime for Java SDK Sample Code
  3.  
  4.    Usage subject to restrictions in SDK License Agreement
  5.  * Copyright: © 1996-1999 Apple Computer, Inc.
  6.  
  7.  */
  8. import java.awt.*;
  9. import java.awt.event.*;
  10. import java.io.IOException;
  11. import java.io.File;
  12.  
  13. import quicktime.*;
  14. import quicktime.qd.*;
  15. import quicktime.std.*;
  16. import quicktime.io.*;
  17. import quicktime.std.image.*;
  18. import quicktime.util.*;
  19. import quicktime.std.movies.*;
  20. import quicktime.std.movies.media.*;
  21. import quicktime.app.actions.*;
  22. import quicktime.app.anim.*;
  23. import quicktime.app.audio.*;
  24. import quicktime.app.display.*;
  25. import quicktime.app.image.*;
  26. import quicktime.app.QTFactory;
  27.  
  28. import ds.actions.*;
  29.  
  30. public final class DraggingSprites extends Frame implements StdQTConstants {
  31.     static final int 
  32.                 kWidth = 400,
  33.                 kHeight = 300;
  34.     
  35.     // MIDI note numbers for drum kit instrument
  36.     static final int
  37.         kSnareDrum = 40,
  38.         kClosedHiHat = 44,
  39.         kOpenHiHat = 46,
  40.         kCrashCymbal = 49,
  41.         kRideCymbal = 51;
  42.  
  43.     public static void main (String[] args) {
  44.         try {
  45.             QTSession.open();
  46.             new DraggingSprites().show();
  47.         } catch (Exception e) {
  48.             e.printStackTrace();
  49.             QTSession.close();
  50.         }
  51.     }
  52.     
  53. //____________________ INSTANCE VARIABLES    
  54.     private Compositor myCompositor;
  55.     private QTCanvas canv;
  56.     
  57.     private boolean performance = true;
  58.     
  59. //____________________ INSTANCE METHODS    
  60.     DraggingSprites () throws QTException, IOException {
  61.         super ("Sprite App");
  62.  
  63.         canv = new QTCanvas (QTCanvas.kInitialSize, 0.5F, 0.5F);
  64.         add ("Center", canv);
  65.         Dimension size = new Dimension(kWidth, kHeight);
  66.         QDGraphics gw = new QDGraphics (new QDRect(size));
  67.         myCompositor = new Compositor (gw, QDColor.red, 20, 1);    
  68.         
  69.         File matchFile = QTFactory.findAbsolutePath ("Ships.mov");
  70.         OpenMovieFile movieFile = OpenMovieFile.asRead(new QTFile(matchFile));
  71.         Movie mov = Movie.fromFile (movieFile);
  72.         Track shipTrack = mov.getIndTrack (1);
  73.         ImageDataSequence is = ImageUtil.createSequence (shipTrack);
  74.         
  75.         createSprites (myCompositor, ImageUtil.makeTransparent (is, QDColor.blue), size);
  76.         myCompositor.getTimer().setRate (2);
  77.  
  78.         canv.setClient (myCompositor, true);
  79.  
  80.         addWindowListener(new WindowAdapter () {
  81.             public void windowClosing (WindowEvent e) {
  82.                 QTSession.close();
  83.                 dispose();
  84.             }
  85.  
  86.             public void windowClosed (WindowEvent e) {
  87.                 System.exit(0);
  88.             }
  89.         });
  90.         pack();
  91.     }
  92.                 
  93.     void createSprites (Compositor myCompositor, ImageDataSequence seq, Dimension size) throws QTException, IOException {
  94.         // This is the instrument that will be used to play all of the notes
  95.         // of the different actions -> we use a polyphony of 10
  96.         // which is a reasonable estimate of the maximum number of notes
  97.         // that will be sounding at a given time
  98.         final NoteChannelControl nc = new NoteChannelControl (StdQTConstants.kFirstDrumkit, 10);
  99.  
  100.         Matrix matrix = new Matrix();
  101.         matrix.setTx(size.width / 4);
  102.         matrix.setTy(size.height / 2);
  103.         TwoDSprite s1 = new TwoDSprite(seq, matrix, true, 1);
  104.         myCompositor.addMember (s1);
  105.         
  106.         // paint a sprite and set a hot spot region for it
  107.         // the green region is the hot spot
  108.         // we use a 16 bit BigEndian pixel format as we have no blending on this sprite
  109.         matrix = new Matrix();
  110.         matrix.setTx(20);
  111.         matrix.setTy(20);
  112.         QDRect r40 = new QDRect (40, 40);
  113.         QDRect r8 = new QDRect (1, 1, 8, 8);
  114.         QDGraphics y = new QDGraphics (QDConstants.k16BE555PixelFormat, r40);
  115.         y.setBackColor (QDColor.yellow);
  116.         y.eraseRect (null);
  117.         y.setForeColor (QDColor.green);
  118.         y.paintRect (r8);
  119.         EncodedImage ei = RawEncodedImage.fromPixMap (y.getPixMap());
  120.         ImageDescription id = new ImageDescription (y.getPixMap());
  121.         ImageDataSequence idsy = new ImageDataSequence (id);
  122.         idsy.addMember (ei);
  123.         if ((QTSession.isCurrentOS(QTSession.kWin32) && QTSession.getQTMajorVersion() == 3) == false)    //doesn't work on QT3.0.2 on Win
  124.             idsy = ImageUtil.makeTransparent (idsy, QDColor.black, new QDGraphics (QDConstants.k16BE555PixelFormat, r40), new Region (r8));
  125.         TwoDSprite s2 = new TwoDSprite(idsy, matrix, true, 10);
  126.         myCompositor.addMember (s2);
  127.  
  128.         matrix = new Matrix();
  129.         matrix.setTx(size.width / 2);
  130.         matrix.setTy(size.height / 2);
  131.         TwoDSprite s3 = new TwoDSprite(seq, 15, matrix, true, 10);
  132.         myCompositor.addMember (s3);
  133.         ImageSequencer is3 = new ImageSequencer (seq);
  134.         is3.setCurrentFrame (15);    //keep in sync with sprite's current image
  135.         is3.setLooping (ImageSequencer.kLoopForwards);
  136.  
  137.         SimpleActionList al = new SimpleActionList();
  138.         ImageSequencer is = new ImageSequencer (seq);
  139.         is.setLooping (ImageSequencer.kLoopForwards);
  140.         al.addMember (new NextImageAction (15, 1, is, s1));
  141.         BounceAction b1 = new BounceAction (20, 1, myCompositor, s1, 1, 2);
  142.         b1.setActionable (new Actionable () {
  143.             public void trigger () {
  144.                 try {
  145.                     nc.playNoteFor (kCrashCymbal, 127, 20);
  146.                 } catch (QTException e) {
  147.                     e.printStackTrace();
  148.                 }
  149.             }
  150.         });
  151.         al.addMember (b1);
  152.                     // 360 degrees at a scale of 20
  153.         al.addMember (new RotateAction (360, 20, myCompositor, s3));
  154.                     // 360/ (1/2)number of images changes at a scale of 20
  155.         al.addMember (new NextImageAction ((360 / seq.size() / 2), 20, is3, s3));
  156.         al.addMember (new BounceAction (1, 10, myCompositor, s3, 1, 1)); // a slow drift
  157.         myCompositor.addController(al);
  158.  
  159.     //all mouse downs with NO modifiers pressed will drag all sprites
  160.         Dragger dragger = new Dragger (MouseResponder.kNoModifiersMask);
  161.         dragger.setActionable (new Actionable () {
  162.             public void trigger () {
  163.                 try {
  164.                     nc.playNoteFor (kRideCymbal, 127, 80);
  165.                 } catch (QTException e) {
  166.                     e.printStackTrace();
  167.                 }
  168.             }
  169.         });
  170.         SWController ct = new SWController (dragger, true);
  171.         myCompositor.addController (ct);
  172.         
  173.     //only shift key down when mouse pressed will allow sprite number 2 & 3 to be scaled when dragged
  174.         MouseController controller = new SWController (new Scaler (400, InputEvent.SHIFT_MASK), false);
  175.         controller.addMember (s3);
  176.         controller.addMember (s2);
  177.         myCompositor.addController (controller);
  178.  
  179.     //only option/alt key will allow sprite number 3 to be skewed when dragged
  180.         controller = new SWController (new Skewer (200, 200, InputEvent.ALT_MASK), false);
  181.         controller.addMember (s2);
  182.         myCompositor.addController (controller);
  183.         
  184.         // this responder responds to rollover type events on sprites when NO modifiers are pressed
  185.         final GenericResponder gr = GenericResponder.asRolloverListener (MouseResponder.kNoModifiersMask, MouseResponder.kModifiersExactMatch);
  186.         // add a listener to play notes when rolled over 
  187.         // add sets the graphics mode to blend using lightGray
  188.         gr.addQTMouseMotionListener (new QTMouseMotionAdapter () {
  189.             GenericResponder g = gr;
  190.             GraphicsMode savedGM;
  191.             GraphicsMode setGM = new GraphicsMode (QDConstants.blend, QDColor.lightGray);
  192.             
  193.             public void mouseDragged (MouseEvent event) {
  194.                 try {
  195.                     nc.playNoteFor (kClosedHiHat, 127, 80);
  196.                 } catch (QTException e) {
  197.                     e.printStackTrace();
  198.                 }
  199.             }
  200.  
  201.             public void mouseMoved (MouseEvent event) {
  202.                 try {
  203.                     nc.playNoteFor (kClosedHiHat, 127, 80);
  204.                 } catch (QTException e) {
  205.                     e.printStackTrace();
  206.                 }
  207.             }
  208.  
  209.             public void mouseEnteredTarget (MouseEvent event) {
  210.                 try {
  211.                     if (g.getTarget() instanceof TwoDSprite) {    // just for sanity
  212.                         TwoDSprite sprite = (TwoDSprite)g.getTarget();
  213.                         savedGM = sprite.getGraphicsMode();
  214.                         sprite.setGraphicsMode (setGM);
  215.                     }
  216.                     nc.playNoteFor (kSnareDrum, 127, 80);
  217.                 } catch (QTException e) {
  218.                     throw new QTRuntimeException (e);
  219.                 }
  220.             }
  221.  
  222.             public void mouseExitedTarget (MouseEvent event) {
  223.                 try {
  224.                     if (g.getTarget() instanceof TwoDSprite) {    // just for sanity
  225.                         TwoDSprite sprite = (TwoDSprite)g.getTarget();
  226.                         sprite.setGraphicsMode (savedGM);
  227.                     }
  228.                     nc.playNoteFor (kOpenHiHat, 127, 80);
  229.                 } catch (QTException e) {
  230.                     throw new QTRuntimeException (e);
  231.                 }
  232.             }
  233.         });
  234.         SWController ctr = new SWController (gr, true);
  235.         myCompositor.addController (ctr);
  236.     }
  237. }
  238.