2011-09-19 3 views
0

의 속성이나 메서드에 액세스 할 수 없습니다 내 전체 디버깅 오류 :AS3 : 널 객체 참조 여기에

Car initiated: [object MovieClip] 
Wheel initiated: [object MovieClip] 
TypeError: Error #1009: Cannot access a property or method of a null object reference. 
    at com.George.MegaAmazingApp.Components::Wheel/clickHandler()[C:\Documents and Settings\reithg\My Documents\Classes\com\George\MegaAmazingApp\Components\Wheel.as:24] 
[UnloadSWF] GeorgesMegaAmazingApp.swf 
Test Movie terminated. 

Car.as :

package com.George.MegaAmazingApp.Components 
{ 

    import flash.display.MovieClip; 

    public class Car extends MovieClip 
    { 
     public var carObj:MovieClip; 

     public function Car(carObj:MovieClip) 
     { 
      trace("Car initiated: " + carObj) 
      this.carObj = carObj; 
     } 

     public function Accelerate(speed:Number) 
     { 
      carObj.y -= speed; 
     } 

    } 

} 

Wheel.as

package com.George.MegaAmazingApp.Components 
{ 
    import flash.display.Stage; 
    import flash.events.MouseEvent; 
    import flash.events.Event; 
    import flash.display.MovieClip; 

    public class Wheel extends Car 
    { 
     public var rotated:Number; 
     public var wheelObj:MovieClip; 

     public function Wheel(wheelObj:MovieClip, carObj:MovieClip) 
     { 
      super(carObj); 
      this.carObj = carObj; 
      this.wheelObj = wheelObj; 
      trace("Wheel initiated: " + wheelObj); 
      wheelObj.addEventListener(MouseEvent.CLICK, clickHandler); 
     } 
     private function clickHandler(event:MouseEvent):void 
     { 
      stage.addEventListener(Event.ENTER_FRAME, super.Accelerate(2)); 
     } 

    } 

} 

및 시작하는 SWF 그것 :

import com.George.MegaAmazingApp.Components.*; 

var wheelObj:Wheel = new Wheel(this.wheel,this.car); 

누구나 무슨 일인가?

+0

Wheel extends Car? 나는 내 머리 속에서 운전하는 이상한 것들을 안다. 어쨌든, 그것은 'null'인 carObj입니다. 그러나 당신이 제공 한 코드에서 아무 것도 인스턴스화 된 것을 볼 수는 없습니다 ... – RIAstar

+0

휠은 실제로 스티어링 휠이며 자동차의 리모컨으로 작동합니다. carObj는'this.car' 여야합니다. (저는 OOP에 익숙하지 않아서 제가 모르는 뭔가를 놓쳤을 가능성이 있습니다. 새로운 몇 시간 만에 새로운 것입니다.) –

+0

그렇습니다. 그러나'this.car'가 어디에서 인스턴스화 되었습니까? 분명히 'null'이기 때문입니다. – RIAstar

답변

0

편집은 : 객체 (또는 부모 중 하나)가 스테이지에 추가 될 때까지 stage 속성은, null로 설정됩니다. 따라서 wheelObj의 스테이지를 사용하거나 먼저 휠을 스테이지에 추가하십시오. Wheel 인스턴스 자체를 표시하지 않으려면 MovieClip을 확장 할 필요가 없습니다. 당신이 인수로 함수를하지 않는 제공해야

private function clickHandler(event:MouseEvent):void 
{ 
    event.currentTarget.addEventListener(Event.ENTER_FRAME, Accelerate); 
} 

참고 :

private function clickHandler(event:MouseEvent):void 
{ 
    // event.currentTarget is the wheelObject here 
    event.currentTarget.stage.addEventListener(Event.ENTER_FRAME, Accelerate); 
} 

어쨌든 당신은 그 자체로 일하는 것이 스티어링 휠에 추가, 무대에 리스너를 추가 할 필요가 없습니다 함수 호출. 따라서 accelerate 기능을 변경해야합니다.

private var speed:int = 2; 

public function accelerate(e:Event) // best practice:use camelCase function names 
{ 
    carObj.y -= speed; 
} 
+0

@George 'Car'에도 이벤트 클래스를 가져와야합니다. 'import flash.events.Event; ' – Kapep

0

시험 무대가있는 경우 (추적 (단계)), (당신의 무비 클립이 DisplayList가 있으며 단계가있는 경우 무비 클립(). 단계는 유효해야합니다). 또한 super.Accelerate (2) 호출이 잘못되었습니다. 차를 연장하면 Accelerate (2)를 호출 할 수 있습니다.

MovieClip이 다시 표시되면 스테이지에 액세스하지 않고도 ENTER_FRAME을들을 수 있습니다. this.addEventListener (Event.ENTER_FRAME, handleEnterFrame)입니다.

0

또한 클릭에 대한 응답으로 ENTER_FRAME 이벤트 수신기를 추가하지 않습니다.

그러나 당신이 경우에, 여러 리스너를 추가하지 않도록합니다

private function clickHandler(event:MouseEvent):void 
{ 
    if(!hasEventListener(Event.ENTER_FRAME)) 
    { 
     addEventListener(Event.ENTER_FRAME, Accelerate); 
    } 
} 

그리고 (!) 참고로

의 가속 기능은 지금 아무것도 accelrating되지 않습니다. 그것은 일정한 속도로 자동차를 움직입니다. 액션은 Run()과 비슷합니다. 하지만 그건 당신의 실제 질문과 아무 관계가 없기 때문에 ... sidenote

+0

나는 깨닫고 그것에 확장 할 것이다 : P. –