2017-02-19 87 views
3

Я хочу определить свои переменные в классе документа игры, а затем использовать некоторые из этих переменных в моем классе Movement. Однако, когда я использую эти переменные в своем классе движения, я получаю множество компиляционных ошибок, говорящих, что все они не определены.Почему я не могу получить доступ к общедоступным переменным из других классов?

Таким образом, мой вопрос: почему мои общедоступные переменные не переданы другому классу? Я импортировал класс, выполнив import game;, так что это оставляет меня в замешательстве. Я, вероятно, просто делаю это неправильно, но помощь очень ценится.

Класс Timeline

addChild((new Movement)); 

игры Документ

package 
{ 
    import flash.display.MovieClip; 
    import flash.utils.Timer; 
    import flash.events.TimerEvent; 

    public class game extends MovieClip 
    { 
     public var area1:Boolean = true; 
     public var area2:Boolean = false; 
     public var area3:Boolean = false; 

     public var player1:Boolean = true; 

     public var playerPosKeeper_mc:MovieClip = new mc_PlayerPosKeeper(); 

     public var up_dpad:MovieClip = new dpad_Up(); 
     public var down_dpad:MovieClip = new dpad_Down(); 
     public var left_dpad:MovieClip = new dpad_Left(); 
     public var right_dpad:MovieClip = new dpad_Right(); 
     public var menu_dpad:MovieClip = new dpad_Menu(); 
     public var run_dpad:MovieClip = new dpad_Menu(); 

     public var barrierRoof1_game:MovieClip = new game_BarrierRoof(); 
     public var barrierRoof2_game:MovieClip = new game_BarrierRoof(); 
     public var barrierSide1_game:MovieClip = new game_BarrierSide(); 
     public var barrierSide2_game:MovieClip = new game_BarrierSide(); 

     public function game() 
     { 
      trace("SUCCESS | Constructed Game Class"); 

     } 
    } 
} 

Движение Класс

package 
{ 
    import game; 
    import flash.display.Stage; 
    import flash.display.MovieClip; 
    import flash.events.Event; 
    import flash.events.TouchEvent; 
    import flash.net.dns.AAAARecord; 
    import flash.ui.Multitouch; 
    import flash.ui.MultitouchInputMode; 


    public class Movement extends MovieClip 
    { 
     var inMotion:Boolean = false; 

     public function Movement() 
     { 
      trace("SUCCESS | Constructed Movement Class"); 

      addChild(playerPosKeeper_mc); 
      playerPosKeeper_mc.x = 384; 
      playerPosKeeper_mc.y = 46; 

      addChild(up_dpad); 
      up_dpad.x = 55; 
      up_dpad.y = 336; 

      addChild(down_dpad); 
      down_dpad.x = 57; 
      down_dpad.y = 432; 

      addChild(left_dpad); 
      left_dpad.x = 19; 
      left_dpad.y = 372; 

      addChild(right_dpad); 
      right_dpad.x = 118; 
      right_dpad.y = 372; 

      addChild(menu_dpad); 
      menu_dpad.x = 61; 
      menu_dpad.y = 377; 

      addChild(run_dpad); 
      run_dpad.x = 684; 
      run_dpad.y = 369; 

      addChild(barrierRoof1_game); 
      barrierRoof1_game.x = 0; 
      barrierRoof1_game.y = 0; 

      addChild(barrierRoof2_game); 
      barrierRoof2_game.x = 0; 
      barrierRoof2_game.y = 470; 

      addChild(barrierSide1_game); 
      barrierSide1_game.x = 0; 
      barrierSide1_game.y = 0; 

      addChild(barrierSide2_game); 
      barrierSide2_game.x = 790; 
      barrierSide2_game.y = 0; 

      Multitouch.inputMode = MultitouchInputMode.TOUCH_POINT; 

      up_dpad.addEventListener(TouchEvent.TOUCH_BEGIN, moveUpTouchBEGIN); 
      up_dpad.addEventListener(TouchEvent.TOUCH_END, moveUpTouchEND); 

     } 
     public function moveUpTouchBEGIN(e:TouchEvent):void 
     { 
      trace("Touch Began") 
     } 

     public function moveUpTouchEND(e:TouchEvent):void 
     { 
      trace("Touch Ended") 
     } 
    } 

} 

ответ

3

Вы смущены потому что «общественность» не означает «глобальный». Объявление переменной как общедоступной означает, что вы хотите предоставить ей доступ к любому объекту, если сущность знает , где эта переменная.

Посмотрите, что у вас есть.

  • Топ-дисплей: этап.
  • Основные сроки: игра является ребенком стадии.
  • MovieClips up_dpad, down_dpad и т. Д. Все поля игрового экземпляра.
  • Движение: экземпляр - ребенок игры.

В Движении вы пытаетесь получить доступ к up_dpad и другим, но они хранятся как поля игрового экземпляра и не имеют ничего общего с экземпляром Movement. Вот почему они находятся вне контекста адресации Movement.

Итак, если вы хотите, чтобы эти переменные были объявлены игровыми полями, вам необходимо правильно их обработать из Движения.

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

public function Game() 
    { 
     trace("SUCCESS | Constructed Game Class"); 

     // Pass reference to this instance to the constructor. 
     var aMove:Movement = new Movement(this); 

     // Add it as a child. 
     addChild(aMove); 
    } 

В движении:

public function Movement(main:Game) 
    { 
     trace("SUCCESS | Constructed Movement Class"); 

     // Access variables inside Game instance via given reference. 
     addChild(main.playerPosKeeper_mc); 
     main.playerPosKeeper_mc.x = 384; 
     main.playerPosKeeper_mc.y = 46; 

     // ...and so on 
    } 

Данные основы Объектно-ориентированного программирования. Если вы хотите получить доступ к чему-либо внутри объекта, вам нужно сначала получить доступ к объекту.

+0

Благодарим за пошаговое описание. Очень признателен. – UnAlpha

+0

@ user2712413 Это напоминает мне 2001 год, когда я застрял в основном с одним и тем же. ПОЧЕМУ МОЙ КОД НА ВРЕМЕНИ НЕ МОЖЕТ ВИДЕТЬ ПЕРЕМЕННЫЙ, ОЗНАКОМЛЕННЫЙ НА ВРЕМЕНИ Б, ну, это был Flash 5 и странный ActionScript, который еще не был AS1. Это стало намного легче после того, как я, наконец, получил иерархию MovieClip и обратился прямо. – Organis