我在 Mobile Actionscript Flash Builder 项目中使用 Away3D 框架,并尝试在我的 bb 剧本上调试/运行。当我通过 Flash Builder(不是特定于 bb playbook)运行/调试时,一切都很好。一旦我尝试在我的实际设备上运行/调试,我就会收到以下错误:
TypeError:错误 #1009:无法访问空对象引用的属性或方法。
在 away3d.core.managers::Stage3DManager()[/Users/jesskeating/Documents/Adobe Flash Builder 4.6/3DMobile/src/away3d-core-fp11_4_0_9_gold(1)/src/away3d/core/managers/Stage3DManager.as:35 ]在 away3d.core.managers::Stage3DManager$/getInstance()[/Users/jesskeating/Documents/Adobe Flash Builder 4.6/3DMobile/src/away3d-core fp11_4_0_9_gold(1)/src/away3d/core/managers/Stage3DManager.as :45]
在 away3d.containers::View3D/onAddedToStage()[/Users/jesskeating/Documents/Adobe Flash Builder 4.6/3DMobile/src/away3d-core-fp11_4_0_9_gold(1)/src/away3d/containers/View3D.as:762]
在 Flash.display::DisplayObjectContainer/addChild() 在 Main/setupScene([/Users/jesskeating/Documents/Adobe Flash Builder 4.6/3DMobile/src/Main.as:85]
在 Main()[/Users/jesskeating/Documents/Adobe Flash Builder 4.6/3DMobile/src/Main.as:79]
我知道空对象引用意味着我需要声明/定义一个 var 但由于该应用程序与 flash builder 完美运行我不明白。
任何帮助将非常感激。我的代码如下...
package{
import away3d.containers.View3D;
import away3d.entities.Mesh;
import away3d.events.MouseEvent3D;
import away3d.lights.DirectionalLight;
import away3d.materials.ColorMaterial;
import away3d.materials.SkyBoxMaterial;
import away3d.materials.lightpickers.StaticLightPicker;
import away3d.primitives.CubeGeometry;
import away3d.primitives.SphereGeometry;
import away3d.textures.BitmapCubeTexture;
import away3d.textures.BitmapTexture;
import flash.desktop.NativeApplication;
import flash.display.SimpleButton;
import flash.display.Sprite;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import flash.events.*;
import flash.events.AccelerometerEvent;
import flash.geom.Vector3D;
import flash.sensors.Accelerometer;
import flash.text.*;
[SWF(width=1024, height=600, frameRate=60)]
public class Main extends Sprite{
    [Embed(source="dice.png")]
    private var Dice:Class;
    [Embed(source="alum-01.png")]
    private var Alum:Class;
    [Embed(source="bat-01.png")]
    private var Bat:Class;
    [Embed(source="brun-01.png")]
    private var Brun:Class;
    [Embed(source="julie-01.png")]
    private var Julie:Class;
    [Embed(source="slice-01.png")]
    private var Slice:Class;
    private var format:TextFormat;
    private var inst:TextField;
    private var myview:View3D = new View3D();;
    private var dice:Mesh;
    private var slice:Mesh;
    private var bat:Mesh;
    private var brun:Mesh;
    private var julie:Mesh;
    private var alum:Mesh;
    private var acc1:Accelerometer;
    private var acc2:Accelerometer;
    private var acc3:Accelerometer;
    private var knife:Mesh;
    public function Main(){
        super();
        // support autoOrients
        stage.align = StageAlign.TOP_LEFT;
        stage.scaleMode = StageScaleMode.NO_SCALE;
        format = new TextFormat();
        format.size = 26;
        format.color = 0xFFFFFF;
        inst = new TextField;
        inst.defaultTextFormat = format;
        inst.text = "Click on the cube you want to learn the cut of!"
        addChild(inst);
        inst.x = 250;
        inst.y = 300;
        inst.width = 500;
        setupScene();
    }
    private function setupScene():void{
        //adding the view for 3D
        //myview = new View3D();
        addChild(myview);
        var tdice:BitmapCubeTexture = new BitmapCubeTexture(new Dice().bitmapData,
            new Dice().bitmapData,
            new Dice().bitmapData,
            new Dice().bitmapData,
            new Dice().bitmapData,
            new Dice().bitmapData);
        var tslice:BitmapCubeTexture = new BitmapCubeTexture(new Slice().bitmapData,
            new Slice().bitmapData,
            new Slice().bitmapData,
            new Slice().bitmapData,
            new Slice().bitmapData,
            new Slice().bitmapData);
        var tbat:BitmapCubeTexture = new BitmapCubeTexture(new Bat().bitmapData,
            new Bat().bitmapData,
            new Bat().bitmapData,
            new Bat().bitmapData,
            new Bat().bitmapData,
            new Bat().bitmapData);
        var tbrun:BitmapCubeTexture = new BitmapCubeTexture(new Brun().bitmapData,
            new Brun().bitmapData,
            new Brun().bitmapData,
            new Brun().bitmapData,
            new Brun().bitmapData,
            new Brun().bitmapData);
        var tjulie:BitmapCubeTexture = new BitmapCubeTexture(new Julie().bitmapData,
            new Julie().bitmapData,
            new Julie().bitmapData,
            new Julie().bitmapData,
            new Julie().bitmapData,
            new Julie().bitmapData);
        var talum:BitmapCubeTexture = new BitmapCubeTexture(new Alum().bitmapData,
            new Alum().bitmapData,
            new Alum().bitmapData,
            new Alum().bitmapData,
            new Alum().bitmapData,
            new Alum().bitmapData);
        //making the shapes, adding cube to stage
        dice = new Mesh(new CubeGeometry(), new SkyBoxMaterial(tdice));
        myview.scene.addChild(dice);
        dice.x = -270;
        dice.y = 150;
        slice = new Mesh(new CubeGeometry(), new SkyBoxMaterial(tslice));
        myview.scene.addChild(slice);
        slice.x = 0;
        slice.y = 150;
        bat = new Mesh(new CubeGeometry(), new SkyBoxMaterial(tbat));
        myview.scene.addChild(bat);
        bat.x = 250;
        bat.y = 150;
        brun = new Mesh(new CubeGeometry(), new SkyBoxMaterial(tbrun));
        myview.scene.addChild(brun);
        brun.x = -270;
        brun.y = -150;
        julie = new Mesh(new CubeGeometry(), new SkyBoxMaterial(tjulie));
        myview.scene.addChild(julie);
        julie.x = 0;
        julie.y = -150;
        alum = new Mesh(new CubeGeometry(), new SkyBoxMaterial(talum));
        myview.scene.addChild(alum);
        alum.x = 270;
        alum.y = -150;
        //making the mouse work and click event on the cube
        dice.mouseEnabled = true;
        dice.addEventListener(MouseEvent3D.MOUSE_DOWN, function(event:MouseEvent3D):void{clickMe("Dice")});
        slice.mouseEnabled = true;
        slice.addEventListener(MouseEvent3D.MOUSE_DOWN, function(event:MouseEvent3D):void{clickMe("Slice")});
        julie.mouseEnabled = true;
        julie.addEventListener(MouseEvent3D.MOUSE_DOWN, function(event:MouseEvent3D):void{clickMe("Julienne")});
        bat.mouseEnabled = true;
        bat.addEventListener(MouseEvent3D.MOUSE_DOWN, function(event:MouseEvent3D):void{clickMe("Batonnet")});
        brun.mouseEnabled = true;
        brun.addEventListener(MouseEvent3D.MOUSE_DOWN, function(event:MouseEvent3D):void{clickMe("Brunoise")});
        alum.mouseEnabled = true;
        alum.addEventListener(MouseEvent3D.MOUSE_DOWN, function(event:MouseEvent3D):void{clickMe("Alumette")});
        knife = new Mesh(new CubeGeometry, new ColorMaterial(0xFF0000));
        //setting how you look at the view
        myview.camera.z = -500;
        myview.camera.lookAt(new Vector3D());
        //adding the enter frame event for spinning
        addEventListener(Event.ENTER_FRAME, loop);
    }
    private function loop(event:Event):void{
        //making the shapes rotate
        dice.rotationY++;
        slice.rotationY++;
        alum.rotationY++;
        julie.rotationY++;
        bat.rotationY++;
        brun.rotationY++;
        //rendering the view
        myview.render();
    }
    private function clickMe(cutPicked:String):void{
        switch(cutPicked){
            case "Dice":
                acc1.addEventListener(AccelerometerEvent.UPDATE, onAccUpdate);
                myview.scene.removeChild(dice);
                myview.scene.removeChild(slice);
                myview.scene.removeChild(alum);
                myview.scene.removeChild(julie);
                myview.scene.removeChild(bat);
                myview.scene.removeChild(brun);
                removeChild(inst);
                myview.scene.addChild(knife);
                //knife.rotateTo(10,10,0);
                break;
            case "Chiffonade":
                //acc3.addEventListener(AccelerometerEvent.UPDATE, onAccUpdate3);
                myview.scene.removeChild(dice);
                myview.scene.removeChild(slice);
                myview.scene.removeChild(alum);
                myview.scene.removeChild(julie);
                myview.scene.removeChild(bat);
                myview.scene.removeChild(brun);
                removeChild(inst);
                myview.scene.addChild(knife);
                knife.x = -75;
                break;
            case "Slice":
                //acc2.addEventListener(AccelerometerEvent.UPDATE, onAccUpdate2);
                myview.scene.removeChild(dice);
                myview.scene.removeChild(slice);
                myview.scene.removeChild(alum);
                myview.scene.removeChild(julie);
                myview.scene.removeChild(bat);
                myview.scene.removeChild(brun);
                removeChild(inst);
                myview.scene.addChild(knife);
                knife.x = -75;
                break;
            case "Alumette":
                //acc2.addEventListener(AccelerometerEvent.UPDATE, onAccUpdate2);
                myview.scene.removeChild(dice);
                myview.scene.removeChild(slice);
                myview.scene.removeChild(alum);
                myview.scene.removeChild(julie);
                myview.scene.removeChild(bat);
                myview.scene.removeChild(brun);
                removeChild(inst);
                myview.scene.addChild(knife);
                knife.x = -75;
                break;
            case "Batonnet":                    
                //acc2.addEventListener(AccelerometerEvent.UPDATE, onAccUpdate2);
                myview.scene.removeChild(dice);
                myview.scene.removeChild(slice);
                myview.scene.removeChild(alum);
                myview.scene.removeChild(julie);
                myview.scene.removeChild(bat);
                myview.scene.removeChild(brun);
                removeChild(inst);
                myview.scene.addChild(knife);
                knife.x = -75;
                break;
            case "Julienne":
                //acc2.addEventListener(AccelerometerEvent.UPDATE, onAccUpdate2);
                myview.scene.removeChild(dice);
                myview.scene.removeChild(slice);
                myview.scene.removeChild(alum);
                myview.scene.removeChild(julie);
                myview.scene.removeChild(bat);
                myview.scene.removeChild(brun);
                removeChild(inst);
                myview.scene.addChild(knife);
                knife.x = -75;
                break;
            case "Brunoise":
                //acc1.addEventListener(AccelerometerEvent.UPDATE, onAccUpdate);
                myview.scene.removeChild(dice);
                myview.scene.removeChild(slice);
                myview.scene.removeChild(alum);
                myview.scene.removeChild(julie);
                myview.scene.removeChild(bat);
                myview.scene.removeChild(brun);
                removeChild(inst);
                myview.scene.addChild(knife);
                knife.x = -75;
        }
        knife.mouseEnabled = true;
        knife.addEventListener(MouseEvent3D.MOUSE_DOWN, up);
    }
    private function up(event:MouseEvent3D):void{
        if (Accelerometer.isSupported){
            acc1 = new Accelerometer();
            acc2 = new Accelerometer();
            acc3 = new Accelerometer();
            acc1.addEventListener(AccelerometerEvent.UPDATE, onAccUpdate);
        }else{
            // Handle case when the accelerometer is not supported here
        }  
    }
    private function onAccUpdate(e:AccelerometerEvent):void{
        var threshold:Number = 2;
        if(e.accelerationY > threshold){
            knife.rotationX = 45;
            if(knife.rotationX == 45){
                knife.rotationX = -45;
            }
        }
        } 
    }   
}