2017-02-19 12 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と宣言するということは、エンティティがを知っている場合、その変数がであることを前提に、どのエンティティにもアクセスを許可することを意味します。

あなたの所在地を確認してください。

  • トップ表示オブジェクト:ステージ。
  • メインタイムライン:ゲームはステージの子です。
  • MovieClips up_dpad、down_dpadなどはすべてゲームインスタンスのフィールドです。
  • ムーブメント:インスタンスはゲームの子です。

あなたはup_dpadなどにアクセスしようとしていますが、ゲームインスタンスのフィールドとして保持され、Movementインスタンスとは関係ありません。そういうわけで、彼らは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で可変的な宣言を見ることができません。やっとMovieClip階層を取得して直感的に取り上げると、かなり簡単になりました。 – Organis

関連する問題