In case Flash no longer exists; a copy of this site is included in the Flashpoint archive's "ultimate" collection.

Dead Code Preservation :: Archived AS3 works from wonderfl.net

Spaceship Game (With Explosions and Mode7)

3d Spaceship Model in Sandy + Mode7 Ground
Arrow Keys to move
Spacebar to fire laser
Cloud background code borrowed from civet's 雲海
Used perlin noise to create the strange ground texture
It needs to fade out as it approaches the horizon somehow...
Going to add buildings soon?
// 3d Spaceship Model in Sandy + Mode7 Ground
// Arrow Keys to move
// Spacebar to fire laser
// Cloud background code borrowed from civet's 雲海
// Used perlin noise to create the strange ground texture
// It needs to fade out as it approaches the horizon somehow...
// Going to add buildings soon? 
package {
	import flash.display.*
	import flash.events.*;
        import flash.text.*;

	[SWF(width="465",height="465",backgroundColor="0x000000",frameRate="45")]
	public class AS3Code extends Sprite{
		public function AS3Code() {
			main=this;
                        stage.addChild(main);
                        
                       
                        
                            debugText = new TextField();
                            debugText.width = 400;
                            debugText.height = 300;
                            debugText.multiline = true;
                            debugText.wordWrap = true;
                            debugText.textColor = 0xFF00FF;
                            debugText.selectable = false;
                            stage.addChild(debugText);
                        
			initialize();
var Sprite3dLayer:Sprite = new Sprite();
var Sprite3dLayer2:Sprite = new Sprite ();
var Sprite3dLayer3:Sprite = new Sprite ();

    stage.addChild(Sprite3dLayer); 
    stage.addChild(Sprite3dLayer2); 
    stage.addChild(Sprite3dLayer3);

    Sprite3dLayer.addChild(scene2.container);
    Sprite3dLayer2.addChild(sky);
    Sprite3dLayer3.addChild(scene.container);
    Sprite3dLayer3.addChild(particleBitmap);

                        stage.addEventListener(KeyboardEvent.KEY_DOWN, keyPressed);
			stage.addEventListener(KeyboardEvent.KEY_UP, keyReleased);
			
			addEventListener(Event.ENTER_FRAME, EveryFrame);

		}
	}
}
import flash.display.*;
import flash.events.*;
import flash.ui.*;
import flash.utils.*;
import flash.filters.*
import flash.text.*;
import flash.geom.*
import flash.media.*
import flash.net.*
//
import sandy.core.*;
import sandy.core.data.*;
import sandy.core.scenegraph.*;
import sandy.events.*
import sandy.materials.*;
import sandy.materials.attributes.*;
import sandy.primitive.*;
import sandy.core.scenegraph.mode7.*;
//
var main:Sprite;
var debugText:TextField = new TextField();
//
var scene:Scene3D;
var camera:Camera3D;
var root:Group;

var scene2:Scene3D;
var camera2:CameraMode7;
var root2:Group;

var sky:MovieClip = new MovieClip();

var lightA:LightAttributes = new LightAttributes (true, 0.5);
var lightB:GouraudAttributes = new GouraudAttributes (true, 0.25);

var arwing:Arwing;
var Ship:ShipVars = new ShipVars();
var stars:Array = [];
var StarAmount:uint = 400;
var CalculatedSpeed:Number = 40;

var objectHolder:Array = [];
var objectexists:Array = [];
var objectnum:Number = 0;

var particleHolder:Array = [];
var particleexists:Array = [];
var particlenum:Number = 0;
var particles:StarField = new StarField ();

var spriteHolder:Array = [];
var spriteexists:Array = [];
var spritenum:Number = 0;

var p:Point = new Point ();
var f:BlurFilter = new BlurFilter (); 
var ct:ColorTransform = new ColorTransform (0.9, 0.7, 0.5);

var particleBitmapData:BitmapData;
var particleBitmap:Bitmap;

