我对stage方法的所有引用都在as3中抛出空引用错误

时间:2013-11-24 19:24:10

标签: actionscript-3 reference stage

我不确定导致这种情况的变化是什么,但突然间我在使用stage方法作为参数的所有情况下都得到了空对象引用。我的代码太长,无法适应所有不同的实例,因此我只需附加一个或两个。

package com.Mass.basics1
{

import flash.display.MovieClip;
import flash.display.Stage;
import flash.events.Event;


public class Main extends MovieClip
{


public var ourPlanet:Cosmo = new Cosmo(stage);
public var ourAsteroid:Asteroid = new Asteroid();
private var numStars:int = 80;
private var numAsteroids:int = 5;
public static var a:Number = 0;
private var stageRef:Stage;
//public var ourAsteroid:Asteroid = new Asteroid(stage);
//private var ourAsteroid:Asteroid = new Asteroid();


//our constructor function. This runs when an object of 
//the class is created
public function Main()
{

    //create an object of our ship from the Ship class

    stop();

    //add it to the display list
    stage.addChild(ourPlanet);

    ourPlanet.x = stage.stageWidth / 2;
    ourPlanet.y = stage.stageHeight / 2;
    this.stageRef = stageRef;

    for (var i:int = 0; i < numStars; i++)
    {
        stage.addChildAt(new Star(stage), stage.getChildIndex(ourPlanet));
    }


    for (var o:int = 0; o < numAsteroids; o++)
    {
        stage.addChildAt(new Asteroid(),    stage.getChildIndex(ourPlanet));
    }

我的调试器告诉我第13行有一个空对象引用,这段代码来自我的引擎。 Cosmo是另一个链接到符号的外部文件。我将从那里发布代码,但是在4个不同的.as文件中有大约4个这样的错误,但这里放的代码太多了,所以我只想添加另一个文件,我认为很重要。

来自Cosmo.as的代码

package com.Mass.basics1
{

import flash.display.MovieClip;
import flash.display.Stage;
import com.senocular.utils.KeyObject;
import flash.ui.Keyboard;
import flash.events.Event;
import flash.text.TextField;

public class Cosmo extends MovieClip
{


private var stageRef:Stage;
private var key:KeyObject;
private var speed:Number = 20;
private var vx:Number = 0;
private var vy:Number = 0;
private var friction:Number = 0.93;
private var maxspeed:Number = 8;
public var destroyed:Boolean = false;
public function Cosmo(stageRef:Stage)
{
    this.stageRef = stageRef;
    var key:KeyObject = new KeyObject(stage);

    addEventListener(Event.ENTER_FRAME, loop, false, 0, true);
}



public function loop(e:Event) : void
{
    //keypresses
    if (key.isDown(Keyboard.A))
        vx -= speed;
    else if (key.isDown(Keyboard.D))
        vx += speed;
    else
        vx *= friction;

    if (key.isDown(Keyboard.W))
        vy -= speed;
    else if (key.isDown(Keyboard.S))
        vy += speed;
    else
        vy *= friction;

    //update position   
    x += vx;
    y += vy;

    //speed adjustment
    if (vx > maxspeed)
        vx = maxspeed;
    else if (vx < -maxspeed)
        vx = -maxspeed;

    if (vy > maxspeed)
        vy = maxspeed;
    else if (vy < -maxspeed)
        vy = -maxspeed;

    //ship appearance
    rotation = vx;
    scaleX = (maxspeed - Math.abs(vx))/(maxspeed* 4) + 0.75;

    //stay inside screen
    if (x > stageRef.stageWidth) 
    {
        x = stageRef.stageWidth;
        vx = -vx;
    }
    else if (x < 0) 
    {
        x = 0;
        vx = -vx;
    }

    if (y > stageRef.stageHeight)
    {
        y = stageRef.stageHeight;
        vy = -vy;
    }
    else if (y < 0) 
    {
        y = 0;
        vy = -vy;
    }


}

} 

}

我在第26行也遇到了同样的错误。

来自其他文件的代码

package com.senocular.utils {

import flash.display.Stage;
import flash.events.KeyboardEvent;
import flash.ui.Keyboard;
import flash.utils.Proxy;
import flash.utils.flash_proxy;

/ **     * KeyObject类重新创建的功能     * ActionScript 1和2的Key.isDown     *     *用法:     * var key:KeyObject = new KeyObject(stage);     * if(key.isDown(key.LEFT)){...}     * /     动态公共类KeyObject扩展了代理{

private static var stage:Stage;
private static var keysDown:Object;

public function KeyObject(stage:Stage) {
    construct(stage);
}

public function construct(stage:Stage):void {
    KeyObject.stage = stage;
    keysDown = new Object();
    stage.addEventListener(KeyboardEvent.KEY_DOWN, keyPressed);
    stage.addEventListener(KeyboardEvent.KEY_UP, keyReleased);
}

flash_proxy override function getProperty(name:*):* {
    return (name in Keyboard) ? Keyboard[name] : -1;
}

public function isDown(keyCode:uint):Boolean {
    return Boolean(keyCode in keysDown);
}

public function deconstruct():void {
    stage.removeEventListener(KeyboardEvent.KEY_DOWN, keyPressed);
    stage.removeEventListener(KeyboardEvent.KEY_UP, keyReleased);
    keysDown = new Object();
    KeyObject.stage = null;
}

private function keyPressed(evt:KeyboardEvent):void {
    keysDown[evt.keyCode] = true;
}

private function keyReleased(evt:KeyboardEvent):void {
    delete keysDown[evt.keyCode];
}
}
}

在此文件中,我在第23和29行收到错误。提前感谢您,如果您需要更多信息,请与我们联系。

1 个答案:

答案 0 :(得分:0)

在添加到舞台的显示列表层次结构之前,stage属性将为null。在执行构造函数之后,才能将对象添加到舞台,因此您将无法访问构造函数中的舞台。它将是空的。

在创建实例并将其添加到舞台的显示列表层次结构后调用构造方法。