Presentation is loading. Please wait.

Presentation is loading. Please wait.

Multimedia in Java Multimedia combines graphics, animation and sound

Similar presentations


Presentation on theme: "Multimedia in Java Multimedia combines graphics, animation and sound"— Presentation transcript:

1 Multimedia in Java Multimedia combines graphics, animation and sound
Since we’ve already spent time dealing on computer graphics, so we will focus on animation and sound To perform animation, we want to call repaint( ) every few milliseconds how does our program know when a few milliseconds elapse? there is a Timer class available set it for 20 milliseconds and every 20 milliseconds, the Timer generates an ActionEvent we implement an ActionListener to handle the ActionEvent as we did with JButtons ActionEvent is handled by implementing an actionPerformed method in the case of animation, the actionPerformed method may only have to add 1 to the x or y coordinate of the item we are drawing, and then call repaint( )

2 Timer class A Timer object is instantiated by:
Timer t = new Timer(duration, handler); duration is the time (in milliseconds) that elapses between Timer-generated events, such as 20 or 50 handler is the object that handles the Timer-generated events we will usually just use this and implement actionPerformed in our class whenever possible (this may not be easy if we also implement an ActionListener in this class to handle JButtons import java.awt.event.*; add “implements ActionListener” to our class header instantiate the Timer as t = new Timer(10, this); but use whatever value you want for the duration, 10 or 20 would be adequate for most applications start the timer by using t.start( ); if we need to stop the timer, we use t.stop( ); that’s about all there is to it!

3 Timer Skeleton import javax.swing.*; import java.awt.event.*;
public class TimerSkeleton implements ActionListener { private Timer t; // other instance data go here as needed public TimerSkeleton( ) t = new Timer(10, this); t.start( ); // other initialization operations go here as needed } // other methods go here as needed public void actionPerformed(ActionEvent e) // whatever you want to happen when the Timer pulses go here Timer Skeleton

4 What Should actionPerformed Do?
This depends on why you are using a Timer to move an object in a Graphics panel (e.g., a ball) alter the x and y coordinates and call repaint( ) for a Game: calculate where game objects (say a spacecraft or a missile) have moved and redraw them this may require the user of an array of x and an array of y values to store the various objects, or multiple variables such as myX, myY, yourX, yourY, or both (the arrays might store the X and Y coordinates of missiles launched from one to the other) for Animation: if our item being drawn is represented by an array of different figures then just increment the array index and repaint( ) we will see an example of a StickFigure, but this could also be done by having a series of jpg or gif files all pre-loaded into an array of Images

5 Moving a Game Object Imagine that your class draws on a JPanel an ImageIcon (say of a spaceship) currently, the spaceship is located at coordinates x, y the following actionPerformed method will randomly move the spaceship on the screen x and y should be class variables so that you could do g.drawImage(image, x, y, this); in your paintComponent method public void actionPerformed(ActionEvent e) { int dx = generator.nextInt(2); // generate a # from -1 to +1 int dy = generator.nextInt(2); // generate a # from -1 to +1 x += dx; // move the piece in a random x direction y += dy; // move the piece in a random y direction repaint( ); // assume repaint does drawImage at x, y }

6 Full Example Code public TimerExample( ) { t = new Timer(10, this);
t.start( ); x = 150; y = 150; repaint( ); } public void actionPerformed(ActionEvent ev) int distanceX = generator.nextInt(2)); int distanceY = generator.nextInt(2)); x += distanceX; y += distanceY; repaint( ); public void paintComponent(Graphics g) super.paintComponent(g); g.setColor(Color.red); g.fillOval(x, y, 5, 5); At each Timer Event, randomly move the object (a red circle) up/down/left/right by 0 or 1 unit Note: we could make it more realistic by generating a random int from 1-9 and move it in one of 8 directions or leave it stationary (1 = upper left, or subtract 1 from x and y, 2 = straight up, etc)

7 Handling Multiple ActionEvents
private static class ExamplePanel extends JPanel implements ActionListener { private Timer t; private JButton b; public ExamplePanel( ) t = new Timer(1000, this); t.start(); b = new JButton("Button"); b.addActionListener(this); add(b); } public void actionPerformed(ActionEvent e) if(e.getSource( )= =t) System.out.println("Timer pulsed"); else if(e.getSource( )= =b) System.out.println("Button pressed");

8 Moving Multiple Items How would a game like Asteroids work?
we need to keep track of the <x, y> coordinates of multiple values, just like we did with our paint program so we create an array of x, y, dx and dy int values private int[ ] x, y, dx, dy; // dx, dy – velocity of x, y private int num; // number of items in the arrays actionPerformed now manipulates all items in the array and paintComponent draws them all public void actionPerformed(ActionEvent e) { for(int i=0;i<num;i++) { x[i]+=dx[i]; y[i]+=dy[i]; } If x[i] or y[i] reaches a boundary (0 or max X/Y) then change dx or dy to be the opposite (multiply by -1)

9 Sound/Music Just as Java has a facility for displaying an image using the ImageIcon class, you can also play sounds/music this facility is only available through the Applet class or through an IO class created by Sun The harder way: import java.applet.* create a nested inner class that extends Applet, include an instance data of type AudioClip and in the Applet constructor, instantiate an Applet object: aClip = Applet.newAudioClip(getClass( ).getResource(filename)); add an accessor method to your Applet to return the audio clip The slightly easier way: import java.io.*; and sun.audio.*; create objects of types InputStream and AudioStream and then tell the AudioPlayer class to play your AudioStream

10 import java.applet.*; // needed to generate an AudioClip
public class AudioExample2 { public static void main(String[] args) AClip a = new AClip(); // create an Applet AudioClip c = a.getClip(); // use the Applet to generate an AudioClip c.play( ); // play the AudioClip } private static class AClip extends Applet // Applet as an inner class used to { // generate AudioClip objects private static AudioClip a; // Our AudioClip public AClip() // constructor a = Applet.newAudioClip(getClass( ).getResource("chimes.wav")); } // getClass( ) returns the file location of this class // getResource returns the actual item, in this case a wav file public AudioClip getClip() // accessor return a; AudioClip Example

11 Another Audio Example import java.io.*; // use this to create an InputStream import sun.audio.*; // another class that can be used to play audio public class AudioExample2 { public static void main(String[ ] args) try // create an AudioStream of the wav file InputStream in = new FileInputStream("chimes.wav"); AudioStream as = new AudioStream(in); // play the AudioStream AudioPlayer.player.start(as); // use the following instead to play the wav file repeatedly in a continuous loop //AudioData data = as.getData(); //ContinuousAudioDataStream cas = // new ContinuousAudioDataStream (data); //AudioPlayer.player.start(cas); } catch(IOException ex) { // any code here will be used if trying the audio player doesn’t work!}


Download ppt "Multimedia in Java Multimedia combines graphics, animation and sound"

Similar presentations


Ads by Google