Chapter 13 - MovieClipClass.swf

In this example, the Ship is controlled by clicking on the directional buttons. Bullets are fired by clicking on the round button. Diamonds can be dragged and released. Dragging and dropping the red X on a diamond deletes the diamond.

When a bullet collides with a diamond, the diamond's drawBounds() method is invoked and the bounding box used by the collision calculation is drawn. This is useful for debugging.

Ship class:

import MovieClipClass.ObjectManager;
import ch11.BaseObject;
import ch11.Bullet;

class MovieClipClass.Ship extends BaseObject {

	var over:Boolean;
	var anim:String;
	var animPrev:String;
	var shooting:Boolean = false;
	var hit:Boolean = false;
	var animDone:Boolean = true;
	var shieldOn:Boolean = false;
	var thrustOn:Boolean = false;
	var shieldPlaying:Boolean = false;
	var thrustPlaying:Boolean = false;

	public function Ship(x:Number, y:Number,
						movie_clip:MovieClip, name:String) {
		super(x, y, movie_clip, name);

		//mc._visible = false;
		mc.gotoAndStop(1);
		mc.ship_shield._visible = false;
		mc.ship_thrust._visible = false;
		mc.ship_anim.owner = this;
	}

	public function setShielded(state:Boolean):Void {
		shieldOn = state;
	}

	public function move():Void {
		mc._x = coords.x;
		mc._y = coords.y;

		setAnimation();
	}

	public function setAnimation():Void {

		if (animDone){

			//set animation state
			if (over) {
				anim = "over";
				animDone = false;
			} else if (hit) {
				anim = "hit";
				animDone = false;
			} else if (shooting) {
				anim = "shoot";
				animDone = false;
			} else {
				anim = "idle";
			}

			//set thrust visibility
			if (thrustOn) {
				mc.ship_thrust._visible = true;
				if (!thrustPlaying) {
					mc.ship_thrust.gotoAndPlay("on");
					thrustPlaying = true;
				}
			} else {
				mc.ship_thrust._visible = false;
				thrustPlaying = false;
			}

			//set shield visibility
			if (shieldOn) {
				if (!shieldPlaying) {
					mc.ship_shield._visible = true;
					mc.ship_shield.gotoAndPlay("on");
					shieldPlaying = true;
				}
			} else {
				mc.ship_shield._visible = false;
				shieldPlaying = false;
			}

			if (anim != animPrev) {

				mc.ship_anim.gotoAndPlay(anim);
				animPrev = anim;
			}
		}
	}

	public function doneShooting():Void {

		trace("Done Shooting");
		animDone = true;
		shooting = false;
		hit = false;
		anim = "idle";
		animPrev = "";
	}

	public function reset():Void {

	}

	public function thrust(direction:Number):Void {

		thrustOn = true;
	}

	public function thrustOff():Void  {
		thrustOn = false
	}

	public function rotate(direction:String):Void  {

		if (direction == "right") {
			if (angleIndex == 32) {
				angleIndex = 1;
			} else {
				angleIndex += 1;
			}
		} else if (direction == "left") {
			if (angleIndex == 1) {
				angleIndex = 32;
			} else {
				angleIndex -= 1;
			}
		}
		mc.gotoAndStop(angleIndex);
	}

	public function shoot():Void  {

		var tempBullet:Bullet

		if (alive && !shooting) {

			shooting = true;
			tempBullet = ObjectManager.createBullet(coords.x, coords.y, 400, angleIndex);
			ObjectManager.addObject(tempBullet, "bullets");
		}
	}

	public function die():Void {

		alive = false;
		animDone = true;
	}
}

Diamond class:

class MovieClipClass.Diamond extends ch11.BaseObject {


	var drift:Object;
	var size:Number;
	var top:Object;
	var right:Object;
	var bottom:Object;
	var left:Object;
	var textField:TextField;
	var textFormat:TextFormat;
	var dragging:Boolean;

	public function Diamond(x:Number, y:Number, size:Number,
							movie_clip:MovieClip, name:String) {

		super(x, y, movie_clip, name);

		drift = new Object();
		this.size = size;
		mc.owner = this;
		drift.x = 0;
		drift.y = 0;

		top = {x:size/2, y:0};
		right = {x:size, y:size/2};
		bottom = {x:size/2, y:size};
		left = {x:0, y:size/2};

		textFormat =  new TextFormat();
		textFormat.color = 0xFFFFFF;
		textFormat.font = "Arial";

		mc.createTextField(name, 10, 0, 0, size, 20);
		textField = mc[name];


		dragging = false;

		mc.onPress = function() {
			this.startDrag();
			this.owner.dragDiamond();
		};

		mc.onRelease = function() {
			this.stopDrag();
			this.owner.stopDragDiamond(this._droptarget);
		};
	}

