2017-02-19 13 views
3

내 게임 문서 클래스에서 내 변수를 정의한 다음 Movement 클래스에서 이러한 변수 중 일부를 사용하고 싶습니다. 그러나 운동 클래스에서 이러한 변수를 사용할 때 컴파일 오류가 많아서 정의되지 않았다고 말합니다.다른 클래스의 공용 변수에 액세스 할 수없는 이유는 무엇입니까?

제 질문은 제 공개 변수가 다른 클래스로 전달되지 않는 이유는 무엇입니까? import game;을 수행하여 클래스를 가져 왔으므로이 사실이 저를 혼란에 빠뜨립니다. 나는 아마 잘못하고있을 뿐이지 만 도움을 많이받습니다.

타임 라인

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

당신은 혼란 "public"이 "global"을 의미하지 않기 때문입니다. 변수를 public으로 선언하면 엔티티가 이고 그 변수가 인 경우 특정 엔티티에 변수에 대한 액세스 권한을 부여하려는 것입니다.

당신이 가지고있는 것을 보시라.

  • 상위 표시 개체 : 스테이지.
  • 주요 타임 라인 : 게임은 무대의 하위 게임입니다.
  • 무비 클립 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 년을 연상케합니다. 타임 라인상의 내 코드가 타임 라인 B에서 가변적 인 선언을 볼 수없는 이유는 무엇입니까? Flash 5와 이상한 ActionScript는 아직 AS1이 아니 었습니다. 필자는 마침내 MovieClip 계층 구조를 얻고 직설적 인 작업을 수행 한 후 작업이 훨씬 쉬워졌습니다. – Organis