var oldpoint:Point;
var newpoint:Point;
function initialize():void {
    
    camera = new Camera3D( 465, 465);
    camera.z = -1500;
    camera.y = 0;
    root = new Group();
    
    camera2 = new CameraMode7( 465, 465);
    camera2.z = -1500;
    camera2.y = 0;
    root = new Group();
    
    lightA.diffuse = 0.5;
    lightA.specular = 0.5;
    lightA.gloss = 1;
    lightA.ambient = 0.5;
    
    lightB.diffuse = 2.5;
    lightB.specular = 1.5;
    lightB.gloss = 1;
    lightB.ambient = 0.4;
    
    arwing = new Arwing( "arwing");
    var materialAttr:MaterialAttributes = new MaterialAttributes(lightB);
     
    var colorArray:Array = [];
    for(var i:int=0;i<212;i++){
	    if(i > 0 && i <20){
		colorArray[i] = 0x212E9A;
	    }else{
		colorArray[i] = 0xAAAAAA;
	    }
    }
    var material:Material = new ColorMaterial2( 0xAAAAAA, 1, materialAttr, colorArray);
    material.lightingEnable = true;
    arwing.appearance = new Appearance(material)
    arwing.rotateY = 180;
    arwing.boundingSphere.radius = 400;
    root.addChild(arwing);
    var sf:StarField = new StarField();
    for (i = 0; i<StarAmount; i++) {
	//var stars[i]:Vertex = new Vertex ();
	stars[i] = new Vertex ();
	stars[i].x = 5000*(Math.random()-Math.random());
	stars[i].z = -2000+10000*(Math.random()-Math.random());
	stars[i].y = -800+3000*(Math.random()-Math.random());
	
	sf.stars.push(stars[i]);
	sf.starColors.push(0xFF000000 + Math.floor(Math.random() * 0xFFFFFF));
	sf.fadeFrom = 4000;
	sf.fadeTo = 15000;
    }
    sf.container.filters = [ new GlowFilter (0x7FFFFF, 0.5, 3, 3, 4) ];
    root.addChild(sf);
    
    particles = new StarField ();
    root.addChild(particles);
    //particles.addEventListener (sandy.events.StarFieldRenderEvent.BEFORE_RENDER, beforeRenderHandler);
    //particles.container.filters = [new BlurFilter (4,4,1)];
    
    particleBitmapData = new BitmapData(465,465,true, 0xFFFFFF);
    particleBitmap = new Bitmap(particleBitmapData);
    
    
    //var enemy:BasicEnemy1 = new BasicEnemy1("enemy");
    //enemy.appearance = new Appearance(material)
    //root.addChild(enemy);
    
    
    scene = new Scene3D( "scene", main, camera, root );
    scene.light.color = 0xFFFFFF;
    scene.light.setDirection(0, -100, 0);
    scene.light.setPower(2.5);
    

    camera2 = new CameraMode7( 465, 465);
    camera2.y = 800;
    root2 = new Group();
    
    var bmd:BitmapData = new BitmapData(400, 400, false, 0xCCCCCCCC);
    var channels:uint = BitmapDataChannel.BLUE | BitmapDataChannel.GREEN;
    bmd.perlinNoise(50, 200, 5, int(Math.random() * 10), true, true, channels, false, null);
             
    bmd.colorTransform(new Rectangle(0, 0, 400, 400), new ColorTransform(1,1,0.3,1, 40,20,-10, 0));
    
    var ground:Mode7 = new Mode7();
    ground.setBitmap(bmd, 2, true, false);
    ground.setHorizon(false);
    //ground.setNearFar (true)
    root2.addChild(ground);
    
    scene2 = new Scene3D( "scene2", main, camera2, root2 );
    
    
    var bg:Sprite = new Sprite();
    var colors:Array = [0x09B6FF, 0xFFFFFF, 0xFFFFFF];
    var alphas:Array = [1, 1, 0];
    var ratios:Array = [0x00, 0xDD, 0xFF];
    var mat:Matrix = new Matrix();
    mat.createGradientBox(1200, 400, Math.PI/2, 0, 0);
    bg.graphics.beginGradientFill(GradientType.LINEAR, colors, alphas, ratios, mat, SpreadMethod.PAD);
    bg.graphics.drawRect(0, 0, 1200, 400);
    bg.graphics.endFill();
    
    sky.addChild(bg);
    
    var bmd2:BitmapData = new BitmapData(1200, 350, true, 0);
    bmd2.perlinNoise(250, 100, 4, int(Math.random() * 10), false, false, BitmapDataChannel.ALPHA, false, null);
             
    bmd2.colorTransform(new Rectangle(0, 0, 1200, 350), new ColorTransform(1,1,1,2, 255,255,255, -200));      
    
    var bitmapsky:Bitmap = new Bitmap(bmd2);
    sky.addChild(bitmapsky);

bg.y = - 50;
bitmapsky.y = - 50;
    
    
    newpoint = new Point();
    oldpoint = new Point();
}
var count:int = 0;
function EveryFrame(event:Event):void{
    //debugText.text = "Text";
    
    var i:int = 0;
    var z:int = 0;
    
    if(isDown(Keyboard.RIGHT)){
        Ship.xspeed += 3;    
    }
     if(isDown(Keyboard.LEFT)){
        Ship.xspeed -= 3;  
    }
     if(isDown(Keyboard.UP)){
        Ship.yspeed += 3;    
    }
     if(isDown(Keyboard.DOWN)){
        Ship.yspeed -= 3;  
    }
    Ship.x += Ship.xspeed;
    Ship.y += Ship.yspeed;
    Ship.x = Math.min(Ship.x,800);
    Ship.x = Math.max(Ship.x,-800);
    Ship.y = Math.min(Ship.y,700);
    Ship.y = Math.max(Ship.y,-700);
    Ship.xspeed *= 0.9;
    Ship.yspeed *= 0.9;
    
    arwing.x = Ship.x;
    arwing.y = Ship.y;
    
    arwing.rotateY = 0;
    arwing.rotateZ = 0;
    arwing.lookAt(arwing.x,arwing.y,arwing.z-50);
    arwing.rotateY = 0;
    
    arwing.rotateZ += Ship.zrot;
    arwing.rotateX -= Ship.yspeed*0.75;
    arwing.rotateY = -Ship.xspeed*0.75;
    
    camera.x += ((-arwing.x/2)-camera.x)/5;
    camera.y += (((arwing.y+700)/4)-camera.y)/5;
    camera.lookAt(arwing.x/5,arwing.y/5,arwing.z);
    
    count++;
    if(count%30 == 0){
        createBasicEnemy1(Math.random()*2000-1000,Math.random()*1000-500,10000, [Math.random()*0.5-0.25,0,1], "BasicEnemy1EnterFrame",20);
    }
    if(isDown(Keyboard.SPACE)){
          if(count%5 == 0){
               shootlaser();
               //createBasicEnemy1(Math.random()*2000-1000,Math.random()*1000-500,5000, [Math.random()*0.5-0.25,0,1], "BasicEnemy1EnterFrame",20);
          }
     }
    
    var arraycounter:int = 0;
    for (i = 0; i<objectnum+1; i++) {
	if (objectexists[i] == true) {
		arraycounter = i;
		//this[objectHolder[i].functionname](i);
                if(objectHolder[i].functionname == "BasicEnemy1EnterFrame"){
                    BasicEnemy1EnterFrame(i);
                }else if(objectHolder[i].functionname == "LaserEnterFrame"){
                    LaserEnterFrame(i);
                }
                
	}
    }
    objectnum  = arraycounter+1;
    
    arraycounter = 0;
    for (i = 0; i<particlenum+1; i++) {
	if (particleexists[i] == true) {
		arraycounter = i;
		//this[spriteHolder[i].functionname](i);
                ParticleEnterFrame(i);
            
	}
    }
    particlenum  = arraycounter+1;
    
    for (i = 0; i<StarAmount; i++) {
	stars[i].z -= CalculatedSpeed;
	if(stars[i].z < -3000){
		stars[i].z += 20000;
	}
    }
    scene.render();
    
    // adding a blur to the explosions... (for some reason the beforeRenderHandler function does not work)
    particleBitmapData.draw(particles.container);
    particleBitmapData.applyFilter(particleBitmapData, particleBitmapData.rect, new Point(), new BlurFilter(6,6));
    particleBitmapData.colorTransform(particleBitmapData.rect, new ColorTransform(0.9, 0.9, 0.9, 0.99, 40, 30, 30, -1));
    
    // not perfect scrolling, but it looks a lot better when the camera is in motion
    newpoint = Convert3dTo2d(0,0,-50000, camera);
    particleBitmapData.scroll(newpoint.x-oldpoint.x,newpoint.y-oldpoint.y);
    oldpoint = newpoint;
    
    
    var savex:Number = camera.x;
    var savey:Number = camera.y;
    var savez:Number = camera.z;
    camera.moveForward(50);
    
    camera2.x = savex;
    camera2.y = savey;
    camera2.z = savez;
    camera2.lookAt(camera.x,camera.y,camera.z);
    camera2.y += 800;
    
    camera2.z=(CalculatedSpeed*count)%800+1000;
    
    scene2.render();
    
    camera.moveForward(-50);
    
    sky.x = Convert3dTo2d(0,0,-50000, camera).x-(sky.width/2);
    sky.y = Convert3dTo2d(0,0,-50000, camera).y-(sky.height/2);
}

