2009-11-14 6 views
2

Когда я пытаюсь получить доступ к некоторым из частных свойств класса документа из другого класса, он выдает эту ошибку:Actionscript 3: Как получить доступ к свойствам класса документа?

1119: Access of possibly undefined property _player through a reference with static type flash.display:Stage. 

Вот код из класса документа:

package 
{ 
    import flash.display.MovieClip; 
    import flash.events.Event; 
    import flash.events.KeyboardEvent; 
    import flash.utils.Timer; 
    import flash.events.TimerEvent; 
    import flash.ui.Keyboard; 
    import collision; 
    import player; 
    import ground; 

    public class engine extends MovieClip 
    { 
     public var _player:player; 
     private var _ground:ground; 
     private var _collision:collision; 
     private var _right:Boolean; 
     private var _space:Boolean; 
     private var _left:Boolean; 
     private var _touchGround:Boolean; 
     private var _jump:Boolean; 
     private var _jumpVel:int; 
     private var _q:int; 
     private var _vx:int; 
     private var _vy:int; 

     public function engine() 
     { 
      _player = new player(); 
      _ground = new ground(); 
      _collision = new collision(); 
      addChild(_player); 
      addChild(_ground); 
      _player.x = stage.stageWidth/2 - _player.width/2; 
      _player.y = stage.stageHeight/2 - _player.height/2; 
      _ground.x = stage.stageWidth/2 - _ground.width/2; 
      _ground.y = stage.stageHeight/2 - _ground.height/2; 
      _ground.y += 150; 
      _ground.x += 300; 
      _q = 0; 
      stage.addEventListener(Event.ENTER_FRAME, enterFrame); 
      stage.addEventListener(KeyboardEvent.KEY_DOWN,keyDownHandler); 
      stage.addEventListener(KeyboardEvent.KEY_UP,keyUpHandler); 
     } 
     private function enterFrame(e:Event) 
     { 
      if(_right) 
      { 
       if(_vx > 15) 
       { 
        _vx = 15; 
       } 
       _vx += 2; 
      } 
      if(_left) 
      { 
       if(_vx < -15) 
       { 
        _vx = -15; 
       } 
       _vx -= 2; 
      } 
      if(_space && _touchGround) 
      { 
       _jump = true; 
      } 
      if(_jump) 
      { 
       _jumpVel = 20 - _q; 
       if(_q == 20) 
       { 
        _q = 0; 
        _jumpVel = 0; 
        _jump = false; 
       } 
       else 
       { 
        _ground.y += _jumpVel; 
        _q ++; 
       } 
      } 
      _collision.detectCollisions(); 
      _ground.x -= _vx; 
      _ground.y += _vy; 
      if(_vx > 0) 
      { 
       _vx--; 
       if(_vx < 0) 
       { 
        _vx = 0; 
       } 
      } 
      else if(_vx < 0) 
      { 
       _vx++; 
       if(_vx > 0) 
       { 
        _vx = 0; 
       } 
      } 
      if(_vy > 0) 
       { 
        _vy = 0; 
       } 
      else if(_vy < -10) 
       { 
        _vy = -10; 
       } 
       trace(_vy); 
     } 

     private function keyDownHandler(e:KeyboardEvent) 
     { 
      if(e.keyCode == Keyboard.RIGHT) 
      { 
       _right = true; 
      } 
      if(e.keyCode == Keyboard.LEFT) 
      { 
       _left = true; 
      } 
      if(e.keyCode == Keyboard.SPACE) 
      { 
       _space = true; 
      } 
     } 
     private function keyUpHandler(e:KeyboardEvent) 
     { 
      if(e.keyCode == Keyboard.RIGHT) 
      { 
       _right = false; 
      } 
      if(e.keyCode == Keyboard.LEFT) 
      { 
       _left = false; 
      } 
      if(e.keyCode == Keyboard.SPACE) 
      { 
       _space = false; 
      } 

     } 
    } 
} 

Вот код из класса «столкновения».

package 
{ 

    import flash.display.MovieClip; 
    import player; 
    import engine; 

    public class collision extends MovieClip 
    { 

    private var _playerCol:player = engine._player; 


     public function collision() 
     { 
     } 
     public function detectCollisions():void 
     { 
      _playerCol.y += 7; 
     } 
    } 
} 

