2012-05-30 3 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

Ваши слушатели событий должны быть добавлены ПОСЛЕ того, как класс был добавлен на сцену. У вас нет доступа к событиям сцены, если класс не добавлен в список отображения. В этом случае основной класс должен быть задан как класс документа. Вам нужно что-то в строках this.addEventListener (EVENT.AddedToStage, addedToStage). –

+0

Хорошо, я вроде как понял. Но какой код мне следует написать для параметра «addedToStage»? –

ответ

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. Любая идея, что с этим делать? –

+0

Привет, поэтому я удалил "this.super();" из моего кода, и теперь он отлично работает; что именно делает супер? Считается ли это плохой практикой, чтобы не использовать его? Любое обходное решение для его использования без получения ошибки компилятора? Еще раз спасибо. –

+0

Да, это должно было быть просто super() not this.super(), что супер делает, вызывает конструктор базового класса IE: класс, который вы расширяете. Это хорошая практика, чтобы всегда называть супер только в том случае, если в конструкторе базового класса есть определенный код, который устанавливает класс. –

1

Это логично, потому что вам нужно будет разместить eventListeners внутри метода'init 'или конструктора класса.

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

У меня есть эта функция в коде вместе с тем же самым точным кодом, что и раньше, и я получаю 20 ошибок, которые являются всеми экземплярами «Доступ к неопределенному свойству vx» или vy или circle. –

Смежные вопросы