function shootlaser():void {
    for (var i:int = 0; i<objectnum+1; i++) {
	if (objectexists[i] !== true) {
		objectexists[i] = true;
                if(i > objectnum){
                    objectHolder.push(new ObjectVars());
                }else{
                    objectHolder[i] = new ObjectVars();
                }
                objectHolder[i].exists = true;
	        objectHolder[i].object = new Laser("laser"+i);
	        var lasermaterialAttr:MaterialAttributes=new MaterialAttributes(new LightAttributes(true,0.2));
	        var lasermaterial:Material = new ColorMaterial( 0x00FF00, 0.5, lasermaterialAttr);
	        objectHolder[i].object.appearance = new Appearance(lasermaterial);
	         //
	        objectHolder[i].object.x = arwing.x;
	        objectHolder[i].object.y = arwing.y;
	        objectHolder[i].object.z = arwing.z;
                arwing.moveForward(-100);
	        objectHolder[i].object.lookAt(arwing.x,arwing.y,arwing.z);
                arwing.moveForward(100);
	        objectHolder[i].object.scaleZ = 30;
	        objectHolder[i].object.moveForward(-500);
	        objectHolder[i].functionname = "LaserEnterFrame";
	        objectHolder[i].Name = "laser"
	        objectHolder[i].count = 0;
                objectHolder[i].object.boundingSphere.radius = 100;
                //objectHolder[i].object.filters = [ new BlurFilter (4, 4, 2) ];
			
	        scene.root.addChild(objectHolder[i].object);
		objectnum++;
		break;
            }
        }
}
function LaserEnterFrame(i:int):void {
    var h:int = 0;
    var j:int = 0;
    var removed:Boolean = false;
    for(j=0;j<10;j++){
    	objectHolder[i].object.moveForward(1000/10);
        // insert collision detection
        for(h=0;h<objectnum;h++){
	    if (objectexists[h] == true) {
		if(h!==i){
		    if(objectHolder[h].Name == "BasicEnemy1"){
			if(Math.abs(objectHolder[i].object.x-objectHolder[h].object.x)<200 &&
                           Math.abs(objectHolder[i].object.y-objectHolder[h].object.y)<200 && 
                           Math.abs(objectHolder[i].object.z-objectHolder[h].object.z)<200 &&
                           objectHolder[h].count > 0
                        ){ 
			    // laser collide
			    
			    BasicEnemy1Hit(h);

                            removed = true;
		            //
			    j = 200;
			    h = objectnum+1;
			    break;
			    break;
			    break;
			}
		    }
                }
            }
        }
        
        
           
    }
    if(objectHolder[i].count == 0){
	    objectHolder[i].object.scaleZ = 40;
    }else if(objectHolder[i].count == 1){
	    objectHolder[i].object.scaleZ = 60;
    }else{
	    objectHolder[i].object.scaleZ = 80;
    }
    //objectHolder[i].count++;
    if(objectHolder[i].object.z > 20000){
	    removed = true;
    }
    if(objectexists[i] == true){
        if(removed == true){
           objectexists[i] = false;
           objectHolder[i].object.destroy();
           //objectHolder[i] = null;
        }
    }		
}


