TypeError:错误#1009:无法访问空对象引用的属性或方法

时间:2013-01-15 15:11:29

标签: actionscript-3 flash typeerror

自昨天深夜以来,我一直试图解决上述错误。 今天我再试了好几个小时。我学到了很多,并且了解了很多。我发现了一些事情并修复了它们,不幸的是错误仍然存​​在。

我现在知道了 上述错误表明我的代码所针对的其中一个对象超出了范围。 可能由以下原因引起:

  1. 声明但未实例化

  2. 它没有实例名称(或实例名称拼写错误)

  3. 该代码试图与之对话的框架中不存在

  4. 它已设置为动画,但未在每个关键帧中为其分配实例名称

  5. 它是相同对象的两个或多个连续关键帧之一,在前一帧中没有指定名称(或不同的名称)。

  6. 这是出错的错误行:

    if (back.collisions.hitTestPoint(player.x + leftBumpPoint.x,player.y + leftBumpPoint.y,true))
    

    所以它必须是背部或内部的东西......

    1. 我查了一下,这不是一个拼写错误的实例 BTW back是一个带有Back实例的背景动画片段,它包含碰撞图像和实例碰撞

    2. 正在宣布(但可能不对)

    3. 可能是原因。第1帧是预加载器。第2帧是带有按钮的菜单,用于启动代码cat.as.第3帧包含游戏

    4. 它只存在于一个关键帧上,因此它不是错误编号4

    5. 它只存在于一个关键帧上,所以它不是错误编号5

    6. 所以最有可能是3号。

      我认为发生的是我点击按钮,它立即想要在进入第3帧之前运行cat.as。我应该如何解决这个问题。我正在考虑将游戏放在第2帧但在屏幕外。 我非常想要对此提出反馈意见。谢谢

      我的代码:编辑:我提供了var public

      package 
      {
      import flash.display.MovieClip;
      import flash.events.*;
      import flash.events.KeyboardEvent;
      import flash.ui.Keyboard;
      import flash.geom.Point;
      
      public class Cat extends MovieClip
      {
      
          public var leftPressedfBoolean = false;
          public var rightPressed:Boolean = false;
          public var upPressed:Boolean = false;
          public var downPressed:Boolean = false;
      
          public var leftBumping:Boolean = false;
          public var rightBumping:Boolean = false;
          public var upBumping:Boolean = false;
          public var downBumping:Boolean = false;
      
          public var leftBumpPoint:Point = new Point(-30,-55);
          public var rightBumpPoint:Point = new Point(30,-55);
          public var upBumpPoint:Point = new Point(0,-120);
          public var downBumpPoint:Point = new Point(0,0);
      
          public var scrollX:Number = 0;
          public var scrollY:Number = 500;
      
          public var xSpeed:Number = 0;
          public var ySpeed:Number = 0;
      
          public var speedConstant:Number = 4;
          public var frictionConstant:Number = 0.9;
          public var gravityConstant:Number = 1.8;
          public var jumpConstant:Number = -35;
          public var maxSpeedConstant:Number = 18;
      
          public var doubleJumpReady:Boolean = false;
          public var upReleasedInAir:Boolean = false;
      
          public var keyCollected:Boolean = false;
          public var doorOpen:Boolean = false;
      
          public var currentLevel:int = 1;
      
          public var animationState:String = "idle";
      
          public var bulletList:Array = new Array();
          public var enemyList:Array = new Array();
          public var bumperList:Array = new Array();
      
          public var player:Player;
          public var back:Back;
          public var sky:Sky;
          public var collisions:Collisions;
          public var visuals:Visuals;
          public var other:Other;
          public var doorKey:DoorKey;
      
          public function Cat()
          {
              addEventListener(Event.ADDED_TO_STAGE, init);
          }
      
          public function init(e:Event):void
      
      {
              player = new Player();
              back = new Back();
              sky = new Sky();
              visuals = new Visuals();
              other = new Other();            
              collisions = new Collisions();
              doorKey = new DoorKey();
      
              stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler);
              stage.addEventListener(KeyboardEvent.KEY_UP, keyUpHandler);
              stage.addEventListener(Event.ENTER_FRAME, loop);
              addEnemiesToLevel1();
              addBumpersToLevel1();
          }
      
          public function addEnemiesToLevel1():void
          {
              addEnemy(620, -115);
              addEnemy(900, -490);
              addEnemy(2005, -115);
              addEnemy(1225, -875);
          }
      
          public function addBumpersToLevel1():void
          {
              addBumper(500, -115);
              addBumper(740, -115);
          }
      
      
          public function loop(e:Event):void
          {
              if (back.collisions.hitTestPoint(player.x + leftBumpPoint.x,player.y + leftBumpPoint.y,true))
              {
                  //trace("leftBumping");
                  leftBumping = true;
              }
              else
              {
                  leftBumping = false;
              }
      

4 个答案:

答案 0 :(得分:1)

在if语句之前添加此项以查看缺少哪个项目:

trace("back "+back);
trace("back.collisions "+back.collisions);
trace("player.x "+player.x);
trace("leftBumpPoint.x "+leftBumpPoint.x);
trace("player.y "+player.y);
trace("leftBumpPoint.y "+leftBumpPoint.y);

答案 1 :(得分:0)

问题在于,在检查是否有x值之前,你永远不会将玩家添加到舞台上。

答案 2 :(得分:0)

您可以单独声明后退和碰撞,但是您正在使用碰撞作为后退属性来访问它们。背部是否有碰撞属性?如果是这样,它是如何初始化的?

答案 3 :(得分:0)

根据你的陈述

  

back是带有Back实例的背景动画片段

我可以假设您将“Back”设置为movieClip“back”的实例名称

将“后退”改为“后退”应该这样做