2013-01-15 111 views
0

我一直試圖解決上述錯誤,因爲昨天晚上到深夜。 今天我又試了好幾個小時。我學到了很多,並瞭解更多。我發現了一些事情並修復了它們,不幸的是錯誤依然存在。TypeError:錯誤#1009:無法訪問空對象引用的屬性或方法

我現在知道例如 上述錯誤表明我的代碼所針對的一個對象超出了範圍。 通過可能引發的:

  1. 它正在宣告但尚未實例化

  2. 它不會有一個實例名稱(或實例名稱拼寫錯誤)

  3. 它不會在存在該代碼試圖與之通話的幀

  4. 它被動畫到位,但未在每個關鍵幀中爲其分配實例名稱

  5. 它是相同對象的兩個或多個連續關鍵幀之一,在前面的幀中沒有指定名稱(或不同的名稱)。

這是錯誤線通向哪裏錯了:

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

所以它必須是一些與背部或collosions ...

  1. 我檢查過,它不是拼寫錯誤的實例 BTW返回與返回實例的背景動畫片段,它包含例如碰撞

  2. 它被宣佈(但可能不是右)

  3. 碰撞圖像可能是原因。第1幀是預加載器。第2幀是帶有按鈕的菜單,以啓動代碼cat.as.第3幀包含遊戲

  4. 只在一個關鍵幀存在,故不誤數4

  5. 它只存在於一個關鍵幀,所以它不是錯號5

所以它很可能是數字3.

我認爲會發生的事情是,我點擊按鈕,它立即想運行cat.as之前去幀3.我應該如何解決這個問題。我正在考慮將遊戲置於第2幀但離屏。 我非常希望得到這方面的反饋。由於

我的代碼:編輯:我給了var公共

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; 
     } 
+0

我修改了我的答案。您必須先將玩家添加到舞臺,然後才能獲得x val。 –

回答

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); 
+0

回[對象返回] back.collisions空 player.x 0 leftBumpPoint.x -30 player.y 0 leftBumpPoint。 y -55 – Jacques

+0

so back.collisions = null hmmm – Jacques

+0

您已經創建了一個名爲collisions的變量,所以您應該可以直接訪問它。例如collisions.hitTestPoint,而不是back.collisions.hitTestPoint – crooksy88

0

的問題是,你的檢查,看看它的x值是以前從未加入玩家的舞臺。

+0

感謝將改變代碼和測試 – Jacques

+0

仍然得到相同的錯誤,但謝謝我忽略了 – Jacques

+0

你的addEnemy()和addBumber()方法在哪裏?你的擴展影片剪輯 –

0

你回聲明和碰撞分開,但你與碰撞是背部的屬性訪問它們。返回是否有碰撞屬性?如果是這樣,它是如何初始化的?

+0

你的意思是我應該將它們聲明在一起嗎? – Jacques

+0

它會是什麼樣子:返回碰撞屬性 – Jacques

+0

不,我不認爲它具有碰撞屬性hmmm。 – Jacques

0

按你的說法

back is a background movieclip with Back instance

我可以假設你爲一個MovieClip「後退」「後退」作爲實例名稱

更改「回」到「返回」應該這樣做

+0

?我想你被誤解了,因爲我不清楚這一點。 movieclip被稱爲「Background」,因爲鏈接/實例名稱是Back。它是公共變量:返回; – Jacques

+0

只是爲了保存我現在稱爲movieclip Back也。但它仍然會給出錯誤 – Jacques

相關問題