function createBasicEnemy1(X:Number,Y:Number, Z:Number, rot:Array, functionname:String, speed:Number):void {
    for (var i:int = 0; i<objectnum+1; i++) {
	if (objectexists[i] !== true) {
		objectexists[i] = true;
                if(i >= objectnum){
                    objectHolder.push(new ObjectVars());
                }else{
                    objectHolder[i] = new ObjectVars();
                }
                objectHolder[i].exists = true;
		objectHolder[i].object = new BasicEnemy1("BasicEnemy1"+i);
		var materialAttr:MaterialAttributes= new MaterialAttributes (lightB);
		var material:Material = new ColorMaterial( 0xAAAAAA, 1, materialAttr);
		material.lightingEnable = true;
		objectHolder[i].object.appearance = new Appearance(material);
		//
		objectHolder[i].object.x = X;
		objectHolder[i].object.y = Y;
		objectHolder[i].object.z = Z;
		//objectHolder[i].object.lookAt(pointer1.x,pointer1.y,pointer1.z);
		objectHolder[i].object.lookAt(X+rot[0],Y+rot[1],Z+rot[2])
		objectHolder[i].functionname = functionname;
		objectHolder[i].Name = "BasicEnemy1";
		objectHolder[i].speed = speed;
		objectHolder[i].HP = 1;
		objectHolder[i].count = 0;
		objectHolder[i].object.boundingSphere.radius = 100;
		objectHolder[i].X2 = 50;
		objectHolder[i].Y2 = 30;
		objectHolder[i].Z2 = 30;
		//
		scene.root.addChild(objectHolder[i].object);
		objectnum++;
		break;
            }
        }
}
function BasicEnemy1EnterFrame(i:int):void {
    var removed:Boolean = false;
    objectHolder[i].count++;
    if(objectHolder[i].HP > 0){
	objectHolder[i].object.z -= CalculatedSpeed;
	objectHolder[i].object.moveForward(-objectHolder[i].speed);
        if(objectHolder[i].object.z < -2000){
            removed = true
        }
    }else{
	removed = true
    }
    if(removed == true){
        objectexists[i] = false;
        objectHolder[i].object.destroy();
        //objectHolder[i] = null;
    }	
}
function BasicEnemy1Hit(who:int):void {
    if(objectHolder[who].HP > 0){
        objectHolder[who].HP = 0;
        // add explosion
        for(var q:int = 0;q<30;q++){
            createParticle(objectHolder[who].object.x,objectHolder[who].object.y,objectHolder[who].object.z,
            Math.random()*50-25,Math.random()*50-25,Math.random()*50-25, "particleEnterFrame", Math.random()*40+30);
        }
    }
}
function createParticle(X:Number,Y:Number, Z:Number, Xspeed:Number, Yspeed:Number, Zspeed:Number,
 functionname:String, lifeTime:Number):void {
     //debugText.appendText("Create Particle ");
    for (var p:int = 0; p<particlenum+1; p++) {
	if (particleexists[p] !== true) {
                   //debugText.appendText(p+"\n");
		particleexists[p] = true;
                if(p >= particlenum){
                    particleHolder.push(new ObjectVars());
                }else{
                    particleHolder[p] = new ObjectVars();
                }
                particleHolder[p].exists = true;
                
                particleHolder[p].vertex = new Vertex ();
		particleHolder[p].vertex.x = X;
		particleHolder[p].vertex.y = Y;
                particleHolder[p].vertex.z = Z;
                
                var gfx:MovieClip = new Circle;
                gfx.blendMode = BlendMode.ADD;
                particles.starSprites[p] = gfx;
                
                particleHolder[p].xspeed = Xspeed;
		particleHolder[p].yspeed = Yspeed;
                particleHolder[p].zspeed = Zspeed;
                particleHolder[p].lifeTime = lifeTime;
                
		//particles.stars.push(particleHolder[p].vertex);
                particles.stars[p] = particleHolder[p].vertex
		//particles.starColors[p] = (0xFF000000 + Math.floor(Math.random() * 0xFFFFFF));
		particles.starColors[p] = 0xFFFFFF00;
                particles.fadeFrom = 10000;
		particles.fadeTo = 15000;
                particlenum++;
                break;
        }
    }
}
function ParticleEnterFrame(i:int):void {
    
    var removed:Boolean = false;
    particleHolder[i].count++;
    if(true){
	particleHolder[i].vertex.z -= CalculatedSpeed;
	particleHolder[i].vertex.x += particleHolder[i].xspeed;
        particleHolder[i].vertex.y += particleHolder[i].yspeed;
        particleHolder[i].vertex.z += particleHolder[i].zspeed;
        particleHolder[i].yspeed -= 1;
        if(particleHolder[i].vertex.y < -800){
            particleHolder[i].yspeed = Math.max(-0.8*particleHolder[i].yspeed,0);
        }
        
        var newAlpha:Number = 255-(particleHolder[i].count/particleHolder[i].lifeTime)*255;
        
        var argb:uint = 0;
        argb += (newAlpha<<24);
        argb += (0xFFFF37);
        particles.starColors[i] = argb;
        
        if(particleHolder[i].count > particleHolder[i].lifeTime){
            removed = true
        }
    }else{
	removed = true
    }
    if(removed == true){
       particleexists[i] = false;
       particleHolder[i].vertex = null;
       particles.starColors[i] = null;
        //objectHolder[i] = null;
    }	
}
/*
function beforeRenderHandler (event:sandy.events.StarFieldRenderEvent):void {
    //debugText.appendText(String(particles.container.getChildAt(0)));
    // do not clear bitmap data from last frame
    
    event.clear = false;
    // blur and fade instead
    event.bitmapData.applyFilter (event.bitmapData, event.bitmapData.rect, p, f);
    event.bitmapData.colorTransform (event.bitmapData.rect, ct);
}
*/
class ShipVars{
    public var xspeed:Number = 0;
    public var yspeed:Number = 0;
    public var x:Number = 0;
    public var y:Number = 0;
    public var zrot:Number = 0;
}
class ObjectVars{
    public var xspeed:Number = 0;
    public var yspeed:Number = 0;
    public var zspeed:Number = 0;
    public var X2:Number = 0;
    public var Y2:Number = 0;
    public var Z2:Number = 0;
    public var HP:Number;
    public var count:Number = 0;
    public var speed:Number = 0;
    public var exists:Boolean = false;
    public var object;
    public var vertex:Vertex;
    public var lifeTime:Number;
    public var functionname:String;
    public var Name:String;
    public var aArray:Array = new Array();
}
class Circle extends MovieClip{
    //var clip:MovieClip = new MovieClip();
    public var sprite:Sprite = new Sprite();
    public function Circle():void{
        var size:Number = 40;
        var matrix:Matrix = new Matrix;
        matrix.createGradientBox(size * 2, size * 2, 0, -size, -size);
        sprite.graphics.beginGradientFill(GradientType.RADIAL,
         [0xFFFFFF,0xFFFFFF], // colors
         [0xFF, 0x00],        // alpha
         [0x00, 0xFF],        // ratio
         matrix,
         SpreadMethod.PAD
         );
        sprite.graphics.drawCircle( 0, 0, size); 
        sprite.graphics.endFill();
        addChild(sprite);
    }
    
}
function Convert3dTo2d(X:Number,Y:Number,Z:Number, camera:Camera3D):Point{
			//Want to find 3d scene origin as 2d Screen coords ( or any arbitary 3d Point )
            var _v:Vertex = new Vertex(X,Y,Z);
            var m:Matrix4 = camera.invModelMatrix;
            _v.wx = _v.x * m.n11 + _v.y * m.n12 + _v.z * m.n13 + m.n14;
            _v.wy = _v.x * m.n21 + _v.y * m.n22 + _v.z * m.n23 + m.n24;
            _v.wz = _v.x * m.n31 + _v.y * m.n32 + _v.z * m.n33 + m.n34;
            camera.projectVertex(_v);
           // trce( "sx:"+_v.sx + "," + "sy:"+_v.sy );//  which is the center of the viewport
                var _point:Point = new Point();
                _point.x = _v.sx;
                _point.y = _v.sy;
		   return(_point);
}

var initialized:Boolean = false;// marks whether or not the class has been initialized
var keysDown:Object = new Object();// stores key codes of all keys pressed
function isDown(keyCode:uint):Boolean {
	return Boolean(keyCode in keysDown);
}
function keyPressed(event:KeyboardEvent):void {
       	keysDown[event.keyCode] = true;
}
function keyReleased(event:KeyboardEvent):void {
	if (event.keyCode in keysDown) {
		delete keysDown[event.keyCode];
	}
}
class Arwing extends Shape3D implements Primitive3D {
		private var l:Geometry3D;

