I make a plugin on Flash 10 and as3 but I can see it on Krpano
Here for the SWF
Plugin on Flash 10
-
-
Hi,
it seems that the plugin tries to access the "stage" object, but this is not available direct after loading,
before doing anything in a plugin, it should wait for the ADDED_TO_STAGE event,
e.g.
Code
Display Morethis.addEventListener(Event.ADDED_TO_STAGE, startplugin); ... public function startplugin(evt:Event):void { this.removeEventListener(Event.ADDED_TO_STAGE, startplugin); // now start really ... }
best regards,
Klaus -
the as3 code
Code
Display More// creates a sphere function createSphere(radius:Number, parallels:int, meridians:int, trianglePathOut:GraphicsTrianglePath, vertices3DOut:Vector.<Number>):void { if (parallels < 3) parallels = 3; if (meridians < 3) meridians = 3; meridians++; // texture edge meridian duplicated var parallelStops:int = parallels-1; // for determining u var meridianStops:int = meridians-1; // for determining v // local variables var r:Number; // radius var x:Number, y:Number, z:Number; // coordinates var p:int, pi:int, pa:Number; // parallel vars var m:int, mi:int, ma:Number; // meridian vars var u:Number, v:Number; // u, v of uvt var n:int = -1; // vertices index // horizontal for (p=0; p<parallels; p++){ v = p/parallelStops; pa = v*Math.PI - Math.PI/2; y = radius*Math.sin(pa); r = radius*Math.cos(pa); // vertical for (m=0; m<meridians; m++){ u = m/meridianStops; ma = u*Math.PI*2; x = r*Math.cos(ma); z = r*Math.sin(ma); // vertices vertices3DOut.push(x,y,z); n++; // trianglePathOut trianglePathOut.uvtData.push(u, v, 1); if (m != 0){ // not first meridian (texture edge) if (p != parallelStops){ // not last parallel (no next parallel to connect) trianglePathOut.indices.push(n, n+meridians, n+meridians-1); trianglePathOut.indices.push(n, n+meridians-1, n-1); } } } } } // creates a darker version of a bitmap function getDarkerBitmap(source:BitmapData, darkness:Number):BitmapData { // put source in a Bitmap display object // and darken it using a ColorTransform var darker:Bitmap = new Bitmap(source); darker.transform.colorTransform = new ColorTransform(darkness, darkness, darkness); // draw() does not take in account of // transformations on the object you draw // so place it in a container var container:Sprite = new Sprite(); container.addChild(darker); // create a new BitmapData drawing // the darker image in the container var bmp:BitmapData = new BitmapData(source.width, source.height, source.transparent, 0); bmp.draw(container); return bmp; } // create globe shape var globe:Shape = new Shape(); globe.x = stage.stageWidth/2; globe.y = stage.stageHeight/2; addChild(globe); // globe variables var globeRadius:Number = 100; var globeParallels:int = 20; var globeMeridians:int = 20; var globeSpinSpeed:Number = 2; var frontFace:BitmapData = new Erfj(0,0); var backFace:BitmapData = getDarkerBitmap(frontFace, .25); var globeTransform:Matrix3D = new Matrix3D(); globeTransform.appendTranslation(0, 0, globeRadius*4); // push back in 3D space var globeProjection:PerspectiveProjection = new PerspectiveProjection(); var globePerspective:Matrix3D = globeProjection.toMatrix3D(); // a GraphicsTrianglePath for the path // data to be drawn in Flash var triangles:GraphicsTrianglePath = new GraphicsTrianglePath( new Vector.<Number>(), new Vector.<int>(), new Vector.<Number>(), TriangleCulling.NEGATIVE); // a new GraphicsTrianglePath container using the // same vector data as triangles is created to draw // the backside of the sphere once the darker version // of the bitmap is added to the drawing state var trianglesBack:GraphicsTrianglePath = new GraphicsTrianglePath( triangles.vertices, triangles.indices, triangles.uvtData, TriangleCulling.POSITIVE); // stroke for when mouse is pressed // start with a NaN width (no stroke) var stroke:GraphicsStroke = new GraphicsStroke(NaN, false, "normal", "none", "round", 3, new GraphicsSolidFill(0xeff10a)); // create a vector of Number objects to store // 3D locations of sphere coordinates var vertices3D:Vector.<Number> = new Vector.<Number>(); // to be non-destructive, changes to the sphere // coordinates are added to this vector var vertices3DTransformed:Vector.<Number> = new Vector.<Number>(); // populate triangles and vertices3D and with // sphere data; note that the triangles vector data // is being modified but this also affects trianglesBack // since it uses those same vectors createSphere(globeRadius, globeParallels, globeMeridians, // in triangles, vertices3D); // out // IGraphicsData list of drawing commands, drawing back face // first (dark), followed by front face (light) var globeData:Vector.<IGraphicsData> = Vector.<IGraphicsData>([ stroke, new GraphicsBitmapFill(backFace, null, false, true), trianglesBack, new GraphicsBitmapFill(frontFace, null, false, true), triangles ]); // rotate globe in frame loop addEventListener(Event.ENTER_FRAME, draw); function draw(event:Event):void { // rotate the globe transform around the y axis // using prepend allows this to be applied // "before" the previous translation in z globeTransform.prependRotation(-globeSpinSpeed, Vector3D.Y_AXIS); // apply the transform to the globe vertices // to make the globe points actually rotated // (as well as pushed back in z) globeTransform.transformVectors(vertices3D, // in vertices3DTransformed); // out // convert the 3D points to 2D points and update // the T data in the UVT to coorectly account for // the translation of 2D to 3D for the bitmaps Utils3D.projectVectors(globePerspective, vertices3DTransformed, // in triangles.vertices, triangles.uvtData); // out // draw the triangles globe.graphics.clear(); globe.graphics.drawGraphicsData(globeData); } // show outlines when pressing the mouse stage.addEventListener(MouseEvent.MOUSE_DOWN, toggleStroke); stage.addEventListener(MouseEvent.MOUSE_UP, toggleStroke); function toggleStroke(event:MouseEvent):void { stroke.thickness = (event.type == MouseEvent.MOUSE_DOWN) ? 1 : NaN; }
-
Hi,
all direct "stage" accesses are the problem:
globe.x = stage.stageWidth/2;
globe.y = stage.stageHeight/2;
stage.addEventListener(MouseEvent.MOUSE_DOWN, toggleStroke);
stage.addEventListener(MouseEvent.MOUSE_UP, toggleStroke);here is a modified code that should work: (not tested, have a look for all KRP comments)
Code
Display Moreif (stage == null) { // start as krpano plugin this.addEventListener(Event.ADDED_TO_STAGE, startplugin); } else { // direct start startplugin(); } function startplugin(evt:Event=null):void { this.removeEventListener(Event.ADDED_TO_STAGE, startplugin); globe.x = stage.stageWidth/2; globe.y = stage.stageHeight/2; addChild(globe); createSphere(globeRadius, globeParallels, globeMeridians, // in triangles, vertices3D); // out addEventListener(Event.ENTER_FRAME, draw); stage.addEventListener(MouseEvent.MOUSE_DOWN, toggleStroke); stage.addEventListener(MouseEvent.MOUSE_UP, toggleStroke); } // creates a sphere function createSphere(radius:Number, parallels:int, meridians:int, trianglePathOut:GraphicsTrianglePath, vertices3DOut:Vector.<Number>):void { if (parallels < 3) parallels = 3; if (meridians < 3) meridians = 3; meridians++; // texture edge meridian duplicated var parallelStops:int = parallels-1; // for determining u var meridianStops:int = meridians-1; // for determining v // local variables var r:Number; // radius var x:Number, y:Number, z:Number; // coordinates var p:int, pi:int, pa:Number; // parallel vars var m:int, mi:int, ma:Number; // meridian vars var u:Number, v:Number; // u, v of uvt var n:int = -1; // vertices index // horizontal for (p=0; p<parallels; p++){ v = p/parallelStops; pa = v*Math.PI - Math.PI/2; y = radius*Math.sin(pa); r = radius*Math.cos(pa); // vertical for (m=0; m<meridians; m++){ u = m/meridianStops; ma = u*Math.PI*2; x = r*Math.cos(ma); z = r*Math.sin(ma); // vertices vertices3DOut.push(x,y,z); n++; // trianglePathOut trianglePathOut.uvtData.push(u, v, 1); if (m != 0){ // not first meridian (texture edge) if (p != parallelStops){ // not last parallel (no next parallel to connect) trianglePathOut.indices.push(n, n+meridians, n+meridians-1); trianglePathOut.indices.push(n, n+meridians-1, n-1); } } } } } // creates a darker version of a bitmap function getDarkerBitmap(source:BitmapData, darkness:Number):BitmapData { // put source in a Bitmap display object // and darken it using a ColorTransform var darker:Bitmap = new Bitmap(source); darker.transform.colorTransform = new ColorTransform(darkness, darkness, darkness); // draw() does not take in account of // transformations on the object you draw // so place it in a container var container:Sprite = new Sprite(); container.addChild(darker); // create a new BitmapData drawing // the darker image in the container var bmp:BitmapData = new BitmapData(source.width, source.height, source.transparent, 0); bmp.draw(container); return bmp; } // create globe shape var globe:Shape = new Shape(); //globe.x = stage.stageWidth/2; // KRP //globe.y = stage.stageHeight/2; // KRP //addChild(globe); // KRP // globe variables var globeRadius:Number = 100; var globeParallels:int = 20; var globeMeridians:int = 20; var globeSpinSpeed:Number = 2; var frontFace:BitmapData = new Erfj(0,0); var backFace:BitmapData = getDarkerBitmap(frontFace, .25); var globeTransform:Matrix3D = new Matrix3D(); globeTransform.appendTranslation(0, 0, globeRadius*4); // push back in 3D space var globeProjection:PerspectiveProjection = new PerspectiveProjection(); var globePerspective:Matrix3D = globeProjection.toMatrix3D(); // a GraphicsTrianglePath for the path // data to be drawn in Flash var triangles:GraphicsTrianglePath = new GraphicsTrianglePath( new Vector.<Number>(), new Vector.<int>(), new Vector.<Number>(), TriangleCulling.NEGATIVE); // a new GraphicsTrianglePath container using the // same vector data as triangles is created to draw // the backside of the sphere once the darker version // of the bitmap is added to the drawing state var trianglesBack:GraphicsTrianglePath = new GraphicsTrianglePath( triangles.vertices, triangles.indices, triangles.uvtData, TriangleCulling.POSITIVE); // stroke for when mouse is pressed // start with a NaN width (no stroke) var stroke:GraphicsStroke = new GraphicsStroke(NaN, false, "normal", "none", "round", 3, new GraphicsSolidFill(0xeff10a)); // create a vector of Number objects to store // 3D locations of sphere coordinates var vertices3D:Vector.<Number> = new Vector.<Number>(); // to be non-destructive, changes to the sphere // coordinates are added to this vector var vertices3DTransformed:Vector.<Number> = new Vector.<Number>(); // populate triangles and vertices3D and with // sphere data; note that the triangles vector data // is being modified but this also affects trianglesBack // since it uses those same vectors //createSphere(globeRadius, globeParallels, globeMeridians, // in // KRP // triangles, vertices3D); // out // IGraphicsData list of drawing commands, drawing back face // first (dark), followed by front face (light) var globeData:Vector.<IGraphicsData> = Vector.<IGraphicsData>([ stroke, new GraphicsBitmapFill(backFace, null, false, true), trianglesBack, new GraphicsBitmapFill(frontFace, null, false, true), triangles ]); // rotate globe in frame loop //addEventListener(Event.ENTER_FRAME, draw); // KRP function draw(event:Event):void { // rotate the globe transform around the y axis // using prepend allows this to be applied // "before" the previous translation in z globeTransform.prependRotation(-globeSpinSpeed, Vector3D.Y_AXIS); // apply the transform to the globe vertices // to make the globe points actually rotated // (as well as pushed back in z) globeTransform.transformVectors(vertices3D, // in vertices3DTransformed); // out // convert the 3D points to 2D points and update // the T data in the UVT to coorectly account for // the translation of 2D to 3D for the bitmaps Utils3D.projectVectors(globePerspective, vertices3DTransformed, // in triangles.vertices, triangles.uvtData); // out // draw the triangles globe.graphics.clear(); globe.graphics.drawGraphicsData(globeData); } // show outlines when pressing the mouse //stage.addEventListener(MouseEvent.MOUSE_DOWN, toggleStroke); // KRP //stage.addEventListener(MouseEvent.MOUSE_UP, toggleStroke); // KRP function toggleStroke(event:MouseEvent):void { stroke.thickness = (event.type == MouseEvent.MOUSE_DOWN) ? 1 : NaN; }
-
Hi, Klaus
Thanks for your code, but
TypeError: Error #1009: Il est impossible d'accéder à la propriété ou à la méthode d'une référence d'objet nul.
at globe5_fla::MainTimeline/startplugin()
at globe5_fla::MainTimeline/frame1()not working in cs4 flash
-
-
Thanx Klaus
but not working in cs4
-
but not working in cs4
what do you mean - the code itself / as standalone doesn't work in CS4?
it can be only a small problem... -
Nothing appear in the swf in cs4 with your code
-
have you used the complete posted code as it is?
maybe add some traces to see if startplugin was called...
I have not much experiences with cs3/cs4 - are there ways to debug it?... -
No
my experience with cs4 is very poor
Participate now!
Don’t have an account yet? Register yourself now and be a part of our community!