2012-05-30 2 views
0

그래서 내 문서 클래스에서이 아주 기본적인 코드가 "정의되지 않은 속성의 액세스는"몇 가지 오류

package 
{ 
    import flash.display.Sprite; 
    import flash.events.Event; 
    import flash.events.KeyboardEvent; 
    import flash.ui.*; 
    import flash.events.MouseEvent; 
    import flash.display.Stage; 
    import flash.display.MovieClip; 

    public class Main extends Sprite 
    { 
     //Properties 
     public var circle:Circle; 
     public var vx:Number; 
     public var vy:Number; 
     addEventListener(KeyboardEvent.KEY_DOWN, onKeyboardDown); 
     addEventListener(KeyboardEvent.KEY_UP, onKeyboardUp); 
     addEventListener(Event.ENTER_FRAME, onEnter); 
     public function addedToStageHandler(event:Event):void 
     { 

     } 
     public function Main() 
     { 
      super(); 
      init(); 
     } 
     public function init():void 
     { 
      vx = 0; 
      vy = 0; 

      circle = new Circle(35, 0x0066FF); 
      stage.addChild(circle); 
      circle.x = 50; 
      circle.y = 50;   


     } 
     public function onKeyboardDown(event:KeyboardEvent):void 
     { 
      switch(event.keyCode) 
      { 
       case Keyboard.LEFT: 
       vx = -5; 
       break; 
       case Keyboard.RIGHT: 
       vx = 5; 
       break; 
       case Keyboard.UP: 
       vy = -5; 
       break; 
       case Keyboard.DOWN: 
       vy = 5; 
       break; 
      } 
     } 
     public function onKeyboardUp(event:KeyboardEvent):void 
     { 
      switch(event.keyCode) 
      { 
       case Keyboard.LEFT: 
       vx = 0; 
       break; 
       case Keyboard.RIGHT: 
       vx = 0; 
       break; 
       case Keyboard.UP: 
       vy = 0; 
       break; 
       case Keyboard.DOWN: 
       vy = 0; 
       break; 
      } 
     } 
     public function onEnter(event:Event):void 
     { 
      circle.x += vx; 
      circle.y += vy; 
     } 
    } 
} 

문제는 내가 초보자에게 이해가되지 않는 것이 점점 오류를 유지하는 것이 있습니다 :

"정의되지 않은 메서드 addEventListener를 호출하십시오." x 3 "정의되지 않은 속성 onEnter에 대한 액세스." "OnKeyboardUp에서 정의되지 않은 속성에 액세스합니다." "정의되지 않은 속성 onKeyboardDown에 대한 액세스."

정말이 문제를 이해하지 못합니다. AS3은 addEventListener를 어떻게 인식하지 못합니까? 또한, 나는 그것을 가지고 있었기 때문에 내 이벤트 리스너가 스테이지 "stage.addEventListener"에 추가되었고 스테이지를 인식하지 못했습니다. 누군가이 문제로 올바른 방향으로 나를 밀어 붙일 수 있습니까? 감사!

+0

클래스가 스테이지에 추가 된 후 이벤트 리스너를 추가해야합니다. 클래스가 표시 목록에 추가되지 않으면 무대 이벤트에 액세스 할 수 없습니다. 이 경우 Main 클래스가 문서 클래스로 설정되어야합니다. this.addEventListener (EVENT.AddedToStage, addedToStage) 행을 따라 뭔가가 필요합니다. –

+0

좋아, 나는 그것을 얻는다. 그러나 "addToStage"매개 변수에 대해 작성해야하는 코드는 무엇입니까? –

답변

0

모두 코드가 거의 다 있습니다. 디스플레이 목록의 작동 방식을 조금 더 잘 이해하면됩니다.