		private function f(v1:Number,v2:Number,v3:Number,uv00:Number,uv01:Number,uv10:Number,uv11:Number,uv20:Number,uv21:Number,normX:Number,normY:Number,normZ:Number):void {
			var uv1:Number = l.getNextUVCoordID();
			var uv2:Number = uv1 + 1;
			var uv3:Number = uv2 + 1;

			l.setUVCoords(uv1,uv00,1-uv01);
			l.setUVCoords(uv2,uv10,1-uv11);
			l.setUVCoords(uv3,uv20,1-uv21);

			l.setFaceVertexIds(l.getNextFaceID(), v1,v2,v3);
			l.setFaceUVCoordsIds(l.getNextFaceUVCoordID(), uv1,uv2,uv3);
			l.setFaceNormal(l.getNextFaceNormalID(), normX,normZ,normY);
		}

		private function f2(v1:Number,v2:Number,v3:Number):void {
			l.setFaceVertexIds(l.getNextFaceID(), v1,v2,v3);
		}

		private function v(vx:Number,vy:Number,vz:Number):void {
			l.setVertex(l.getNextVertexID(),vx,vz,vy);
		}

		public function Arwing( p_Name:String=null ) {
			super( p_Name );
			geometry = generate();
		}

		public function generate(... arguments):Geometry3D {
			l = new Geometry3D();
			v(1.000000,1.000000,-0.683356);
			v(0.944110,-1.095600,-0.645164);
			v(-0.944111,-1.095600,-0.645164);
			v(-1.000000,1.000000,-0.683356);
			v(1.000000,0.999999,0.683356);
			v(0.944110,-1.095600,0.645164);
			v(-0.944111,-1.095600,0.645164);
			v(-1.000000,1.000000,0.683356);
			v(-0.679618,-4.902941,0.464420);
			v(0.679615,-4.902942,0.464420);
			v(-0.679618,-4.902941,-0.464421);
			v(0.679616,-4.902941,-0.464421);
			v(0.065945,-8.797762,-0.045066);
			v(-0.065950,-8.797762,-0.045066);
			v(0.065945,-8.797762,0.045065);
			v(-0.065950,-8.797762,0.045065);
			v(-1.000000,-1.000000,0.204147);
			v(-1.000000,1.000000,0.204147);
			v(1.000000,0.999999,0.204147);
			v(0.999999,-1.000001,0.204147);
			v(-1.000000,1.000000,-0.204147);
			v(-1.000000,-1.000000,-0.204147);
			v(1.000000,-1.000000,-0.204147);
			v(1.000000,1.000000,-0.204147);
			v(2.083799,-1.000000,-0.204147);
			v(2.083799,1.000000,-0.204147);
			v(2.083800,0.999999,0.204147);
			v(2.083798,-1.000001,0.204147);
			v(-2.083798,1.000000,-0.204147);
			v(-2.083799,-1.000000,-0.204147);
			v(-2.083800,-1.000000,0.204147);
			v(-2.083798,1.000000,0.204147);
			v(-2.222009,-1.535249,0.123641);
			v(-2.222008,1.535249,0.123641);
			v(2.222010,1.535248,0.123641);
			v(2.222007,-1.535251,0.123641);
			v(-2.222008,1.535250,-0.123641);
			v(-2.222009,-1.535249,-0.123641);
			v(2.222008,-1.535249,-0.123641);
			v(2.222008,1.535249,-0.123641);
			v(4.019095,1.491733,-0.098951);
			v(4.019095,-0.121116,-0.098951);
			v(4.019097,1.491732,0.098950);
			v(4.019093,-0.121116,0.098950);
			v(-4.019095,-0.121115,-0.098951);
			v(-4.019093,1.491733,-0.098951);
			v(-4.019096,-0.121115,0.098950);
			v(-4.019094,1.491733,0.098950);
			v(-4.111470,-0.121115,0.098950);
			v(-4.111467,1.491733,0.098950);
			v(4.111471,1.491732,0.098950);
			v(4.111466,-0.121116,0.098950);
			v(-4.111467,1.491733,-0.098951);
			v(-4.111469,-0.121115,-0.098951);
			v(4.111469,-0.121116,-0.098951);
			v(4.111469,1.491733,-0.098951);
			v(5.027250,-0.494357,-0.068746);
			v(5.027250,1.118492,-0.068746);
			v(5.027252,1.118491,0.068746);
			v(5.027246,-0.494357,0.068746);
			v(-5.027248,-0.494357,-0.068746);
			v(-5.027246,1.118492,-0.068746);
			v(-5.027249,-0.494357,0.068746);
			v(-5.027246,1.118492,0.068746);
			v(-5.693155,-1.072972,0.039673);
			v(-5.693151,1.107409,0.039673);
			v(5.693157,1.107409,0.039673);
			v(5.693150,-1.072973,0.039673);
			v(-5.693151,1.107410,-0.039674);
			v(-5.693153,-1.072972,-0.039674);
			v(5.693154,-1.072972,-0.039674);
			v(5.693154,1.107409,-0.039674);
			v(7.845545,0.625659,-0.019098);
			v(7.845545,0.384196,-0.019098);
			v(7.845547,0.625659,0.019098);
			v(7.845538,0.384196,0.019098);
			v(-7.845544,0.384196,-0.019098);
			v(-7.845539,0.625659,-0.019098);
			v(-7.845545,0.384196,0.019098);
			v(-7.845539,0.625659,0.019098);
			v(-0.696005,-0.680794,0.748494);
			v(-0.696005,0.770009,1.053621);
			v(0.696004,-0.680795,0.748494);
			v(0.696005,0.770009,1.053621);
			v(0.372146,-0.646706,0.855366);
			v(0.372146,0.557490,1.738617);
			v(-0.372146,0.557491,1.738617);
			v(-0.372146,-0.646706,0.855366);
			v(0.045225,3.751054,0.030905);
			v(-0.045224,3.751054,0.030905);
			v(-0.045224,3.751054,-0.030904);
			v(0.045225,3.751054,-0.030904);
			v(-1.975420,-0.800000,0.218665);
			v(-1.975419,0.800000,0.218665);
			v(1.975420,0.799999,0.218665);
			v(1.975418,-0.800001,0.218665);
			v(-1.108380,0.800000,0.218665);
			v(-1.108380,-0.800000,0.218665);
			v(1.108379,-0.800001,0.218665);
			v(1.108380,0.799999,0.218665);
			v(-1.498548,5.517805,1.838372);
			v(-1.498548,-5.517756,0.497377);
			v(1.498547,-5.517806,0.497371);
			v(1.498548,5.517756,1.838366);
			v(1.585251,5.517756,1.838366);
			v(1.585251,-5.517806,0.497371);
			v(-1.585252,-5.517756,0.497377);
			v(-1.585251,5.517805,1.838372);

			f2(101,100,107);
			f2(101,107,106);
			f2(103,102,105);
			f2(103,105,104);
			f2(93,92,106);
			f2(93,106,107);
			f2(95,94,105);
			f2(94,104,105);
			f2(96,93,107);
			f2(96,107,100);
			f2(92,97,101);
			f2(92,101,106);
			f2(98,95,105);
			f2(98,105,102);
			f2(94,99,103);
			f2(94,103,104);
			f2(99,98,102);
			f2(99,102,103);
			f2(97,96,101);
			f2(96,100,101);
			f2(16,17,96);
			f2(16,96,97);
			f2(18,19,98);
			f2(18,98,99);
			f2(26,18,94);
			f2(18,99,94);
			f2(19,27,98);
			f2(27,95,98);
			f2(30,16,92);
			f2(16,97,92);
			f2(17,31,96);
			f2(31,93,96);
			f2(27,26,94);
			f2(27,94,95);
			f2(31,30,92);
			f2(31,92,93);
			f2(88,91,90);
			f2(88,90,89);
			f2(0,3,90);
			f2(0,90,91);
			f2(4,0,88);
			f2(0,91,88);
			f2(3,7,89);
			f2(3,89,90);
			f2(7,4,88);
			f2(7,88,89);
			f2(85,86,87);
			f2(85,87,84);
			f2(81,80,87);
			f2(81,87,86);
			f2(80,82,87);
			f2(82,84,87);
			f2(83,81,85);
			f2(81,86,85);
			f2(82,83,84);
			f2(83,85,84);
			f2(5,4,82);
			f2(4,83,82);
			f2(4,7,81);
			f2(4,81,83);
			f2(6,5,82);
			f2(6,82,80);
			f2(7,6,80);
			f2(7,80,81);
			f2(76,78,79);
			f2(76,79,77);
			f2(72,74,73);
			f2(74,75,73);
			f2(64,65,78);
			f2(65,79,78);
			f2(66,67,75);
			f2(66,75,74);
			f2(65,68,77);
			f2(65,77,79);
			f2(69,64,76);
			f2(64,78,76);
			f2(68,69,76);
			f2(68,76,77);
			f2(67,70,75);
			f2(70,73,75);
			f2(71,66,72);
			f2(66,74,72);
			f2(70,71,73);
			f2(71,72,73);
			f2(56,57,71);
			f2(56,71,70);
			f2(57,58,71);
			f2(58,66,71);
			f2(59,56,67);
			f2(56,70,67);
			f2(61,60,68);
			f2(60,69,68);
			f2(60,62,69);
			f2(62,64,69);
			f2(63,61,68);
			f2(63,68,65);
			f2(58,59,66);
			f2(59,67,66);
			f2(62,63,65);
			f2(62,65,64);
			f2(48,49,63);
			f2(48,63,62);
			f2(50,51,58);
			f2(51,59,58);
			f2(49,52,61);
			f2(49,61,63);
			f2(53,48,60);
			f2(48,62,60);
			f2(52,53,61);
			f2(53,60,61);
			f2(51,54,59);
			f2(54,56,59);
			f2(55,50,57);
			f2(50,58,57);
			f2(54,55,57);
			f2(54,57,56);
			f2(41,40,55);
			f2(41,55,54);
			f2(40,42,55);
			f2(42,50,55);
			f2(43,41,51);
			f2(41,54,51);
			f2(45,44,52);
			f2(44,53,52);
			f2(44,46,53);
			f2(46,48,53);
			f2(47,45,52);
			f2(47,52,49);
			f2(42,43,51);
			f2(42,51,50);
			f2(46,47,49);
			f2(46,49,48);
			f2(32,33,46);
			f2(33,47,46);
			f2(34,35,43);
			f2(34,43,42);
			f2(33,36,45);
			f2(33,45,47);
			f2(37,32,44);
			f2(32,46,44);
			f2(36,37,44);
			f2(36,44,45);
			f2(35,38,43);
			f2(38,41,43);
			f2(39,34,40);
			f2(34,42,40);
			f2(38,39,41);
			f2(39,40,41);
			f2(24,25,39);
			f2(24,39,38);
			f2(25,26,34);
			f2(25,34,39);
			f2(27,24,38);
			f2(27,38,35);
			f2(28,29,37);
			f2(28,37,36);
			f2(29,30,37);
			f2(30,32,37);
			f2(31,28,33);
			f2(28,36,33);
			f2(26,27,34);
			f2(27,35,34);
			f2(30,31,33);
			f2(30,33,32);
			f2(17,20,28);
			f2(17,28,31);
			f2(21,16,29);
			f2(16,30,29);
			f2(20,21,28);
			f2(21,29,28);
			f2(19,22,27);
			f2(22,24,27);
			f2(23,18,25);
			f2(18,26,25);
			f2(22,23,25);
			f2(22,25,24);
			f2(1,0,22);
			f2(0,23,22);
			f2(0,4,18);
			f2(0,18,23);
			f2(5,1,19);
			f2(1,22,19);
			f2(3,2,21);
			f2(3,21,20);
			f2(2,6,21);
			f2(6,16,21);
			f2(7,3,20);
			f2(7,20,17);
			f2(4,5,19);
			f2(4,19,18);
			f2(6,7,16);
			f2(7,17,16);
			f2(12,14,15);
			f2(12,15,13);
			f2(9,8,15);
			f2(9,15,14);
			f2(8,10,15);
			f2(10,13,15);
			f2(11,9,12);
			f2(9,14,12);
			f2(10,11,12);
			f2(10,12,13);
			f2(2,1,11);
			f2(2,11,10);
			f2(1,5,11);
			f2(5,9,11);
			f2(6,2,8);
			f2(2,10,8);
			f2(5,6,8);
			f2(5,8,9);
			f2(0,1,2);
			f2(0,2,3);

			this.x = 0.000000;
			this.y = 0.000000;
			this.z = 0.000000;

			this.rotateX = 0.000000;
			this.rotateY = 0.000000;
			this.rotateZ = 0.000000;

			this.scaleX = 50.000000;
			this.scaleY = 50.000000;
			this.scaleZ = 50.000000;
			return (l);
		}
	}

