Previous Topic Tutorial Home Page Next Topic
Section 2: Stand-In Image


Define an opening animation used for latency masking during media files download.
class loadAnimation extends Statics {
public ImageBvr getImage(NumberBvr progress) {

There are two primary images, introImg and radarImg, in this animation. The introImg composes of a few text images and a progress indicator.
String[] intro = {"Direct", "X", "Media", "for Animation", "loading...please wait"},
info = {"Integrated", "2D", "3D", "and", "Audio", "for", "Java"};
double[] size = {3, 7, 3, 2, 1},
startPos = {-500,50, 0,500, 500,50, 6,-10, 0,-50},
endPos = {-98,50, 0,50, 100,50, 6,-10, 0,-50},
trigger = {.5, 1.5, 2.5, 4, 5};
ImageBvr[] introImgs = new ImageBvr[intro.length];

Create an array of text images for the introImg.
for(int i=0; i<intro.length; i++) {
Point2Bvr startPt = point2(mul(toBvr(startPos[2*i]),pixelBvr), mul(toBvr(startPos[2*i+1]),pixelBvr)),
endPt = point2(mul(toBvr(endPos[2*i]),pixelBvr), mul(toBvr(endPos[2*i+1]),pixelBvr));

FontStyleBvr fs = defaultFont.family(toBvr("Arial")).color(blue).bold();

ImageBvr textIm = textImage(toBvr(intro[i]), fs)
.transform(scale2(size[i]));

introImgs[i] = move(textIm, startPt, endPt, 1, trigger[i]);
}

introImgs[3] = introImgs[3].opacity(ramp(trigger[3],.3));
introImgs[4] = introImgs[4].opacity(mul(ramp(trigger[4],1), sin(mul(toBvr(4),localTime))));

Compose the text images together and overlay them on a black background.
ImageBvr introImg = solidColorImage(black);
for(int i=0; i<intro.length; i++)
introImg = overlay(introImgs[i],introImg);

Add a progress status indicator to the introImg.
Vector2Bvr statPos = vector2(toBvr(0),mul(toBvr(-80),pixelBvr));

FontStyleBvr fs = defaultFont.family(toBvr("Arial")).color(green);
ImageBvr statusImg = textImage(concat(mul(progress,toBvr(100))
.toString(toBvr(2)), toBvr("% complete") ), fs)
.opacity(ramp(trigger[4],1));

statusImg = statusImg.transform(compose(translate(statPos),scale2(.8)));
introImg = overlay(statusImg, introImg);

The radarImg has two parts. The infoImg is composed of a few text images clipped to a path of a rotating pie. The lineImg draws the the rotating edge of the pie.
ImageBvr infoImg = emptyImage;
for(int i=0; i<info.length; i++) {
infoImg = overlay(radiate(info[i], (2*Math.PI*i/info.length)+.3), infoImg);
}
infoImg = overlay(infoImg, solidColorImage(black));
Path2Bvr origin = ray(point2(1,0));
Path2Bvr pie = concat(origin,
arc(toBvr(0), mod(localTime, toBvr(2*Math.PI)),
toBvr(1), toBvr(1)));
infoImg = infoImg.clip(fillMatte(pie));

Create a line of length 0.05 meter then rotate it at the same rate the pie is rotating.
Path2Bvr ln = ray(point2(.05,0));
ImageBvr lineImg = ln.draw(defaultLineStyle.width(toBvr(.08*cm)).color(white)),
radarImg = overlay(lineImg.transform(rotate(localTime)), infoImg);

Delay the animation to create a more interesting effect.
radarImg = (ImageBvr)until(emptyImage, timer(toBvr(6)), radarImg);
introImg = overlay(radarImg, introImg);
return (ImageBvr)until(solidColorImage(black), timer(toBvr(1)), introImg);
}

This function creates an image from the given text string. It then moves the image to the position defined by the given radians.
ImageBvr radiate(String text, double radians) {

Rotate the vector (0.04, 0) by the given radians, that's where we'll translate the image to.
Vector2Bvr vec = vector2(.04,0).transform(rotate(toBvr(radians)));
FontStyleBvr fs = defaultFont.family(toBvr("Arial")).color(red).bold();
ImageBvr img = textImage(toBvr(text), fs)
.transform(scale2(1.3));

return img.transform(translate(vec));
}

Move the given image from the start position to the end position after second at the given rate.
ImageBvr move(ImageBvr img, Point2Bvr start, Point2Bvr end, double rate, double trigger) {
Vector2Bvr startPos = sub(start, origin2),
path = add(startPos, sub(end,start).mul(ramp(0,rate)) );
path = (Vector2Bvr) until(startPos, timer(toBvr(trigger)), path);
return img.transform(translate(path));
}

Before trigger seconds, return 0. After trigger seconds, return localTime*rate. When localTime*rate > 1, return 1.
NumberBvr ramp(double trigger, double rate) {
NumberBvr rampVal = mul(localTime,toBvr(rate));
return (NumberBvr) cond(lte(localTime,toBvr(trigger)), toBvr(0),
cond(lt(rampVal,toBvr(1)), rampVal, toBvr(1)));
}
}

© 1998 Microsoft Corporation. All rights reserved. Terms of Use.

Previous Topic Tutorial Home Page Next Topic