【问题标题】:All my references to the stage method are throwing null reference errors in as3我对舞台方法的所有引用都在 as3 中引发空引用错误
【发布时间】:2013-11-24 19:24:10
【问题描述】:

我不确定是什么更改导致了这种情况,但突然间,在我使用 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 行遇到错误。提前致谢,如果您需要任何类型的更多信息,请告诉我。

【问题讨论】:

    标签: actionscript-3 reference stage


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多