class BasicEnemy1 extends Shape3D implements Primitive3D {
		private var l:Geometry3D;

		private function f(v1:Number,v2:Number,v3:Number,uv00:Number,uv01:Number,uv10:Number,uv11:Number,uv20:Number,uv21:Number,normX:Number,normY:Number,normZ:Number):void {
			var uv1:Number = l.getNextUVCoordID();
			var uv2:Number = uv1 + 1;
			var uv3:Number = uv2 + 1;

			l.setUVCoords(uv1,uv00,1-uv01);
			l.setUVCoords(uv2,uv10,1-uv11);
			l.setUVCoords(uv3,uv20,1-uv21);

			l.setFaceVertexIds(l.getNextFaceID(), v1,v2,v3);
			l.setFaceUVCoordsIds(l.getNextFaceUVCoordID(), uv1,uv2,uv3);
			l.setFaceNormal(l.getNextFaceNormalID(), normX,normZ,normY);
		}

		private function f2(v1:Number,v2:Number,v3:Number):void {
			l.setFaceVertexIds(l.getNextFaceID(), v1,v2,v3);
		}

		private function v(vx:Number,vy:Number,vz:Number):void {
			l.setVertex(l.getNextVertexID(),vx,vz,vy);
		}

		public function BasicEnemy1( p_Name:String=null ) {
			super( p_Name );
			geometry = generate();
		}

