// 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; } } Spaceship Game (With Explosions and Mode7)