【问题标题】:Actionscript 3 cannot access a property or method of a null object referenceActionscript 3 无法访问空对象引用的属性或方法
【发布时间】:2014-03-31 20:55:02
【问题描述】:

我对课程和东西还是很陌生。所以,我试着做这个,但我得到了一个错误:未定义属性的访问。 为什么 speedX 和 speedY var 尽管我已经在主类的 public var 中定义了它,但仍然出错?

谢谢!

已编辑:我尝试使用 main.speedX 和 main.speedY 从其他类调用变量 但出现错误:无法访问空对象引用的属性或方法。 在球/moveBall()

这是主要代码:

   package
   {
import flash.display.MovieClip;
import flash.events.Event;

public class Main extends MovieClip
{

    public var speedX:Number = 5;
    public var speedY:Number = 5;
    public var speedMax:Number = 10;
    private var ball:MovieClip = new Ball();
    private var paddle:MovieClip = new Paddle();

    public function Main()
    {
        paddle.addEventListener(Event.ENTER_FRAME, movePaddle);

        addChild(ball);
        addChild(paddle);
            }

}

}

这是 Ball 电影剪辑代码:

package
{
import flash.display.MovieClip;
import flash.events.Event;

public class Ball extends MovieClip
{   public var main:Main;

    public function Ball()
    {addEventListener(Event.ENTER_FRAME, moveBall);
        main= new Main();
    }
    public function moveBall(e:Event):void
    {
        x += main.speedX;
        y += main.speedY;
    }

}

}

【问题讨论】:

  • 传递值不起作用,因为您没有将值存储在球中。 aduch answer 有效,因为它传递了值,然后将它们存储在 Ball 中。澄清一下,公共变量不是全局变量。它们允许您从类外部访问类的值,但您仍然必须引用该类。因此,如果您将 main 的引用传递给 ball,您可以在 ball 中执行类似“_main.speedX”之类的操作,但在 ball 中单独使用“speedX”将无济于事。
  • 我已经编辑了代码。通过使用 main.speedX 引用 Main 类来使用其他类的 var。但后来我得到了一个错误。我想我错过了一些东西。任何想法?谢谢!
  • 您遇到什么错误? Actionscript 的一个很好的参考是 Colin Moock 的 Essential Actionscript 3.0。
  • 此错误:无法访问空对象引用的属性或方法。在 Ball/moveBall() 处。那是一本书吗?
  • 是的。 EA 3.0 是一本关于 AS 的开创性书籍,尽管旧版 AS3 仍然是 AS3。它可能会遗漏添加一些较新的 AS3 添加的细节,但这些更多与特定实现有关,例如 AIR

标签: actionscript-3


【解决方案1】:

那是因为您的 Ball 类无法在事件回调中访问 speedX 和 speedY。为什么不直接将speedXspeedY 添加到您的Ball 类中呢?

public class Ball extends MovieClip
{   
    public var speedX:Number;
    public var speedY:Number;

    public function Ball(sX:Number = 0, sY:Number = 0)
    {
        this.speedX = sX;
        this.speedY = sY;

        addEventListener(Event.ENTER_FRAME, moveBall);
    }

    public function moveBall(e:Event):void
    {
        x += speedX;
        y += speedY;
    }
}

【讨论】:

  • 感谢它的工作!我现在明白了一点。但是,是否需要在每个类中定义 var?我们可以在主类中为其他类定义它吗? (就像我以前做的那样)。谢谢
  • 嗯,这在很大程度上取决于您要实现的目标,如果您在其他课程中需要它,您可能会想到另一种解决问题的方法..
  • 所以我不能只在主类中编写 public var 用于其他类吗?我想我需要尝试很多事情。谢谢
  • 不,你确实不能......无论如何,速度是你的对象所固有的。但是你仍然可以将它包装在像 MovablesManager 这样的类中,并且这个类具有属性 speedX 和 speedY,并在对象集合(如球)上调用方法 move ,其属性 speedX 和 speedY 作为该方法 move 的参数。
  • 好吧,我想在需要它的类中定义它对我来说还是更好的。虽然我还没有真正理解所有的事情。谢谢。无论如何,你知道我可以学习的任何好的课程教程网站吗?
【解决方案2】:

这是另一种可能的解决方案,您可以将 main 传递给 ball 以使用 Main 中存储的速度值。

public class Main extends MovieClip
{
    public var speedX:Number = 5;
    private var ball:MovieClip;
    public function Main()
    {
        ball=new Ball(this);
        addChild(ball);
     }

}

public class Ball extends MovieClip
{   
      private var _main:Main;
      public function Ball(main:Main)
      {
          _main=main;
          addEventListener(Event.ENTER_FRAME, moveBall);
      }

      public function moveBall(e:Event):void
      {
          x += _main.speedX;
      }
  }
}

【讨论】:

  • 效果很好!非常感谢。但我仍然对一些事情感到困惑。首先定义“ball=new Ball;”有什么区别?在 var 和 main 函数中?二、“ball=newBall(this)”中的“(this)”有什么作用?我经常在教程中找到它,但我不明白它的用途和作用。你能解释一下吗?再次非常感谢
  • 通常最好在变量定义中只定义简单的值,就像你对速度所做的那样。更复杂的定义应该在类函数中完成。在这种情况下,作为 Main 的“this”在变量定义中尚不存在,因此无论如何都无法分配它。此外,在定义中定义变量会减慢您的代码速度。 “this”指的是封闭的东西。所以在这种情况下,这是对 Main 类创建的对象的引用,即它对自身的引用。
  • 好吧,我明白第一个。但是关于“(this)”,我可以得出的结论是:“(this)”用于表示球来自主类;为了让球类中的变量(speedX)访问球类中定义的变量。是这样吗?谢谢!我从你教的东西中学到了很多东西。
猜你喜欢
  • 2018-09-15
  • 2014-03-25
  • 2012-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-05
  • 2014-03-03
相关资源
最近更新 更多