		public function generate(... arguments):Geometry3D {
			l = new Geometry3D();
			v(0.346457,0.086613,-0.707120);
			v(0.346457,-0.606302,-0.707120);
			v(-0.346457,-0.606302,-0.707120);
			v(-0.346457,0.086613,-0.707120);
			v(1.000000,0.999999,0.015341);
			v(0.999999,-2.202131,0.056095);
			v(-1.000000,-2.202130,0.056095);
			v(-1.000000,1.000000,0.015341);
			v(-1.117323,-2.262512,0.773255);
			v(-1.339531,1.000000,0.657432);
			v(1.117322,-2.262513,0.773255);
			v(1.339532,0.999999,0.657432);
			v(2.784543,-1.193082,0.122345);
			v(2.784544,0.663639,0.122345);
			v(2.784544,0.663639,0.508227);
			v(2.784543,-1.193082,0.508227);
			v(-2.784544,0.663640,0.122345);
			v(-2.784544,-1.193082,0.122345);
			v(-2.784544,-1.193082,0.508227);
			v(-2.784544,0.663640,0.508227);
			v(-5.725144,-3.028431,0.155846);
			v(5.725143,-3.028431,0.155846);
			v(-0.000001,-2.796015,0.387788);
			v(-0.000001,-2.645047,0.086207);
			v(0.999999,-1.007476,1.353194);
			v(1.000000,0.620361,1.128460);
			v(-1.000000,0.620361,1.128460);
			v(-1.000000,-1.007476,1.353194);
			v(-0.151609,0.620361,1.128460);
			v(-0.151609,-0.696661,1.423103);
			v(0.151609,-0.696661,1.423103);
			v(-0.151609,1.000000,0.615231);
			v(0.151609,0.620361,1.128460);
			v(0.151609,0.999999,0.615231);
			v(-0.021496,1.089991,2.153404);
			v(0.021499,1.089991,2.153404);
			v(0.021499,0.520902,2.498386);
			v(0.021499,-0.280928,2.807672);
			v(-0.021496,0.520902,2.498386);
			v(-0.021496,-0.280928,2.807673);

			f2(17,20,16);
			f2(18,20,17);
			f2(19,20,18);
			f2(16,20,19);
			f2(13,21,12);
			f2(14,21,13);
			f2(15,21,14);
			f2(12,21,15);
			f2(10,8,22);
			f2(6,5,23);
			f2(36,38,39);
			f2(36,39,37);
			f2(35,34,38);
			f2(35,38,36);
			f2(28,29,38);
			f2(29,39,38);
			f2(29,30,37);
			f2(29,37,39);
			f2(31,28,34);
			f2(28,38,34);
			f2(30,32,36);
			f2(30,36,37);
			f2(32,33,35);
			f2(32,35,36);
			f2(33,31,34);
			f2(33,34,35);
			f2(11,9,33);
			f2(9,31,33);
			f2(25,11,33);
			f2(25,33,32);
			f2(24,25,30);
			f2(25,32,30);
			f2(9,26,31);
			f2(26,28,31);
			f2(27,24,29);
			f2(24,30,29);
			f2(26,27,29);
			f2(26,29,28);
			f2(9,8,27);
			f2(9,27,26);
			f2(8,10,24);
			f2(8,24,27);
			f2(10,11,24);
			f2(11,25,24);
			f2(8,6,22);
			f2(6,23,22);
			f2(5,10,22);
			f2(5,22,23);
			f2(7,16,9);
			f2(16,19,9);
			f2(9,19,18);
			f2(9,18,8);
			f2(8,18,17);
			f2(8,17,6);
			f2(6,17,7);
			f2(17,16,7);
			f2(5,12,10);
			f2(12,15,10);
			f2(10,15,11);
			f2(15,14,11);
			f2(11,14,13);
			f2(11,13,4);
			f2(4,13,12);
			f2(4,12,5);
			f2(4,7,9);
			f2(4,9,11);
			f2(4,0,3);
			f2(4,3,7);
			f2(2,6,7);
			f2(2,7,3);
			f2(1,5,6);
			f2(1,6,2);
			f2(0,4,1);
			f2(4,5,1);
			f2(0,1,2);
			f2(0,2,3);

			this.x = 0;
			this.y = 0;
			this.z = 0;

			this.rotateX = 0;
			this.rotateY = 0;
			this.rotateZ = 0;

			this.scaleX = 30;
			this.scaleY = 30;
			this.scaleZ = 30;
			return (l);
		}
	}
