package com.flagstone.cookbook;
/*
* BasicScript.java
* Cookbook
*
* Copyright (c) 2004-2010 Flagstone Software Ltd. All rights reserved.
*
* This code is distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND,
* EITHER EXPRESS OR IMPLIED, AND Flagstone HEREBY DISCLAIMS ALL SUCH
* WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
*/
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import com.flagstone.transform.Background;
import com.flagstone.transform.EventHandler;
import com.flagstone.transform.Movie;
import com.flagstone.transform.MovieHeader;
import com.flagstone.transform.MovieTag;
import com.flagstone.transform.Place2;
import com.flagstone.transform.ShowFrame;
import com.flagstone.transform.action.Action;
import com.flagstone.transform.datatype.Bounds;
import com.flagstone.transform.datatype.Color;
import com.flagstone.transform.datatype.WebPalette;
import com.flagstone.transform.fillstyle.FillStyle;
import com.flagstone.transform.fillstyle.SolidFill;
import com.flagstone.transform.linestyle.LineStyle;
import com.flagstone.transform.linestyle.LineStyle1;
import com.flagstone.transform.movieclip.DefineMovieClip;
import com.flagstone.transform.shape.DefineShape;
import com.flagstone.transform.shape.Line;
import com.flagstone.transform.shape.Shape;
import com.flagstone.transform.shape.ShapeRecord;
import com.flagstone.transform.shape.ShapeStyle;
import com.flagstone.translate.ASCompiler;
import com.flagstone.translate.ScriptException;
/*
* This example shows how to use Translate to compile ActionScript to control a
* movie clip.
*
* To run this example, type the following on a command line:
*
* java -cp ... com.flagstone.cookbook.BasicScript script-file file-out
*
* where:
*
* script-file is a file containing the ActionScript that will be executed
* to control the movie clip.
*
* file-out is the path where the file will be written. If no output file
* is specified then a file named after the example will be written to the
* current directory.
*
* IMPORTANT: When running the movie generated by the example in Internet
* Explorer, you will need to click on the browser window so the Flash plug-in
* gets the keyboard focus.
*/
public class BasicScript {
public static void main(String[] args) {
try {
String out = args.length == 1 ? "BasicScript.swf" : args[1];
BasicScript example = new BasicScript();
Movie movie = new Movie();
example.createMovie(movie, args[0]);
movie.encodeToFile(new File(out));
} catch (Exception e) {
e.printStackTrace();
}
}
public void createMovie(Movie movie, String filename)
throws ScriptException, IOException {
int uid = 1;
int screenWidth = 8000;
int screenHeight = 8000;
/*
* The movie clip is the simplest possible - just a simple rectangle
* displayed for a single frame.
*/
DefineShape rectangle = rectangle(uid++, 2000, 2000, WebPalette.RED
.color());
DefineMovieClip clip = new DefineMovieClip(uid++,
new ArrayList<MovieTag>());
clip.add(Place2.show(rectangle.getIdentifier(), 1, 0, 0));
clip.add(ShowFrame.getInstance());
/*
* Now generate the encoded array of ClipEvent objects from the script
* and add it to the object used to place the movie clip on the screen.
* The version number of Flash to encode to is required as the format of
* the data structures holding the event information for a movie clip
* changed with the releases of Flash 6 and Flash 7.
*/
Place2 location = Place2.show(clip.getIdentifier(), 1, screenWidth / 2,
screenHeight / 2).setName("clip");
ASCompiler compiler = new ASCompiler();
List<Action>handlers = compiler.compile(new File(filename));
for (Object obj : handlers) {
location.add((EventHandler) obj);
}
/*
* Put all the objects together in a movie.
*/
MovieHeader header = new MovieHeader();
header.setFrameRate(12.0f);
header.setFrameSize(new Bounds(0, 0, screenWidth, screenHeight));
movie.add(header);
movie.add(new Background(WebPalette.LIGHT_BLUE.color()));
movie.add(rectangle);
movie.add(clip);
movie.add(location);
movie.add(ShowFrame.getInstance());
}
/*
* Defines a simple rectangle filled with a solid colour.
* @param identifier the unique identifier used to reference the shape
* definition.
* @param width the width of the rectangle in twips.
* @param height the height of the rectangle in twips.
* @param color the colour used to fill the contents of the rectangle.
*/
private DefineShape rectangle(int identifier, int width, int height,
Color color) {
Bounds bounds = new Bounds(-width / 2, -height / 2, width / 2,
height / 2);
List<LineStyle> lineStyles = new ArrayList<LineStyle>();
List<FillStyle> fillStyles = new ArrayList<FillStyle>();
lineStyles.add(new LineStyle1(20, WebPalette.BLACK.color()));
fillStyles.add(new SolidFill(color));
List<ShapeRecord> shapeRecords = new ArrayList<ShapeRecord>();
shapeRecords.add(new ShapeStyle().setLineStyle(1).setFillStyle(1)
.setMove(-width / 2, -height / 2));
shapeRecords.add(new Line(width, 0));
shapeRecords.add(new Line(0, height));
shapeRecords.add(new Line(-width, 0));
shapeRecords.add(new Line(0, -height));
return new DefineShape(identifier, bounds, fillStyles, lineStyles,
new Shape(shapeRecords));
}
}