package 
{ 
    import flash.display.Sprite; 
    import flash.events.Event; 
    import flash.events.KeyboardEvent; 
    import flash.ui.*; 
    import flash.events.MouseEvent; 
    import flash.display.Stage; 
    import flash.display.MovieClip; 

    public class Main extends Sprite 
    { 
     //Properties 
     public var circle:Circle; 
     public var vx:Number; 
     public var vy:Number; 

     // we can not do function calls like this in the class declaration area 
     // so we move these listeners to a function 
     // addEventListener(KeyboardEvent.KEY_DOWN, onKeyboardDown); 
     // addEventListener(KeyboardEvent.KEY_UP, onKeyboardUp); 
     // addEventListener(Event.ENTER_FRAME, onEnter); 

     public function Main() 
     { 
      super(); 
      this.init(); 
     } 
     public function init():void 
     { 
      // the "this" keyword means we are scoping it to this class instance 
      this.addEventListener(EVENT.ADDEDTOSTAGE, addedToStageHandler) 

      // using "this" is good practice and will help make your code more readable 
      this.vx = 0; 
      this.vy = 0; 

      this.circle = new Circle(35, 0x0066FF); 
      stage.addChild(circle); 
      this.circle.x = 50; 
      this.circle.y = 50;   


     } 
     public function addedToStageHandler(event:Event):void 
     { 
      // doing addEventListener(KeyboardEvent.KEY_DOWN, onKeyboardDown); 
      // will set the scope for this listener to this class 
      // you want to target the stage. And since we are waiting for ADDEDTOSTAGE 
      // to trigger we know we are on the stage. 
      // the only time we can access stage is if we are on the display list. 

      // clean up the listener since we do not need it anymore 
      this.removeEventListener(EVENT.ADDEDTOSTAGE, addedToStageHandler) 

      stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyboardDown); 
      stage.addEventListener(KeyboardEvent.KEY_UP, onKeyboardUp); 
      stage.addEventListener(Event.ENTER_FRAME, onEnter); 

     } 
     public function onKeyboardDown(event:KeyboardEvent):void 
     { 
      switch(event.keyCode) 
      { 
       case Keyboard.LEFT: 
        this.vx = -5; 
        break; 
       case Keyboard.RIGHT: 
        this.vx = 5; 
        break; 
       case Keyboard.UP: 
        this.vy = -5; 
        break; 
       case Keyboard.DOWN: 
        this.vy = 5; 
        break; 
      } 
     } 
     public function onKeyboardUp(event:KeyboardEvent):void 
     { 
      switch(event.keyCode) 
      { 
       case Keyboard.LEFT: 
        this.vx = 0; 
        break; 
       case Keyboard.RIGHT: 
        this.vx = 0; 
        break; 
       case Keyboard.UP: 
        this.vy = 0; 
        break; 
       case Keyboard.DOWN: 
        this.vy = 0; 
        break; 
      } 
     } 
     public function onEnter(event:Event):void 
     { 
      this.circle.x += this.vx; 
      this.circle.y += this.vy; 
     } 
    } 
} 
+0

감사합니다. 코드에 문제가 하나뿐입니다 (ADDEDTOSTAGE를 ADDED_TO_STAGE로 변경해야 함). 편집을 실행하면 26 행에서 super보다 먼저 식별자를 기다리는 중 오류가 발생합니다. –

+0

안녕하세요. 그래서 "this.super();"를 삭제했습니다. 내 코드에서 지금은 잘 작동; 수퍼는 정확히 무엇을합니까? 그것을 사용하지 않는 것은 나쁜 습관으로 간주됩니까? 컴파일러 오류가 발생하지 않고이를 사용하는 모든 해결 방법은 무엇입니까? 다시 한번 감사드립니다. –

+0

그래, super()가 아니 었어. this.super() 슈퍼 클래스가하는 것은 기본 클래스 인 IE의 생성자를 호출하는 것이다. 클래스를 설정하는 기본 클래스 생성자에 일부 코드가있는 경우 항상 super를 호출하는 것이 좋습니다. –

1

eventListeners를 'init '메소드 또는 Class 생성자 내에 배치해야하기 때문에 논리가 있습니다.

public function init():void 
{ 
    addEventListener(KeyboardEvent.KEY_DOWN, onKeyboardDown); 
    addEventListener(KeyboardEvent.KEY_UP, onKeyboardUp); 
    addEventListener(Event.ENTER_FRAME, onEnter); 

    vx = 0; 
    vy = 0; 

    circle = new Circle(35, 0x0066FF); 
    stage.addChild(circle); 
    circle.x = 50; 
    circle.y = 50;   
} 

그렇지 않은 경우 리스너가 클래스 범위 밖에 배치되므로 인식되지 않습니다.

행운을 빈다.

+0

내가 그랬을 때, 나는 더 많은 오류가있다! 시도해 줘서 고마워. :). –

+0

어떤 오류가 있습니까? 위 코드는 onKeyboardDown, onKeyboardUp 및 onEnter라는 함수가있는 한 괜찮습니다. –

+0

나는 코드에서 이전과 똑같은 코드와 함께이 함수를 사용하고 있으며 "정의되지 않은 속성 vx"또는 vy 또는 circle의 모든 인스턴스 인 20 개의 오류가 발생합니다. –