class Laser extends Shape3D implements Primitive3D {
		private var l:Geometry3D;
		private function v(x:Number,y:Number,z:Number):void {
			l.setVertex(l.getNextVertexID(),x,y,z );
		}
		private function vn(nx:Number,ny:Number,nz:Number):void {
			l.setVertexNormal(l.getNextVertexNormalID(),nx,ny,nz );
		}
		private function uv(u:Number,v:Number):void {
			l.setUVCoords(l.getNextUVCoordID(),u,v);
		}
		private function f(vn0:int, vn1:int, vn2:int, uvn0:int, uvn1:int,uvn2:int):void {
			l.setFaceVertexIds(l.getNextFaceID(), vn0, vn1,vn2);
			l.setFaceUVCoordsIds( l.getNextFaceUVCoordID(), uvn0,uvn1,uvn2);
		}
		public function Laser( p_Name:String=null ) {
			super( p_Name );

			geometry = generate() ;
		}

		public function generate(... arguments):Geometry3D {
			l = new Geometry3D();
			v(0.0,-2.06958e-006,47.3464);
			v(2.50081,-2.06958e-006,47.3464);
			v(-1.2504,-2.16577,47.3464);
			v(-1.2504,2.16576,47.3464);
			v(4.80655,-1.72654e-006,39.4986);
			v(-2.40328,-4.1626,39.4986);
			v(-2.40328,4.1626,39.4986);
			v(4.80655,-3.4304e-007,7.84785);
			v(-2.40328,-4.1626,7.84785);
			v(-2.40328,4.1626,7.84785);
			v(2.50081,0.0,0.0);
			v(-1.2504,-2.16577,0.0);
			v(-1.2504,2.16577,0.0);
			v(0.0,0.0,0.0);
			uv(0.5,0.5);
			uv(0.760146,0.5);
			uv(0.369927,0.274707);
			uv(0.369927,0.725293);
			uv(1.0,0.5);
			uv(0.25,0.0669873);
			uv(0.25,0.933013);
			uv(0.0,0.0);
			uv(0.333333,0.0);
			uv(0.666667,0.0);
			uv(1.0,0.0);
			uv(0.0,1.0);
			uv(0.333333,1.0);
			uv(0.666667,1.0);
			uv(1.0,1.0);
			uv(1.0,0.5);
			uv(0.25,0.0669873);
			uv(0.25,0.933013);
			uv(0.760146,0.5);
			uv(0.369927,0.274707);
			uv(0.369927,0.725293);
			uv(0.5,0.5);
			f(0,1,2,0,1,2);
			f(0,2,3,0,2,3);
			f(0,3,1,0,3,1);
			f(1,4,5,1,4,5);
			f(1,5,2,1,5,2);
			f(2,5,6,2,5,6);
			f(2,6,3,2,6,3);
			f(3,6,4,3,6,4);
			f(3,4,1,3,4,1);
			f(4,7,8,7,11,12);
			f(4,8,5,7,12,8);
			f(5,8,9,8,12,13);
			f(5,9,6,8,13,9);
			f(6,9,7,9,13,14);
			f(6,7,4,9,14,10);
			f(7,10,11,15,18,19);
			f(7,11,8,15,19,16);
			f(8,11,12,16,19,20);
			f(8,12,9,16,20,17);
			f(9,12,10,17,20,18);
			f(9,10,7,17,18,15);
			f(10,13,11,18,21,19);
			f(11,13,12,19,21,20);
			f(12,13,10,20,21,18);
			this.x = 0;
			this.y = 0;
			this.z = 0;

			this.rotateX = 0;
			this.rotateY = 0;
			this.rotateZ = 0;

			this.scaleX = 5;
			this.scaleY = 5;
			this.scaleZ = 5;
			return l;
		}
	}

// using an edited version of Sandy3d's Color Material
	class ColorMaterial2 extends Material
	{
		private var m_nColor:Number;
		private var m_nAlpha:Number;
		private var m_nArray:Array;
		private var firstPolygonId:int = -1;
		

		/**
		 * Creates a new ColorMaterial.
		 *
		 * @param p_nColor 	The color for this material in hexadecimal notation
		 * @param p_nAlpha	The alpha value in percent of full opacity ( 0 - 1 )
		 * @param p_oAttr	The attributes for this material
		 */
		public function ColorMaterial2( p_nColor:uint = 0x00, p_nAlpha:Number = 1, p_oAttr:MaterialAttributes = null, p_nArray:Array = null)
		{
			super(p_oAttr);
			// --
			m_oType = MaterialType.COLOR;
			// --
			m_nColor = p_nColor;
			m_nAlpha = p_nAlpha;
			m_nArray = p_nArray;
		}

		/**
		 * Renders this material on the face it dresses
		 *
		 * @param p_oScene		The current scene
		 * @param p_oPolygon	The face to be rendered
		 * @param p_mcContainer	The container to draw on
		 */
		public override function renderPolygon( p_oScene:Scene3D, p_oPolygon:Polygon, p_mcContainer:Sprite ):void
		{
			if(firstPolygonId  > p_oPolygon.id || firstPolygonId == -1){
				firstPolygonId = p_oPolygon.id;
				//trce(firstPolygonId);
			}
			const l_points:Array = (p_oPolygon.isClipped) ? p_oPolygon.cvertices : p_oPolygon.vertices;
			if( !l_points.length ) return;
			var l_oVertex:Vertex;
			var lId:int = l_points.length;
			var l_graphics:Graphics = p_mcContainer.graphics;
			// --
			l_graphics.lineStyle();
			l_graphics.beginFill( m_nArray[p_oPolygon.id-firstPolygonId], m_nAlpha );
			l_graphics.moveTo( l_points[0].sx, l_points[0].sy );
			while( l_oVertex = l_points[ --lId ] )
				l_graphics.lineTo( l_oVertex.sx, l_oVertex.sy );
			l_graphics.endFill();
			// --
			if( attributes )  attributes.draw( l_graphics, p_oPolygon, this, p_oScene ) ;

		}

		/**
		 * @private
		 */
		public function get alpha():Number
		{
			return m_nAlpha;
		}

		/**
		 * @private
		 */
		public function get color():Number
		{
			return m_nColor;
		}


		/**
		 * The alpha value for this material ( 0 - 1 )
		 *
		 * Alpha = 0 means fully transparent, alpha = 1 fully opaque.
		 */
		public function set alpha(p_nValue:Number):void
		{
			m_nAlpha = p_nValue;
			m_bModified = true;
		}

		/**
		 * The color of this material
		 */
		public function set color(p_nValue:Number):void
		{
			m_nColor = p_nValue;
			m_bModified = true;
		}
		
	}