![Page 1: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/1.jpg)
Chapter 9Described Dynamic Visual Content
The Design and Implementation ofMultimedia Software
David Bernstein
Jones and Bartlett Publishers
www.jbpub.com
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 1 / 153
![Page 2: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/2.jpg)
Introduction
About this Chapter
• This chapter considers ways in which one can describe the way thevisual ‘stream’ changes over time.
• This chapter uses the analogy of the theater (and acting).
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 2 / 153
![Page 3: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/3.jpg)
A ‘Quick Start’
What’s Next
We need some instant gratification.
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 3 / 153
![Page 4: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/4.jpg)
A ‘Quick Start’
Requirements
F9.1 Manage a collection of sprites.
F9.2 Repeatedly inform each sprite that it should perform thenext task in its script.
F9.3 Render the sprites.
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 4 / 153
![Page 5: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/5.jpg)
A ‘Quick Start’
Alternative 1
• Approach:
Add code to the Visualization class.
• Shortcomings:
What are the shortcomings?
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 5 / 153
![Page 6: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/6.jpg)
A ‘Quick Start’
Alternative 1
• Approach:
Add code to the Visualization class.
• Shortcomings:
Complexity – There is no reason that someone who is interested instatic visual content should have to understand features that arerequired to work with dynamic visual content.
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 5 / 153
![Page 7: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/7.jpg)
A ‘Quick Start’
Alternative 2
• Approach:
Use the decorator pattern.
• Shortcomings:
What are the shortcomings?
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 6 / 153
![Page 8: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/8.jpg)
A ‘Quick Start’
Alternative 2
• Approach:
Use the decorator pattern.
• Shortcomings:
It is hard to imagine a situation in which, at run time, one wouldwant to add these kinds of capabilities to a Visualization object.
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 6 / 153
![Page 9: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/9.jpg)
A ‘Quick Start’
Alternative 3
Create a Stage class that specializes the Visualization class.
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 7 / 153
![Page 10: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/10.jpg)
A ‘Quick Start’
Comparison to the Screen Class
• Similarities:
Addition of a Metronome.
The ability to respond to ‘ticks’.
• Differences:
No notion of a frame (since sprites might need to change theirbehavior at any time).
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 8 / 153
![Page 11: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/11.jpg)
A ‘Quick Start’
Sprite
package visual.dynamic.described;
public interface Sprite extends event.MetronomeListener,
visual.statik.TransformableContent
{
}
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 9 / 153
![Page 12: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/12.jpg)
A ‘Quick Start’
Stage – Structure
package visual.dynamic.described;
import java.awt.*;
import java.util.*;
import event.*;
import visual.*;
import visual.statik.sampled.*;
public class Stage extends Visualization
implements MetronomeListener
{
private boolean shouldRestart;
private int timeStep, restartTime, time;
private Metronome metronome;
public Stage(int timeStep)
{
this(timeStep, new Metronome(timeStep));
}
public Stage(int timeStep, Metronome metronome)
{
super();
this.timeStep = timeStep;
time = -timeStep;
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 10 / 153
![Page 13: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/13.jpg)
A ‘Quick Start’
Stage – Structure (cont.)
shouldRestart = false;
restartTime = -1;
this.metronome = metronome;
setBackground(Color.WHITE);
// The first listener is notified last
metronome.addListener(this);
}
}
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 11 / 153
![Page 14: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/14.jpg)
A ‘Quick Start’
Stage – Metronome
public void setRestartTime(int restartTime)
{
if (restartTime < 0)
{
this.restartTime = -1;
shouldRestart = false;
}
else
{
this.restartTime = restartTime;
shouldRestart = true;
}
}
public void start()
{
metronome.start();
}
public void stop()
{
metronome.stop();
}
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 12 / 153
![Page 15: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/15.jpg)
A ‘Quick Start’
Stage – Managing Sprite Objects
public void add(Sprite sprite)
{
// Make the Sprite a MetronomeListener
metronome.addListener(sprite);
// Treat the Sprite as a SimpleContent and
// add it to the Visualization
super.add(sprite);
}
public void remove(Sprite sprite)
{
metronome.removeListener(sprite);
super.remove(sprite);
}
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 13 / 153
![Page 16: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/16.jpg)
A ‘Quick Start’
Stage – handleTick()
public void handleTick(int time)
{
if ((shouldRestart) && (time > restartTime))
{
metronome.setTime(-timeStep);
}
repaint();
}
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 14 / 153
![Page 17: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/17.jpg)
A ‘Quick Start’
Satisfying Requirements 9.2 and 9.3
• A class that implements the Sprite interface must have ahandleTick().
• A class that implements the Sprite interface must have arender() method.
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 15 / 153
![Page 18: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/18.jpg)
A ‘Quick Start’
Alternative 1
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 16 / 153
![Page 19: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/19.jpg)
A ‘Quick Start’
Alternative 2
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 17 / 153
![Page 20: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/20.jpg)
A ‘Quick Start’
Advantages of Alternative 2
What are the advantages?
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 18 / 153
![Page 21: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/21.jpg)
A ‘Quick Start’
Advantages of Alternative 2
Can decorate different SimpleContent objects in the same way(e.g., FallingSprite could decorate SimpleContent that lookslike a leaf, a raindrop, a snowflake, etc).
Can associate a different SimpleContent object with a particularSprite at different points in time (e.g., a WalkingPersonSprite
might use different sampled.Content objects to represent its legsat different points in the walking process).
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 18 / 153
![Page 22: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/22.jpg)
A ‘Quick Start’
The Next Question to Address
• The Question:
How to incorporate a ‘script’ in objects that implement the Spriteinterface.
• Common Approaches:
Use ‘rules’
Interpolate between known states
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 19 / 153
![Page 23: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/23.jpg)
A ‘Quick Start’
Alternative 1
What are the shortcomings?
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 20 / 153
![Page 24: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/24.jpg)
A ‘Quick Start’
Alternative 1
It is a little confusing since a ConcreteSprite decorates anAbstractSprite which, in turn, decorates aTransformableContent object.
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 20 / 153
![Page 25: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/25.jpg)
A ‘Quick Start’
Alternative 2
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 21 / 153
![Page 26: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/26.jpg)
A ‘Quick Start’
Alternative 3
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 22 / 153
![Page 27: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/27.jpg)
A ‘Quick Start’
Comparing Alternatives 2 and 3
• Thoughts:
Both have a lot to offer.
Specialization is simpler.
It seems unlikely that the system will need to change a rule-basedsprite to an interpolating sprite at run-time.
• Fortunately:
One could use the strategy pattern in the future without breakingany ‘legacy’ classes that used specialization.
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 23 / 153
![Page 28: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/28.jpg)
A ‘Quick Start’
AbstractSprite – Structure
package visual.dynamic.described;
import java.awt.*;
import java.awt.geom.*;
import java.util.*;
import javax.swing.*;
import visual.statik.TransformableContent;
public abstract class AbstractSprite
implements Sprite
{
protected boolean rotationPoint, visible;
protected double angle, rotationX, rotationY;
protected double scaleX, scaleY, x, y;
public AbstractSprite()
{
super();
x = 0.0;
y = 0.0;
angle = 0.0;
scaleX = 1.0;
scaleY = 1.0;
rotationPoint = false;
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 24 / 153
![Page 29: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/29.jpg)
A ‘Quick Start’
AbstractSprite – Structure (cont.)
rotationX = 0.0;
rotationY = 0.0;
}
}
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 25 / 153
![Page 30: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/30.jpg)
A ‘Quick Start’
AbstractSprite – Some Abstract Methods
public abstract void handleTick(int time);
protected abstract TransformableContent getContent();
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 26 / 153
![Page 31: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/31.jpg)
A ‘Quick Start’
AbstractSprite – Setters
public void setLocation(double x, double y)
{
this.x = x;
this.y = y;
}
public void setRotation(double r, double x, double y)
{
rotationPoint = true;
this.angle = r;
this.x = x;
this.y = y;
}
public void setRotation(double r)
{
rotationPoint = false;
this.angle = r;
}
public void setScale(double sx, double sy)
{
scaleX = sx;
scaleY = sy;
}
public void setScale(double s)
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 27 / 153
![Page 32: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/32.jpg)
A ‘Quick Start’
AbstractSprite – Setters (cont.)
{
setScale(s, s);
}
public void setVisible(boolean v)
{
visible = v;
}
}
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 28 / 153
![Page 33: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/33.jpg)
A ‘Quick Start’
AbstractSprite – getBounds()
public Rectangle2D getBounds2D(boolean ofTransformed)
{
return getContent().getBounds2D(ofTransformed);
}
public Rectangle2D getBounds2D()
{
return getBounds2D(true);
}
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 29 / 153
![Page 34: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/34.jpg)
A ‘Quick Start’
AbstractSprite – Rendering
public void render(Graphics g)
{
double rx, ry;
Rectangle2D bounds;
TransformableContent tc;
if (visible)
{
tc = getContent();
if (tc != null)
{
// Find the point to rotate around
if (rotationPoint)
{
rx = rotationX;
ry = rotationY;
}
else
{
bounds = tc.getBounds2D(false);
rx = bounds.getWidth()/2.0;
ry = bounds.getHeight()/2.0;
}
// Transform
tc.setLocation(x, y);
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 30 / 153
![Page 35: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/35.jpg)
A ‘Quick Start’
AbstractSprite – Rendering (cont.)
tc.setRotation(angle, rx, ry);
tc.setScale(scaleX, scaleY);
// Render
tc.render(g);
}
}
}
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 31 / 153
![Page 36: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/36.jpg)
A ‘Quick Start’
What’s Next?
• We need to create specializations of the AbstractSprite class.
• For example, let’s consider a simple rule-based sprite that ‘floats’from the top of the Stage to the bottom of the Stage.
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 32 / 153
![Page 37: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/37.jpg)
A ‘Quick Start’
FloatingSprite – Structure
import java.awt.*;
import java.awt.geom.*;
import java.util.*;
import visual.dynamic.described.*;
import visual.statik.TransformableContent;
public class FloatingSprite extends AbstractSprite
{
private double maxX, maxY, x, y;
private Random rng;
private TransformableContent content;
public FloatingSprite(TransformableContent content,
double width, double height)
{
super();
this.content = content;
maxX = width;
maxY = height;
rng = new Random();
x = rng.nextDouble()*maxX;
y = 0.0;
setLocation(x, y);
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 33 / 153
![Page 38: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/38.jpg)
A ‘Quick Start’
FloatingSprite – Structure (cont.)
setVisible(true);
}
}
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 34 / 153
![Page 39: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/39.jpg)
A ‘Quick Start’
FloatingSprite – getContent()
public TransformableContent getContent()
{
return content;
}
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 35 / 153
![Page 40: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/40.jpg)
A ‘Quick Start’
FloatingSprite – handleTick()
public void handleTick(int time)
{
double n;
n = rng.nextDouble();
if (n < 0.80) y += 2.0;
else if (n > 0.90) y -= 1.0;
n = rng.nextDouble();
if (n < 0.20) x -= 1.0;
else if (n > 0.80) x += 1.0;
// Check if at the bottom
if (y > maxY)
{
y = 0.0;
x = rng.nextDouble()*maxX;
}
setLocation(x, y);
}
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 36 / 153
![Page 41: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/41.jpg)
A ‘Quick Start’
FloatingSpriteDemo
FloatingSprite sprite;
ResourceFinder finder;
TransformableContent content;
int width = 640;
int height = 480;
finder = ResourceFinder.createInstance(resources.Marker.class);
ContentFactory factory = new ContentFactory(finder);
// The Stage
Stage stage = new Stage(50);
stage.setBackground(new Color(255, 255, 255));
VisualizationView stageView = stage.getView();
stageView.setBounds(0,0,width,height);
// The Sprite
content = factory.createContent("snowflake.png", 4, false);
sprite = new FloatingSprite(content, width, height);
stage.add(sprite);
// The content pane
JPanel contentPane = (JPanel)getContentPane();
contentPane.add(stageView);
// Start the dynamics
stage.start();
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 37 / 153
![Page 42: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/42.jpg)
A ‘Quick Start’
FloatingSpriteDemo – Demonstration
In examples/chapter:java -cp multimedia2.jar;examples.jar FloatingSpriteDemo
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 38 / 153
![Page 43: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/43.jpg)
Encapsulating Rule-Based Dynamics
What’s Next
We need to consider the encapsulation of rule-based dynamics.
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 39 / 153
![Page 44: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/44.jpg)
Encapsulating Rule-Based Dynamics
Requirements
F9.4 Allow one sprite to interact with another.
F9.5 Allow the user to interact with sprites.
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 40 / 153
![Page 45: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/45.jpg)
Encapsulating Rule-Based Dynamics Sprite Interactions
Determining if Rectangles Do Not Intersect
B
A
Right sideof B
Left sideof A
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 41 / 153
![Page 46: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/46.jpg)
Encapsulating Rule-Based Dynamics Sprite Interactions
Determining if Rectangles Do Not Intersect (cont.)
Letting rightA, leftA, topA and botA denote the right, left, top, andbottom of A, and rightB, leftB, topB and botB denote the right, left,top, and bottom of B, the expression to use to test if A and B do not
intersect is:
(rightA < leftB) || (leftA > rightB) || (botA < topB) || (topA > botB)
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 42 / 153
![Page 47: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/47.jpg)
Encapsulating Rule-Based Dynamics Sprite Interactions
Intersection of Non-Rectangular, Convex Sprites
B
A
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 43 / 153
![Page 48: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/48.jpg)
Encapsulating Rule-Based Dynamics Sprite Interactions
Using Bounding Boxes
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 44 / 153
![Page 49: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/49.jpg)
Encapsulating Rule-Based Dynamics Sprite Interactions
AbstractSprite – intersects()
public boolean intersects(Sprite s)
{
boolean retval;
double maxx, maxy, minx, miny;
double maxxO, maxyO, minxO, minyO;
Rectangle2D r;
retval = true;
r = getBounds2D(true);
minx = r.getX();
miny = r.getY();
maxx = minx + r.getWidth();
maxy = miny + r.getHeight();
r = s.getBounds2D(true);
minxO = r.getX();
minyO = r.getY();
maxxO = minxO + r.getWidth();
maxyO = minyO + r.getHeight();
if ( (maxx < minxO) || (minx > maxxO) ||
(maxy < minyO) || (miny > maxyO) ) retval = false;
return retval;
}
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 45 / 153
![Page 50: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/50.jpg)
Encapsulating Rule-Based Dynamics Sprite Interactions
RuleBasedSprite
package visual.dynamic.described;
import java.awt.*;
import java.awt.geom.*;
import java.util.*;
import visual.statik.TransformableContent;
public abstract class RuleBasedSprite extends AbstractSprite
{
protected ArrayList<Sprite> antagonists;
protected TransformableContent content;
public RuleBasedSprite(TransformableContent content)
{
super();
antagonists = new ArrayList<Sprite>();
this.content = content;
setVisible(true);
}
public void addAntagonist(Sprite antagonist)
{
antagonists.add(antagonist);
}
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 46 / 153
![Page 51: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/51.jpg)
Encapsulating Rule-Based Dynamics Sprite Interactions
RuleBasedSprite (cont.)
public TransformableContent getContent()
{
return content;
}
public abstract void handleTick(int time);
public void removeAntagonist(Sprite antagonist)
{
antagonists.remove(antagonist);
}
}
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 47 / 153
![Page 52: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/52.jpg)
Encapsulating Rule-Based Dynamics Sprite Interactions
Fish – Structure
import java.util.*;
import visual.dynamic.described.*;
import visual.statik.TransformableContent;
public class Fish extends RuleBasedSprite
{
protected double initialSpeed, maxX, maxY, speed, x, y;
private static final int INITIAL_LOCATION = -320;
private static final Random rng = new Random();
public Fish(TransformableContent content,
double width, double height, double speed)
{
super(content);
maxX = width;
maxY = height;
x = rng.nextDouble()*maxX;
y = rng.nextInt()*maxY;
this.initialSpeed = speed;
this.speed = speed;
}
}
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 48 / 153
![Page 53: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/53.jpg)
Encapsulating Rule-Based Dynamics Sprite Interactions
Fish – updateLocation()
protected void updateLocation()
{
x += speed;
if (x > (int)maxX)
{
x = INITIAL_LOCATION;
y = rng.nextDouble()*maxX;
speed = initialSpeed;
}
// Set the location
setLocation(x, y);
}
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 49 / 153
![Page 54: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/54.jpg)
Encapsulating Rule-Based Dynamics Sprite Interactions
Fish – handleTick()
public void handleTick(int time)
{
double initialSpeed;
Iterator<Sprite> i;
Sprite shark;
initialSpeed = speed;
i = antagonists.iterator();
while (i.hasNext())
{
shark = i.next();
if (intersects(shark)) speed = 20.;
}
updateLocation();
}
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 50 / 153
![Page 55: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/55.jpg)
Encapsulating Rule-Based Dynamics Sprite Interactions
FishTankDemo
int width = 640;
int height = 480;
finder = ResourceFinder.createInstance(resources.Marker.class);
ContentFactory factory = new ContentFactory(finder);
ImageFactory imageFactory = new ImageFactory(finder);
// The Stage
Stage stage = new Stage(50);
stage.setBackground(Color.blue);
Content content = factory.createContent("ocean.png", 3, false);
stage.add(content);
stageView = stage.getView();
stageView.setBounds(0,0,width,height);
// The Shark
content = factory.createContent("shark.png", 4, false);
Fish shark = new Fish(content, width, height, 8.);
stage.add(shark);
// The school of Fish
// (Use the same BufferedImage object for all Fish)
image = imageFactory.createBufferedImage("fish.png", 4);
for (int i=0; i<10; i++)
{
content = factory.createContent(image, false);
Fish fish = new Fish(content, width, height, 3.);
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 51 / 153
![Page 56: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/56.jpg)
Encapsulating Rule-Based Dynamics Sprite Interactions
FishTankDemo (cont.)
fish.addAntagonist(shark);
stage.add(fish);
}
// The content pane
JPanel contentPane = (JPanel)getContentPane();
contentPane.add(stageView);
stage.start();
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 52 / 153
![Page 57: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/57.jpg)
Encapsulating Rule-Based Dynamics Sprite Interactions
FishTankDemo – Demonstration
In examples/chapter:java -cp multimedia2.jar;examples.jar FishTankDemo
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 53 / 153
![Page 58: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/58.jpg)
Encapsulating Rule-Based Dynamics Supplementary Material
Sprites with Multiple Pieces of Content
• The Objective:
Make a fish appear to move it’s tail.
• What’s Needed?
What’s Needed?
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 54 / 153
![Page 59: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/59.jpg)
Encapsulating Rule-Based Dynamics Supplementary Material
Sprites with Multiple Pieces of Content
• The Objective:
Make a fish appear to move it’s tail.
• What’s Needed?
Different Content objects for different states.
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 54 / 153
![Page 60: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/60.jpg)
Encapsulating Rule-Based Dynamics Supplementary Material
A Sprite with Multiple Pieces of Content
import java.util.*;
import visual.dynamic.described.*;
import visual.statik.TransformableContent;
public class SwimmingFish extends RuleBasedSprite
{
protected double initialSpeed, maxX, maxY, speed, x, y;
protected int lastTime, millisPerState, state, stateChange;
protected int timeInState;
protected TransformableContent[] contents;
private static final int INITIAL_LOCATION = -320;
private static final Random rng = new Random();
public SwimmingFish(TransformableContent[] contents,
double width, double height, double speed)
{
super(contents[0]);
this.contents = contents;
maxX = width;
maxY = height;
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 55 / 153
![Page 61: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/61.jpg)
Encapsulating Rule-Based Dynamics Supplementary Material
A Sprite with Multiple Pieces of Content (cont.)
x = rng.nextDouble()*maxX;
y = rng.nextInt()*maxY;
this.initialSpeed = speed;
this.speed = speed;
state = 0;
lastTime = 0;
timeInState = 0;
stateChange = 1;
}
public TransformableContent getContent()
{
return contents[state];
}
public void handleTick(int time)
{
double initialSpeed;
Iterator<Sprite> i;
Sprite shark;
initialSpeed = speed;
i = antagonists.iterator();
while (i.hasNext())
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 56 / 153
![Page 62: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/62.jpg)
Encapsulating Rule-Based Dynamics Supplementary Material
A Sprite with Multiple Pieces of Content (cont.)
{
shark = i.next();
if (intersects(shark)) speed = 20.;
}
millisPerState = 500 - (int)(speed*20);
timeInState += (time - lastTime);
if (timeInState > millisPerState)
{
timeInState = 0;
state += stateChange;
if (state == 2) stateChange = -1;
else if (state == 0) stateChange = 1;
}
lastTime = time;
updateLocation();
}
protected void updateLocation()
{
x += speed;
if (x > (int)maxX)
{
x = INITIAL_LOCATION;
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 57 / 153
![Page 63: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/63.jpg)
Encapsulating Rule-Based Dynamics Supplementary Material
A Sprite with Multiple Pieces of Content (cont.)
y = rng.nextDouble()*maxX;
speed = initialSpeed;
}
// Set the location
setLocation(x, y);
}
}
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 58 / 153
![Page 64: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/64.jpg)
Encapsulating Rule-Based Dynamics Supplementary Material
SwimmingFishTankDemo – Demonstration
In extras:java -cp multimedia2.jar;examples.jar SwimmingFishTankDemo
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 59 / 153
![Page 65: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/65.jpg)
Encapsulating Rule-Based Dynamics Supplementary Material
Sprites that Move Together
• The Objective:
Different Sprite objects move together (e.g., exhaust coming out ofa bus).
• What’s Needed?
What’s Needed?
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 60 / 153
![Page 66: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/66.jpg)
Encapsulating Rule-Based Dynamics Supplementary Material
Sprites that Move Together
• The Objective:
Different Sprite objects move together (e.g., exhaust coming out ofa bus).
• What’s Needed?
One Sprite object that “controls” other Sprite objects.
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 60 / 153
![Page 67: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/67.jpg)
Encapsulating Rule-Based Dynamics Supplementary Material
Sprites that Move Together – Code
import java.awt.*;
import java.awt.geom.*;
import visual.dynamic.described.*;
import visual.statik.sampled.*;
public class BigBus extends RuleBasedSprite
{
private double maxX, maxY, x, y;
private Exhaust[] exhaust;
public BigBus(TransformableContent content,
double width, double height,
Stage stage)
{
super(content);
exhaust = new Exhaust[15];
for (int i=0; i<exhaust.length; i++)
{
exhaust[i] = new Exhaust();
stage.add(exhaust[i]);
}
x = 0.0;
y = 300.0;
maxX = width;
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 61 / 153
![Page 68: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/68.jpg)
Encapsulating Rule-Based Dynamics Supplementary Material
Sprites that Move Together – Code (cont.)
maxY = height;
}
public void handleTick(int millis)
{
// Move the bus
x = x + 1;
setLocation(x, y);
if (x > maxX+50)
{
setVisible(false);
for (int i=0; i<exhaust.length; i++)
exhaust[i].setVisible(false);
}
// Set the origin for the Exhaust objects
for (int i=0; i<exhaust.length; i++)
exhaust[i].setOrigin(x, y+63);
// Inform the Exhaust objects that a tick has occurred
for (int i=0; i<exhaust.length; i++)
exhaust[i].handleTick(millis);
}
}
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 62 / 153
![Page 69: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/69.jpg)
Encapsulating Rule-Based Dynamics Supplementary Material
Sprites that Move Together – Code (cont.)
import java.awt.*;
import java.awt.geom.*;
import java.util.Random;
import visual.dynamic.described.*;
import visual.statik.described.*;
public class Exhaust extends RuleBasedSprite
{
private double originX, originY;
private int count, length, slope;
private static final int DIAMETER = 5;
private static final Random rng = new Random();
public Exhaust()
{
super(new Content(new Ellipse2D.Float(0,0,DIAMETER,DIAMETER),
Color.BLACK,
Color.GRAY,
new BasicStroke()
)
);
length = rng.nextInt(15);
count = -1;
}
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 63 / 153
![Page 70: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/70.jpg)
Encapsulating Rule-Based Dynamics Supplementary Material
Sprites that Move Together – Code (cont.)
public void handleTick(int millis)
{
count++;
if (count >= length)
{
count = 0;
setLocation(originX, originY);
}
else
{
slope = rng.nextInt(4) - 1;
setLocation(originX-count, originY-(count*slope));
}
}
public void setOrigin(double x, double y)
{
originX = x - DIAMETER/2;
originY = y - DIAMETER/2;
}
}
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 64 / 153
![Page 71: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/71.jpg)
Encapsulating Rule-Based Dynamics Supplementary Material
Sprites that Move Together – Demonstration
In extras:java -cp multimedia2.jar;examples.jar BigBusDemo
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 65 / 153
![Page 72: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/72.jpg)
Encapsulating Rule-Based Dynamics User Interaction
Satisfying Requirement 9.5
• Interested Sprite objects must be able to observe user-generatedevents.
They can implement the KeyListener interface and/or theMouseListener and MouseMotionListener interfaces.
• A subject is needed.
The VisualizationView class extends the JComponent class, andthe JComponent class provides this functionality.
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 66 / 153
![Page 73: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/73.jpg)
Encapsulating Rule-Based Dynamics User Interaction
Visualization – Key Listeners
public void addKeyListener(KeyListener kl)
{
Iterator<VisualizationView> i;
VisualizationView view;
i = getViews();
while (i.hasNext())
{
view = i.next();
view.addKeyListener(kl);
}
}
public synchronized void removeKeyListener(
KeyListener kl)
{
Iterator<VisualizationView> i;
VisualizationView view;
i = getViews();
while (i.hasNext())
{
view = i.next();
view.removeKeyListener(kl);
}
}
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 67 / 153
![Page 74: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/74.jpg)
Encapsulating Rule-Based Dynamics User Interaction
Visualization – Mouse Listeners
public void addMouseListener(MouseListener ml)
{
Iterator<VisualizationView> i;
VisualizationView view;
i = getViews();
while (i.hasNext())
{
view = i.next();
view.addMouseListener(ml);
}
}
public void addMouseMotionListener(
MouseMotionListener mml)
{
Iterator<VisualizationView> i;
VisualizationView view;
i = getViews();
while (i.hasNext())
{
view = i.next();
view.addMouseMotionListener(mml);
}
}
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 68 / 153
![Page 75: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/75.jpg)
Encapsulating Rule-Based Dynamics User Interaction
Visualization – Mouse Listeners (cont.)
public synchronized void removeMouseListener(
MouseListener ml)
{
Iterator<VisualizationView> i;
VisualizationView view;
i = getViews();
while (i.hasNext())
{
view = i.next();
view.removeMouseListener(ml);
}
}
public synchronized void removeMouseMotionListener(
MouseMotionListener mml)
{
Iterator<VisualizationView> i;
VisualizationView view;
i = getViews();
while (i.hasNext())
{
view = i.next();
view.removeMouseMotionListener(mml);
}
}
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 69 / 153
![Page 76: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/76.jpg)
Encapsulating Rule-Based Dynamics User Interaction
An Example
• The Setting:
An amazingly addictive (and/or unbearably stupid) balloonpopping game.
• The Participants:
Cupola
Balloon
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 70 / 153
![Page 77: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/77.jpg)
Encapsulating Rule-Based Dynamics User Interaction
An Example – Demonstration
In examples/chapter:java -cp multimedia2.jar;examples.jar BalloonDemo
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 71 / 153
![Page 78: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/78.jpg)
Encapsulating Rule-Based Dynamics User Interaction
Cupola – Structure
import java.awt.event.*;
import java.awt.geom.*;
import visual.dynamic.described.*;
import visual.statik.TransformableContent;
public class Cupola extends RuleBasedSprite
implements MouseMotionListener
{
private double left, top;
public Cupola(TransformableContent content,
double stageWidth, double stageHeight)
{
super(content);
Rectangle2D bounds;
bounds = content.getBounds2D(false);
top = (stageHeight - bounds.getHeight() - 34);
left = (stageWidth - bounds.getWidth())/2.0;
setLocation(left, top);
}
}
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 72 / 153
![Page 79: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/79.jpg)
Encapsulating Rule-Based Dynamics User Interaction
Cupola – MouseMotionListener
public void mouseDragged(MouseEvent evt)
{
mouseMoved(evt);
}
public void mouseMoved(MouseEvent evt)
{
this.left = (double)evt.getX();
}
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 73 / 153
![Page 80: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/80.jpg)
Encapsulating Rule-Based Dynamics User Interaction
Cupola – handleTick()
public void handleTick(int time)
{
setLocation(left, top);
}
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 74 / 153
![Page 81: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/81.jpg)
Encapsulating Rule-Based Dynamics User Interaction
Balloon – handleTick()
public void handleTick(int time)
{
Sprite cupola;
// Wait for the initial rendering
if (time < 1000) return;
// Check for an intersection
cupola = null;
if (antagonists.size() > 0) cupola = antagonists.get(0);
if ((cupola != null) && (intersects(cupola)))
{
speed = 0;
setVisible(false);
}
// Update the location
top += speed;
if (top > maxY)
{
left = rng.nextInt(maxX);
top = minY;
speed = 1 + rng.nextInt(10);
}
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 75 / 153
![Page 82: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/82.jpg)
Encapsulating Rule-Based Dynamics User Interaction
Balloon – handleTick() (cont.)
// Set the location
setLocation(left, top);
}
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 76 / 153
![Page 83: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/83.jpg)
Encapsulating Key-Time Dynamics
What’s Next
We need to consider the encapsulation of key-time dynamics.
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 77 / 153
![Page 84: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/84.jpg)
Encapsulating Key-Time Dynamics
Jobs in Traditional Cel Animation
• Drawing backgrounds.
• Drawing key/important frames.
• Drawing all of the frames in between the key frames.
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 78 / 153
![Page 85: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/85.jpg)
Encapsulating Key-Time Dynamics
Requirements
F9.6 Support the description of dynamic behavior usingkey-times and tweening.
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 79 / 153
![Page 86: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/86.jpg)
Encapsulating Key-Time Dynamics
Alternative 1
• Approach:
Store the attributes of the TransformableContent objects at eachkey time in the TransformableContent objects themselves.
• Shortcomings:
What are the shortcomings?
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 80 / 153
![Page 87: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/87.jpg)
Encapsulating Key-Time Dynamics
Alternative 1
• Approach:
Store the attributes of the TransformableContent objects at eachkey time in the TransformableContent objects themselves.
• Shortcomings:
It makes it difficult to interpolate between the key times.
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 80 / 153
![Page 88: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/88.jpg)
Encapsulating Key-Time Dynamics
Alternative 2
• Approach:
Keep the attributes for each of the key times external to theTransformableContent objects.
• Advantages:
What are the advantages?
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 81 / 153
![Page 89: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/89.jpg)
Encapsulating Key-Time Dynamics
Alternative 2
• Approach:
Keep the attributes for each of the key times external to theTransformableContent objects.
• Advantages:
The Sprite has easy access to all of the information it needs tocalculate the attributes at the in-between times.
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 81 / 153
![Page 90: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/90.jpg)
Encapsulating Key-Time Dynamics
TweeningSprite – Structure
package visual.dynamic.described;
import java.awt.*;
import java.awt.geom.*;
import java.util.*;
import javax.swing.*;
public abstract class TweeningSprite extends AbstractSprite
{
protected ArrayList<Integer> keyTimes;
protected ArrayList<Point2D> locations;
protected ArrayList<Double> rotations, scalings;
private double frac;
private int currentIndex, endState, lastTime;
private int nextIndex, nextKT;
public static final int REMAIN = 0;
public static final int REMOVE = 1;
public TweeningSprite()
{
super();
keyTimes = new ArrayList<Integer>();
locations = new ArrayList<Point2D>();
rotations = new ArrayList<Double>();
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 82 / 153
![Page 91: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/91.jpg)
Encapsulating Key-Time Dynamics
TweeningSprite – Structure (cont.)
scalings = new ArrayList<Double>();
endState = REMAIN;
initialize();
}
}
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 83 / 153
![Page 92: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/92.jpg)
Encapsulating Key-Time Dynamics
TweeningSprite – addKeyTime()
protected int addKeyTime(int keyTime, Point2D location,
Double rotation, Double scaling)
{
boolean keepLooking;
int existingKT, i, index;
existingKT = -1;
keepLooking = true;
i = 0;
while ((i < keyTimes.size()) && keepLooking)
{
existingKT = ((Integer)keyTimes.get(i)).intValue();
if (existingKT >= keyTime) keepLooking = false;
else i++;
}
if ((existingKT == i) && !keepLooking) // Duplicate
{
i = -1;
}
else
{
keyTimes.add(i, new Integer(keyTime));
locations.add(i, location);
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 84 / 153
![Page 93: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/93.jpg)
Encapsulating Key-Time Dynamics
TweeningSprite – addKeyTime() (cont.)
rotations.add(i, rotation);
scalings.add(i, scaling);
}
return i;
}
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 85 / 153
![Page 94: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/94.jpg)
Encapsulating Key-Time Dynamics
Linear Interpolation
Letting at denote the value of the attribute at the previous/current keytime and at+1 denote the value of the attribute at the next key time,the in-between value, b(λ), is then given by:
b(λ) = (1− λ)at + λat+1 (1)
where λ ∈ [0, 1] denotes the interpolation fraction.
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 86 / 153
![Page 95: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/95.jpg)
Encapsulating Key-Time Dynamics
Linear Interpolation (cont.)
Note that (1) implies:
b(λ) = at − λat + λat+1 (2)
= at + λ(at+1 − at) (3)
which is the more widely-used form.
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 87 / 153
![Page 96: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/96.jpg)
Encapsulating Key-Time Dynamics Location and Rotation Tweening
Location Tweening
Registration Pointat Time t1
Registration Pointat Time t2
Registration Pointat Time t3
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 88 / 153
![Page 97: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/97.jpg)
Encapsulating Key-Time Dynamics Location and Rotation Tweening
TweeningSprite – tweenLocation
protected void tweenLocation(int currentIndex, int nextIndex,
double frac)
{
double x, y;
Point2D currentKTLocation, nextKTLocation;
currentKTLocation = locations.get(currentIndex);
nextKTLocation = locations.get(nextIndex);
x = currentKTLocation.getX() +
frac*(nextKTLocation.getX()- currentKTLocation.getX());
y = currentKTLocation.getY() +
frac*(nextKTLocation.getY() - currentKTLocation.getY());
setLocation(x, y);
}
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 89 / 153
![Page 98: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/98.jpg)
Encapsulating Key-Time Dynamics Location and Rotation Tweening
Pure Rotation Tweening
Rotated Contentat Time t1
Rotated Contentat Time t2
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 90 / 153
![Page 99: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/99.jpg)
Encapsulating Key-Time Dynamics Location and Rotation Tweening
TweeningSprite – Pure Rotation Tweening
currentKTRotation = rotation.doubleValue();
rotation = rotations.get(nextIndex);
if (rotation == null) nextKTRotation = currentKTRotation;
else nextKTRotation = rotation.doubleValue();
r = currentKTRotation + frac*(nextKTRotation-currentKTRotation);
}
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 91 / 153
![Page 100: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/100.jpg)
Encapsulating Key-Time Dynamics Location and Rotation Tweening
Aligned Rotation Tweening
Registration Pointat Time t1
Registration Pointat Time t2
y2 - y1
x x2 - 1
a
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 92 / 153
![Page 101: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/101.jpg)
Encapsulating Key-Time Dynamics Location and Rotation Tweening
Pure Rotation Tweening (cont.)
Thinking of the current segment as the hypotenuse of a right triangle,the difference in y values defines the length of the side opposite theangle of interest (denoted by α), and the difference in x values definesthe length of the adjacent side. Hence:
tan(α) =y2 − y1
x2 − x1(4)
It follows that:
α = atan
(
y2 − y1
x2 − x1
)
(5)
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 93 / 153
![Page 102: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/102.jpg)
Encapsulating Key-Time Dynamics Location and Rotation Tweening
TweeningSprite – Aligned Rotation Tweening
currentKTLocation = locations.get(currentIndex);
nextKTLocation = locations.get(nextIndex);
r=Math.atan((nextKTLocation.getY()-currentKTLocation.getY())/
(nextKTLocation.getX()-currentKTLocation.getX()) );
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 94 / 153
![Page 103: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/103.jpg)
Encapsulating Key-Time Dynamics Location and Rotation Tweening
An Example: Airplane
import java.awt.geom.*;
import java.awt.image.*;
import io.*;
import visual.dynamic.described.*;
import visual.statik.sampled.*;
public class Airplane extends SampledSprite
{
public Airplane()
{
super();
Content content;
ContentFactory factory;
factory = new ContentFactory(ResourceFinder.createInstance(this));
content = factory.createContent("airplane.png", 4);
addKeyTime( 500, 0.0, 350.0, -0.75, 1.0, content);
addKeyTime( 2000, 100.0, 200.0, -0.30, 1.0, null);
addKeyTime( 4000, 200.0, 50.0, 0.00, 1.0, null);
addKeyTime( 6000, 300.0, 50.0, 0.20, 1.0, null);
addKeyTime( 8000, 400.0, 200.0, 0.00, 1.0, null);
addKeyTime( 8500, 500.0, 200.0, 0.00, 1.0, null);
setEndState(REMOVE);
}
private void addKeyTime(int time, double x, double y,
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 95 / 153
![Page 104: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/104.jpg)
Encapsulating Key-Time Dynamics Location and Rotation Tweening
An Example: Airplane (cont.)
double r, double s, Content c)
{
addKeyTime(time, new Point2D.Double(x, y), new Double(r),
new Double(s), c);
}
}
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 96 / 153
![Page 105: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/105.jpg)
Encapsulating Key-Time Dynamics Location and Rotation Tweening
Airplane – Demonstration
In examples/chapter:java -cp multimedia2.jar;examples.jar AirplaneDemo
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 97 / 153
![Page 106: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/106.jpg)
Encapsulating Key-Time Dynamics Location and Rotation Tweening
Another Example: BuzzyOnMars
import java.awt.geom.Point2D;
import visual.dynamic.described.DescribedSprite;
import visual.statik.described.*;
public class BuzzyOnMars extends DescribedSprite
{
public BuzzyOnMars()
{
super();
BuzzyStanding buzzy;
buzzy = new BuzzyStanding();
addKeyTime( 500, 0.0, 380.0, 0.00, 1.0, buzzy);
addKeyTime( 2000, 180.0, 380.0, 0.00, 1.0, null);
addKeyTime( 4000, 180.0, 75.0, 0.20, 1.0, null);
addKeyTime( 6000, 640.0, 20.0, 6.48, 1.0, null);
setEndState(REMOVE);
}
private void addKeyTime(int time, double x, double y,
double r, double s, AggregateContent c)
{
addKeyTime(time, new Point2D.Double(x, y), new Double(r),
new Double(s), c);
}
}
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 98 / 153
![Page 107: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/107.jpg)
Encapsulating Key-Time Dynamics Location and Rotation Tweening
BuzzyOnMars – Demonstration
In examples/chapter:java -cp multimedia2.jar;examples.jar BuzzyOnMarsDemo
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 99 / 153
![Page 108: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/108.jpg)
Encapsulating Key-Time Dynamics Location and Rotation Tweening
A Last Example: BusOnRoute
import java.awt.geom.Point2D;
import io.*;
import visual.dynamic.described.*;
import visual.statik.sampled.*;
public class BusOnRoute extends SampledSprite
{
public BusOnRoute()
{
super();
Content content;
ContentFactory factory;
ResourceFinder finder;
finder = ResourceFinder.createInstance(this);
factory = new ContentFactory(finder);
content = factory.createContent("bus.png");
addKeyTime( 0, 164, 210, content);
addKeyTime( 1, 310, 255, null);
addKeyTime( 2, 314, 234, null);
addKeyTime( 3, 401, 231, null);
addKeyTime( 4, 419, 269, null);
addKeyTime( 5, 353, 340, null);
addKeyTime( 6, 430, 367, null);
addKeyTime( 7, 420, 418, null);
addKeyTime( 8, 450, 421, null);
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 100 / 153
![Page 109: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/109.jpg)
Encapsulating Key-Time Dynamics Location and Rotation Tweening
A Last Example: BusOnRoute (cont.)
addKeyTime( 9, 454, 386, null);
addKeyTime(10, 512, 393, null);
addKeyTime(11, 487, 338, null);
addKeyTime(12, 554, 323, null);
addKeyTime(13, 500, 238, null);
addKeyTime(14, 577, 206, null);
addKeyTime(15, 632, 155, null);
addKeyTime(16, 480, 151, null);
addKeyTime(19, 301, 88, null);
addKeyTime(21, 233, 149, null);
addKeyTime(22, 147, 181, null);
addKeyTime(30, 164, 210, null);
setEndState(REMAIN);
}
private void addKeyTime(int time, int x, int y,
Content content)
{
addKeyTime(time*1000, new Point2D.Double((double)x, (double)y),
null, new Double(1.0), content);
}
}
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 101 / 153
![Page 110: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/110.jpg)
Encapsulating Key-Time Dynamics Location and Rotation Tweening
BusOnRoute – Demonstration
In examples/chapter:java -cp multimedia2.jar;examples.jar BusOnRouteDemo
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 102 / 153
![Page 111: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/111.jpg)
Encapsulating Key-Time Dynamics Tweening Samples and Descriptions
Tweening the Visual Content
• Sampled:
Specify a raster for each key frame.
Tweening from one to the next.
• Described:
Specifying a shape (or shapes) for each key frame.
Tweening from one to the next.
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 103 / 153
![Page 112: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/112.jpg)
Encapsulating Key-Time Dynamics Tweening Samples and Descriptions
Tweening Sampled Static Content
• Use an object that has two component statik.Content objects.
statik.CompositeContent provides this capability but it a littleeasier to use a simple (i.e., non-hierarchical) collection.
• Combine them with alpha blending.
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 104 / 153
![Page 113: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/113.jpg)
Encapsulating Key-Time Dynamics Tweening Samples and Descriptions
sampled.AggregateContent – Structure
package visual.statik.sampled;
import java.awt.*;
import java.awt.image.*;
import java.util.Iterator;
public class AggregateContent
extends visual.statik.AbstractAggregateContent<Content>
implements TransformableContent
{
public AggregateContent()
{
super();
}
}
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 105 / 153
![Page 114: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/114.jpg)
Encapsulating Key-Time Dynamics Tweening Samples and Descriptions
sampled.AggregateContent – setBufferedImageOp()
public void setBufferedImageOp(BufferedImageOp op)
{
Iterator<Content> i;
i = iterator();
while (i.hasNext())
{
i.next().setBufferedImageOp(op);
}
}
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 106 / 153
![Page 115: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/115.jpg)
Encapsulating Key-Time Dynamics Tweening Samples and Descriptions
sampled.AggregateContent – setComposite()
public void setComposite(Composite c)
{
Content content;
content = components.getLast();
content.setComposite(c);
}
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 107 / 153
![Page 116: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/116.jpg)
Encapsulating Key-Time Dynamics Tweening Samples and Descriptions
SampledSprite – Structure
package visual.dynamic.described;
import java.awt.*;
import java.awt.geom.*;
import java.awt.image.*;
import java.util.ArrayList;
import visual.statik.sampled.AggregateContent;
import visual.statik.sampled.Content;
import visual.statik.sampled.TransformableContent;
public class SampledSprite extends TweeningSprite
{
protected AggregateContent tweened;
protected ArrayList<Content> content;
public SampledSprite()
{
super();
content = new ArrayList<Content>();
}
public void addKeyTime(int keyTime, Point2D location,
Double rotation, Double scaling,
Content c)
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 108 / 153
![Page 117: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/117.jpg)
Encapsulating Key-Time Dynamics Tweening Samples and Descriptions
SampledSprite – Structure (cont.)
{
int index;
index = super.addKeyTime(keyTime, location, rotation, scaling);
if (index >= 0)
{
// If c is null then re-use the last Content
if (c==null) c = content.get(index-1);
content.add(index, c);
}
}
}
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 109 / 153
![Page 118: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/118.jpg)
Encapsulating Key-Time Dynamics Tweening Samples and Descriptions
SampledSprite – getContent()
protected visual.statik.TransformableContent getContent()
{
AggregateContent aggregate;
Content currentContent, nextContent;
float alpha;
int current, next;
visual.statik.TransformableContent result;
result = null;
current = getKeyTimeIndex();
next = getNextKeyTimeIndex();
if (visible && (current >= 0))
{
currentContent = content.get(current);
nextContent = content.get(next);
if ((nextContent != null) &&
(currentContent != nextContent))
{
aggregate = new AggregateContent();
aggregate.add(currentContent);
aggregate.add(nextContent);
// Setup alpha blending
alpha = (float)getInterpolationFraction();
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 110 / 153
![Page 119: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/119.jpg)
Encapsulating Key-Time Dynamics Tweening Samples and Descriptions
SampledSprite – getContent() (cont.)
aggregate.setComposite(
AlphaComposite.getInstance(
AlphaComposite.SRC_OVER,
alpha));
result = aggregate;
}
else
{
result = currentContent;
}
}
return result;
}
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 111 / 153
![Page 120: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/120.jpg)
Encapsulating Key-Time Dynamics Tweening Samples and Descriptions
A Crystal Ball
import java.awt.geom.Point2D;
import io.*;
import visual.dynamic.described.*;
import visual.statik.sampled.*;
public class CrystalBall extends SampledSprite
{
public CrystalBall()
{
super();
Content content;
ContentFactory factory;
ResourceFinder finder;
finder = ResourceFinder.createInstance(this);
factory = new ContentFactory(finder);
content = factory.createContent("crystalball01.png");
addKeyTime( 500, 0.0, 350.0, -0.75, content);
addKeyTime( 4000, 100.0, 200.0, -0.30, null);
content = factory.createContent("crystalball02.png");
addKeyTime( 7500, 200.0, 50.0, 0.00, content);
setEndState(REMAIN);
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 112 / 153
![Page 121: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/121.jpg)
Encapsulating Key-Time Dynamics Tweening Samples and Descriptions
A Crystal Ball (cont.)
}
private void addKeyTime(int time, double x, double y,
double r, Content content)
{
addKeyTime(time, new Point2D.Double(x, y), new Double(r),
new Double(1.0), content);
}
}
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 113 / 153
![Page 122: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/122.jpg)
Encapsulating Key-Time Dynamics Tweening Samples and Descriptions
A Crystal Ball – Demonstration
In examples/chapter:java -cp multimedia2.jar;examples.jar CrystalBallDemo
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 114 / 153
![Page 123: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/123.jpg)
Encapsulating Key-Time Dynamics Tweening Samples and Descriptions
Shape Tweening
Shapeat Time t1
Shapeat Time t2
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 115 / 153
![Page 124: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/124.jpg)
Encapsulating Key-Time Dynamics Tweening Samples and Descriptions
Shape Tweening – Demonstration
In examples/chapter:java -cp multimedia2.jar;examples.jar BuzzyJumpingDemo
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 116 / 153
![Page 125: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/125.jpg)
Encapsulating Key-Time Dynamics Tweening Samples and Descriptions
Shape Tweening (cont.)
• Most Common Approach:
Tween the location of each of the points that defines the shape.
• A Helpful Participant:
The PathIterator interface which provides access to “move to”and “draw to” segments.
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 117 / 153
![Page 126: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/126.jpg)
Encapsulating Key-Time Dynamics Tweening Samples and Descriptions
described.Content – PathIterator
public PathIterator getPathIterator(boolean transformed)
{
if (transformed)
return transformedShape.getPathIterator(IDENTITY);
else
return originalShape.getPathIterator(IDENTITY);
}
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 118 / 153
![Page 127: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/127.jpg)
Encapsulating Key-Time Dynamics Tweening Samples and Descriptions
described.AggregateContent – Structure
package visual.statik.described;
import java.awt.*;
import java.util.Iterator;
public class AggregateContent
extends visual.statik.AbstractAggregateContent<Content>
implements TransformableContent
{
public AggregateContent()
{
super();
}
}
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 119 / 153
![Page 128: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/128.jpg)
Encapsulating Key-Time Dynamics Tweening Samples and Descriptions
described.AggregateContent – Setters
public void setColor(Color color)
{
Iterator<Content> i;
i = iterator();
while (i.hasNext())
{
i.next().setColor(color);
}
}
public void setPaint(Paint paint)
{
Iterator<Content> i;
i = iterator();
while (i.hasNext())
{
i.next().setPaint(paint);
}
}
public void setStroke(Stroke stroke)
{
Iterator<Content> i;
i = iterator();
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 120 / 153
![Page 129: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/129.jpg)
Encapsulating Key-Time Dynamics Tweening Samples and Descriptions
described.AggregateContent – Setters (cont.)
while (i.hasNext())
{
i.next().setStroke(stroke);
}
}
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 121 / 153
![Page 130: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/130.jpg)
Encapsulating Key-Time Dynamics Tweening Samples and Descriptions
DescribedSprite – Structure
package visual.dynamic.described;
import java.awt.*;
import java.awt.geom.*;
import java.util.ArrayList;
import java.util.Iterator;
import visual.statik.described.*;
public class DescribedSprite extends TweeningSprite
{
protected AggregateContent tweened;
protected ArrayList<AggregateContent> content;
public DescribedSprite()
{
content = new ArrayList<AggregateContent>();
tweened = new AggregateContent();
}
public void addKeyTime(int keyTime, Point2D location,
Double rotation, Double scaling,
AggregateContent ctc)
{
int index;
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 122 / 153
![Page 131: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/131.jpg)
Encapsulating Key-Time Dynamics Tweening Samples and Descriptions
DescribedSprite – Structure (cont.)
index = super.addKeyTime(keyTime, location, rotation, scaling);
if (index >= 0)
{
// If ctc is null then re-use the last CompositeContent
if (ctc == null) ctc = content.get(index-1);
content.add(index, ctc);
}
}
}
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 123 / 153
![Page 132: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/132.jpg)
Encapsulating Key-Time Dynamics Tweening Samples and Descriptions
DescribedSprite – getContent()
public visual.statik.TransformableContent getContent()
{
int current, next;
AggregateContent currentCTC, nextCTC;
current = getKeyTimeIndex();
next = getNextKeyTimeIndex();
tweened = null;
if (current >= 0)
{
currentCTC = content.get(current);
nextCTC = content.get(next);
tweened = currentCTC;
if (currentCTC != nextCTC)
{
tweenShape(currentCTC, nextCTC, getInterpolationFraction());
}
}
return tweened;
}
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 124 / 153
![Page 133: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/133.jpg)
Encapsulating Key-Time Dynamics Tweening Samples and Descriptions
DescribedSprite – tweenShape()
protected void tweenShape(AggregateContent a,
AggregateContent b,
double frac)
{
Color color;
float[] coords, coordsA, coordsB;
GeneralPath gp;
int seg;
Iterator<Content> iterA, iterB;
PathIterator piA, piB;
Paint paint;
Content shapeA, shapeB;
Stroke stroke;
tweened = new AggregateContent();
coordsA = new float[6];
coordsB = new float[6];
coords = new float[6];
iterA = a.iterator();
iterB = b.iterator();
// Loop over all of the TransformableContent objects
// in the AggregateContent
while (iterA.hasNext())
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 125 / 153
![Page 134: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/134.jpg)
Encapsulating Key-Time Dynamics Tweening Samples and Descriptions
DescribedSprite – tweenShape() (cont.)
{
shapeA = iterA.next();
if (iterB.hasNext()) shapeB = iterB.next();
else shapeB = shapeA;
piA = shapeA.getPathIterator(false);
piB = shapeB.getPathIterator(false);
gp = new GeneralPath();
gp.setWindingRule(piA.getWindingRule());
// Loop over all of the segments in the
// TransformableContent object
while (!piA.isDone())
{
seg = piA.currentSegment(coordsA);
if (piB.isDone()) // Use the coordinates of the first shape
{
for (int i=0; i < coordsA.length; i++)
coords[i] = coordsA[i];
}
else // Interpolate the coordinates
{
piB.currentSegment(coordsB);
for (int i=0; i < coordsA.length; i++)
{
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 126 / 153
![Page 135: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/135.jpg)
Encapsulating Key-Time Dynamics Tweening Samples and Descriptions
DescribedSprite – tweenShape() (cont.)
coords[i] = coordsA[i] +
(float)frac*(coordsB[i] - coordsA[i]);
}
}
// Add to the General Path object
if (seg == PathIterator.SEG_MOVETO)
{
gp.moveTo(coords[0], coords[1]);
}
else if (seg == PathIterator.SEG_LINETO)
{
gp.lineTo(coords[0], coords[1]);
}
else if (seg == PathIterator.SEG_QUADTO)
{
gp.quadTo(coords[0], coords[1], coords[2], coords[3]);
}
else if (seg == PathIterator.SEG_CUBICTO)
{
gp.curveTo(coords[0], coords[1],
coords[2], coords[3],
coords[4], coords[5]);
}
else if (seg == PathIterator.SEG_CLOSE)
{
gp.closePath();
}
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 127 / 153
![Page 136: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/136.jpg)
Encapsulating Key-Time Dynamics Tweening Samples and Descriptions
DescribedSprite – tweenShape() (cont.)
piA.next();
piB.next();
}
paint = shapeA.getPaint();
color = shapeA.getColor(); // This could also be tweened
stroke = shapeA.getStroke();
tweened.add(new Content(gp, color, paint, stroke));
}
}
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 128 / 153
![Page 137: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/137.jpg)
The Complete System
What’s Next
We need to consider the complete system.
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 129 / 153
![Page 138: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/138.jpg)
The Complete System Examples
A JumboTron
import java.awt.*;
import javax.swing.*;
import app.*;
import io.*;
import visual.*;
import visual.dynamic.described.*;
import visual.statik.sampled.*;
public class DynamicJumboTronDemo extends JApplication
{
public static void main(String[] args)
{
JApplication demo = new DynamicJumboTronDemo(args, 640, 480);
invokeInEventDispatchThread(demo);
}
public DynamicJumboTronDemo(String[] args, int width, int height)
{
super(args, width, height);
}
public void init()
{
ResourceFinder finder;
ScaledVisualizationRenderer renderer2;
VisualizationView view1, view2;
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 130 / 153
![Page 139: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/139.jpg)
The Complete System Examples
A JumboTron (cont.)
finder = ResourceFinder.createInstance(resources.Marker.class);
ContentFactory factory = new ContentFactory(finder);
// The Stage for Buzzy
Stage stage = new Stage(10);
stage.setBackground(Color.white);
stage.setRestartTime(7000);
view1 = stage.getView();
view1.setBounds(0,0,640,480);
renderer2 = new ScaledVisualizationRenderer(
new PlainVisualizationRenderer(), 640.0, 480.0);
view2 = new VisualizationView(stage, renderer2);
view2.setBounds(50,50,160,120);
stage.addView(view2);
Content mars = factory.createContent("mars.png");
stage.add(mars);
// Buzzy
BuzzyOnMars buzzy = new BuzzyOnMars();
stage.add(buzzy);
// The content pane
JPanel contentPane = (JPanel)getContentPane();
contentPane.add(view2);
contentPane.add(view1);
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 131 / 153
![Page 140: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/140.jpg)
The Complete System Examples
A JumboTron (cont.)
stage.start();
}
}
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 132 / 153
![Page 141: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/141.jpg)
The Complete System Examples
A JumboTron – Demonstration
In examples/chapter:java -cp multimedia2.jar;examples.jar DynamicJumboTronDemo
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 133 / 153
![Page 142: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/142.jpg)
The Complete System Examples
Picture-in-Picture
import java.awt.*;
import javax.swing.*;
import app.*;
import io.*;
import visual.*;
import visual.dynamic.described.*;
import visual.statik.sampled.*;
public class DynamicPIPDemo extends JApplication
{
public static void main(String[] args)
{
JApplication demo = new DynamicPIPDemo(args, 640, 480);
invokeInEventDispatchThread(demo);
}
public DynamicPIPDemo(String[] args, int width, int height)
{
super(args, width, height);
}
public void init()
{
ResourceFinder finder;
Stage stage1, stage2;
VisualizationView view1, view2;
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 134 / 153
![Page 143: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/143.jpg)
The Complete System Examples
Picture-in-Picture (cont.)
finder = ResourceFinder.createInstance(resources.Marker.class);
ContentFactory factory = new ContentFactory(finder);
// The Stage for Buzzy
stage1 = new Stage(10);
stage1.setBackground(Color.white);
stage1.setRestartTime(7000);
view1 = stage1.getView();
view1.setRenderer(new ScaledVisualizationRenderer(
view1.getRenderer(),
640.0, 480.0));
view1.setBounds(0,0,640,480);
Content mars = factory.createContent("mars.png");
stage1.add(mars);
// Buzzy
BuzzyOnMars buzzy = new BuzzyOnMars();
stage1.add(buzzy);
// The stage for the airplane
stage2 = new Stage(10);
view2 = stage2.getView();
view2.setRenderer(new ScaledVisualizationRenderer(
view2.getRenderer(),
640.0, 480.0));
view2.setBounds(50,50,160,120);
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 135 / 153
![Page 144: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/144.jpg)
The Complete System Examples
Picture-in-Picture (cont.)
view2.setSize(160,120);
view2.setBackground(Color.white);
stage2.setRestartTime(12000);
// The Airplane
Airplane plane = new Airplane();
stage2.add(plane);
// The content pane
JPanel contentPane = (JPanel)getContentPane();
contentPane.add(view2);
contentPane.add(view1);
stage1.start();
stage2.start();
}
}
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 136 / 153
![Page 145: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/145.jpg)
The Complete System Examples
Picture-in-Picture – Demonstration
In examples/chapter:java -cp multimedia2.jar;examples.jar DynamicPIPDemo
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 137 / 153
![Page 146: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/146.jpg)
The Complete System Examples
A Diptych
import java.awt.*;
import javax.swing.*;
import app.*;
import io.*;
import visual.*;
import visual.dynamic.described.*;
import visual.statik.sampled.*;
public class DynamicDiptychDemo extends JApplication
{
public static void main(String[] args)
{
JApplication demo = new DynamicDiptychDemo(args, 320, 480);
invokeInEventDispatchThread(demo);
}
public DynamicDiptychDemo(String[] args, int width, int height)
{
super(args, width, height);
}
public void init()
{
ContentFactory factory;
ResourceFinder finder;
VisualizationRenderer renderer2;
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 138 / 153
![Page 147: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/147.jpg)
The Complete System Examples
A Diptych (cont.)
// The Stage for Buzzy
Stage stage = new Stage(10);
stage.setBackground(Color.WHITE);
stage.setRestartTime(7000);
VisualizationView view1 = stage.getView();
view1.setRenderer(new PartialVisualizationRenderer(
view1.getRenderer(),
0.0, 0.0));
view1.setBounds(0,0,320,480);
renderer2 = new PartialVisualizationRenderer(
new PlainVisualizationRenderer(), 320.0, 0.0);
VisualizationView view2 = new VisualizationView(stage, renderer2);
view2.setBounds(0,0,320,480);
stage.addView(view2);
finder = ResourceFinder.createInstance(resources.Marker.class);
factory = new ContentFactory(finder);
Content mars = factory.createContent("mars.png");
stage.add(mars);
// Buzzy
BuzzyOnMars buzzy = new BuzzyOnMars();
stage.add(buzzy);
// The content pane for the main window
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 139 / 153
![Page 148: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/148.jpg)
The Complete System Examples
A Diptych (cont.)
JPanel contentPane = (JPanel)getContentPane();
contentPane.add(view1);
// The content pane for the other window
JFrame window2 = new JFrame();
window2.setSize(320,480);
window2.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
contentPane = (JPanel)window2.getContentPane();
contentPane.add(view2);
window2.setVisible(true);
stage.start();
}
}
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 140 / 153
![Page 149: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/149.jpg)
The Complete System Examples
A Diptych – Demonstration
In examples/chapter:java -cp multimedia2.jar;examples.jar DynamicDiptychDemo
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 141 / 153
![Page 150: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/150.jpg)
Supplementary Material
What’s Next
We need to consider other interesting things we can do (that are no inthe textbook).
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 142 / 153
![Page 151: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/151.jpg)
Supplementary Material Special Effects
Adding Special Effects to Sampled Dynamic VisualContent
• The Objective:
Add “sprites” to a “movie”.
• What’s Needed?:
What’s Needed?
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 143 / 153
![Page 152: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/152.jpg)
Supplementary Material Special Effects
Adding Special Effects to Sampled Dynamic VisualContent
• The Objective:
Add “sprites” to a “movie”.
• What’s Needed?:
The Screen object’s Visualization and the Stage need to renderto the same VisualizationView.
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 143 / 153
![Page 153: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/153.jpg)
Supplementary Material Special Effects
SpecialEffectsRenderer
package visual.dynamic;
import java.awt.*;
import java.util.*;
import javax.swing.*;
import visual.*;
import visual.statik.*;
import visual.dynamic.described.Sprite;
public class SpecialEffectsRenderer
implements VisualizationRenderer
{
protected Visualization stage;
protected VisualizationRenderer decorated;
public SpecialEffectsRenderer(VisualizationRenderer decorated,
Visualization stage)
{
this.decorated = decorated;
this.stage = stage;
}
public void postRendering(Graphics g,
Visualization model,
VisualizationView view)
{
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 144 / 153
![Page 154: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/154.jpg)
Supplementary Material Special Effects
SpecialEffectsRenderer (cont.)
decorated.postRendering(g, model, view);
}
public void preRendering(Graphics g,
Visualization model,
VisualizationView view)
{
decorated.preRendering(g, model, view);
}
public void render(Graphics g,
Visualization model,
VisualizationView view)
{
decorated.render(g, model, view);
decorated.render(g, stage, view);
}
}
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 145 / 153
![Page 155: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/155.jpg)
Supplementary Material Special Effects
SpecialEffectsScreen
package visual.dynamic;
import event.*;
import visual.*;
import visual.dynamic.described.*;
import visual.dynamic.sampled.*;
public class SpecialEffectsScreen extends Screen
{
SpecialEffectsRenderer renderer;
Visualization stage;
public SpecialEffectsScreen()
{
super();
stage.setView(getView());
}
public void add(Sprite sprite)
{
// Make the Sprite a MetronomeListener
metronome.addListener(sprite);
// Treat the Sprite as a SimpleContent and
// add it to the Visualization
stage.add(sprite);
}
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 146 / 153
![Page 156: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/156.jpg)
Supplementary Material Special Effects
SpecialEffectsScreen (cont.)
protected VisualizationView createDefaultView()
{
stage = new Visualization();
renderer = new SpecialEffectsRenderer(
new ScreenRenderer(
new PlainVisualizationRenderer()),
stage);
return new VisualizationView(this, renderer);
}
}
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 147 / 153
![Page 157: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/157.jpg)
Supplementary Material Special Effects
A Special Effect - A Bee
import java.awt.geom.*;
import java.awt.image.*;
import io.*;
import visual.dynamic.described.*;
import visual.dynamic.sampled.*;
import visual.statik.sampled.*;
public class Bee
extends SampledSprite
{
public Bee()
{
super();
Content content;
ContentFactory factory;
ResourceFinder finder;
finder = ResourceFinder.createInstance(this);
factory = new ContentFactory(finder);
content = factory.createContent("bee.png", 4);
addKeyFrame( 1, 173.0, 118.0, 0.00, 0.20, content);
addKeyFrame( 45, 166.0, 120.0, 0.00, 0.35, null);
addKeyFrame( 100, 148.0, 105.0, 0.00, 0.50, null);
addKeyFrame( 115, 230.0, 90.0, 0.00, 0.75, null);
addKeyFrame( 150, 245.0, 143.0, 0.00, 1.00, null);
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 148 / 153
![Page 158: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/158.jpg)
Supplementary Material Special Effects
A Special Effect - A Bee (cont.)
setEndState(REMOVE);
}
private void addKeyFrame(int frame, double x, double y,
double r, double s, Content c)
{
int time;
time = frame * Screen.DEFAULT_FRAME_DELAY;
addKeyTime(time, new Point2D.Double(x, y), new Double(r),
new Double(s), c);
}
}
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 149 / 153
![Page 159: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/159.jpg)
Supplementary Material Special Effects
An Example
import javax.swing.*;
import app.*;
import visual.*;
import io.ResourceFinder;
import visual.dynamic.*;
import visual.statik.*;
import visual.statik.sampled.*;
public class SpecialEffectsDemo extends JApplication
{
public static void main(String[] args)
{
JApplication demo = new SpecialEffectsDemo(args, 640, 480);
invokeInEventDispatchThread(demo);
}
public SpecialEffectsDemo(String[] args, int width, int height)
{
super(args, width, height);
}
public void init()
{
ResourceFinder finder;
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 150 / 153
![Page 160: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/160.jpg)
Supplementary Material Special Effects
An Example (cont.)
SpecialEffectsScreen screen = new SpecialEffectsScreen(20);
screen.setRepeating(true);
VisualizationView view = screen.getView();
view.setBounds(0,0,320,240);
JPanel contentPane = (JPanel)getContentPane();
contentPane.add(view);
finder = ResourceFinder.createInstance(resources.Marker.class);
String[] names = finder.loadResourceNames("scribble.txt");
ContentFactory factory = new ContentFactory(finder);
SimpleContent[] frames = factory.createContents(names, 4);
for (int i=0; i<frames.length; i++)
{
screen.add(frames[i]);
}
Bee bee = new Bee();
screen.add(bee);
screen.start();
}
}
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 151 / 153
![Page 161: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/161.jpg)
Supplementary Material Special Effects
Special Effects – Demonstration
In examples/chapter:java -cp multimedia2.jar;examples.jar SpecialEffectsDemo -Xmx256m
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 152 / 153
![Page 162: The Design and Implementation of Multimedia Software · 2018. 8. 26. · java -cp multimedia2.jar;examples.jar FloatingSpriteDemo David Bernstein (jbpub.com) Multimedia Software Jones](https://reader034.vdocuments.net/reader034/viewer/2022052004/6017f8989a3644111e0a4c7b/html5/thumbnails/162.jpg)
Supplementary Material Special Effects
Putting it All Together – Demonstration
In examples/chapter:java -cp multimedia2.jar;examples.jar SpecialEffectsPIPDemo -Xmx256m
David Bernstein (jbpub.com) Multimedia Software Jones and Bartlett 153 / 153