	public function move():Void {

		if (!dragging) {
			var period:Number = 2000;
			var phase:Number  = getTimer() % period;
			var frequency:Number  = 1;
			var angle:Number  = phase/period * frequency * Math.PI*2;
			var movieWidth:Number = 600;
			var phaseOffest:Number  = (coords.x / movieWidth) * Math.PI*2;
			var amplitude:Number  = 25;
			var yOffset = Math.sin(angle + phaseOffest) * amplitude;

			mc._x = coords.x + drift.x;
			mc._y = coords.y + yOffset + drift.y;

			drift.x *= .9;
			drift.y *= .9;
		}
	}

	public function moveTo(x:Number, y:Number):Void {

		drift.x = coords.x - x;
		drift.y = coords.y - y;
		coords.x = x;
		coords.y = y;
	}

	public function draw():Void {

		mc.clear();
		mc.colors = [0xFF0000, 0x0000FF];
		mc.alphas = [100, 100];
		mc.ratios = [0, 0xFF];
		mc.matrix = {matrixType:"box", x:12.5, y:12.5,
						w:25, h:25, r:(45/180)*Math.PI};
		mc.beginGradientFill("linear", mc.colors, mc.alphas,
									mc.ratios, mc.matrix);

		mc.lineStyle( 2, 0xFF9900, 100 );
		mc.moveTo( top.x, top.y  );
		mc.lineTo( right.x, right.y );
		mc.lineTo( bottom.x, bottom.y );
		mc.lineTo( left.x, left.y );
		mc.lineTo( top.x, top.y);
		mc.endFill();
	}

	public function drawBounds():Void {

		var bounds:Object;

		bounds = mc.getBounds(mc);
		mc.moveTo( bounds.xMin, bounds.yMin );
		mc.lineTo( bounds.xMax, bounds.yMin );
		mc.lineTo( bounds.xMax, bounds.yMax );
		mc.lineTo( bounds.xMin, bounds.yMax );
		mc.lineTo( bounds.xMin, bounds.yMin );

		textField.text = name;
		textField.setTextFormat(textFormat);
	}

	public function destroy():Void {
		mc.removeMovieClip();
		delete this;
	}

	public function dragDiamond():Void {
		dragging = true;
	}

	public function stopDragDiamond(drop_target:String):Void {
		dragging = false;
		drift.x = mc._x - coords.x;
		drift.y = mc._y - coords.y;

		textField.text = name;
		textField.setTextFormat(textFormat);
	}
}

Object Manager class:

import ch7.GameDepthManager;
import MovieClipClass.Diamond;
import ch11.Bullet;
import MovieClipClass.Ship;

class MovieClipClass.ObjectManager {

	static var movieClipTarget:MovieClip;
	static var arrays:Object = new Object();
	static var ship:Ship = null;

	public static function setTarget(target:MovieClip) {

		movieClipTarget = target;
	}

	public static function createDiamond(x:Number, y:Number,
										size:Number):Diamond {

		var depth = GameDepthManager.getNextObjectDepth();
		var name = "D_" + depth;
		var emptyMovieClip:MovieClip =
			movieClipTarget.createEmptyMovieClip(name, depth);
		var newDiamond:Diamond =
			new Diamond(x, y, size, emptyMovieClip, name);

		return newDiamond;
	}

	public static function createBullet(x:Number, y:Number,
										bullet_speed:Number,
										angle_index:Number):Bullet {

		var depth = GameDepthManager.getNextObjectDepth();
		var name = "bullet_" + depth;
		var tempMovieClip:MovieClip =
			movieClipTarget.attachMovie("bullet_type", name, depth);

		var newBullet:Bullet =
			new Bullet(	x, y, bullet_speed, angle_index,
						tempMovieClip, name);

		return newBullet;
	}

	public static function createShip(x:Number, y:Number):Ship {

		var depth = GameDepthManager.SHIP_DEPTH;
		var name = "ship_" + depth;
		var tempMovieClip:MovieClip = movieClipTarget.attachMovie("ship_type", name, depth);

		ship = new Ship(x, y, tempMovieClip, name);

		return ship;
	}

	public static function addObject(object:Object, array_id:String) {


		if (arrays[array_id] == undefined) {
			arrays[array_id] = new Array();
		}
		arrays[array_id].push(object);
	}

	public static function removeObject(array_id:String, index:Number) {

		arrays[array_id].splice(index, 1);
	}
}