Я пытаюсь получить доступ к свойству '_player' из класса столкновений, но получаю сообщение об ошибке.

+1

uhh ... отсюда слово частное? –

+0

Есть ли здесь вопрос? –

+0

Да. Может быть, я не говорил об этом достаточно хорошо. Поэтому я пытаюсь получить доступ к этому определенному свойству класса документов из другого класса. Когда я пытаюсь получить к нему доступ с помощью «root.property», я получаю сообщение об ошибке. Это происходит даже тогда, когда я изменяю свойство публично. – Miles

ответ

3

На данный момент вы пытаетесь получить доступ к _player, как если бы он был статическим членом класса Engine. Вы можете сделать _player статическим, но это может привести к запаху кода. Безопасный способ будет передать ссылку в конструктор:

private var _engine:Engine 
private var _playerCol:player; 
public function collision(engine:Engine){   

    _engine = engine; 
    _playerCol = _engine._player 
}   

и поэтому в своем классе Doc вы бы эта линия

_collision = new collision(this); 

PS. Поскольку классы подсказок действительно должны иметь капитал в начале, и если переменная будет публичной, удалите подчеркивание, в противном случае оставить переменную как закрытой и создать для нее общедоступные свойства. Кроме того, вы можете подумать об изменении своей структуры, поскольку она несколько неуклюжая. Я рекомендую взглянуть на системы сущностей компонентов.

+0

Эй, это сработало как шарм. Благодаря тонну. – Miles

+0

@AdityaGameProgrammer Не стоит беспокоиться :) Немного отредактировал – Allan

2

Root._player не существует. Попробуйте получить доступ к нему через класс двигателя.

Таким образом, если объект двигатель существует в корне и называется _engine, вы можете получить доступ к _player вроде следующего:

var plyr:player = _engine._player; 

EDIT: Класс столкновения «не знает» о классе двигателя; они оба существуют отдельно друг от друга, поэтому нет способа заставить их общаться друг с другом, не делая что-то другое. Один из способов, упомянутый в комментариях, состоит в том, чтобы сделать свойство _player статическим в движке. Таким образом,

public static var _player:player; 

Другим способом было бы сделать класс двигателя одиночным (как указано в другом ответе).

Другим способом было бы передать экземпляр класса двигателя классу столкновений; таким образом класс столкновения способен «видеть» переменные экземпляра (свойства), доступные в движке. Чтобы сделать это, вы могли бы сделать что-то вроде:

// do this inside the engine constructor 
_collision = new collision(); 
_collision._engine = this; 

(Collision должен иметь вар называется _engine:. Двигатель, чтобы сделать это, конечно)

Вы можете сделать шаг назад от вашего дизайна и подумайте о том, как каждая часть должна взаимодействовать друг с другом. Возможно, есть другой способ сделать вещи, которые сделают каждый объект более способным общаться друг с другом (или, разделив проблемы, возьмут на себя ответственность за то, что каждый класс должен делать без, непосредственно взаимодействующих с другими классами).

+0

Спасибо за ответ. На самом деле, движок - это название класса документа, я должен был это уточнить. Я пытаюсь получить доступ к свойству _player внутри движка из «столкновения». В любом случае, я попробовал то, что вы сказали, создав свойство в классе столкновений, которое ссылается на свойство _player в engine, но я все еще получаю ошибку. Я обновлю код в вопросе, чтобы вы могли видеть, что я сделал. Еще раз спасибо за ответ. – Miles

+0

сделать _player статическим. public static var _player: Player; Тогда вы сможете использовать его. – bhups

2

Если вы хотите пойти немного дальше с slighly более продвинутый подход, вы также можете реализовать свой класс двигателя как singleton (есть хороший пример флэш here).

Создание вашего двигателя singleton означает, что вы убедитесь, что в вашей памяти будет только один экземпляр класса двигателя, и будет только экземпляр, пока вам не понадобится часть вашего приложения. Вы можете получить доступ ко всем свойствам Singleton в статичной усадьбе.

Доступ к собственности игрока затем спуститься:

private var _playerCol:player = Engine.instance._player; 

Преимущество заключается в том, что теперь вы можете получить доступ ко всем общественные функции и переменные вашего класса Engine легко.

Одноэлементный шаблон используется для выделения библиотек и приложений Flash, поэтому может быть полезно изучить их немного.

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