2014-11-11 4 views
1

기본적으로이 클래스는 내 정적 클래스 (Door)가이 정적 변수 클래스 (Game State)를 식별 할 수없는 이유에 대한 질문입니다. # 1009 오류가 발생하여 GameState.gameState에 액세스 할 수 없다는 오류가 표시됩니다. 내 무대에서 나는 별도의 Symbol (GameState)처럼 호출 기호 (Door)와 같은 추가 기호를 포함하는 Symbol (CampaignLevel_001)을 사용하므로 본질적으로 다른 클래스와 이야기하는 중첩 된 기호/클래스를 얻는 데 문제가 있습니다.AS3 중첩 된 심볼 내부에서 정적 클래스에 액세스 할 때 문제가 발생했습니다.

package game.GameStates 
{ 
    import game.Assets.Player; 
    import game.Assets.Turret; 
    import game.Assets.Door; 
    import flash.events.Event; 
    import flash.display.MovieClip; 
    import flash.geom.Point; 
    import game.Levels.CampaignLevel_001; 

public class GameState extends MovieClip 
{ 
     //VARIABLES 
    public var enemyArray : Array; 
    public var Bullets : Array = new Array(); 
    public var Keys : Array = new Array(); 
    public var HeldKeys : Array = new Array(); 
    public var Door : Array = new Array(); 
    public var Terrain : Array = new Array(); 
    public var Turrets : Array = new Array(); 
    public var Blood : Array = new Array(); 
    public var Shields : Array = new Array(); 
    public var Levels : Array = new Array(); 

    public var NumKeys : int; 
    public var DoorLock : Boolean = false; 

    public var PlayerSpawnPoint : Point; 
    public var CampaignSpawnPoint : Point; 

    public static var gameState : GameState; 

    public var player : Player; 
    public var turret : Turret; 

    public var PlayerLives : int = 99; 

    public function GameState() 
    { // constructor code 

     gameState = this; 
     addEventListener(Event.ADDED_TO_STAGE, Awake); 

    } // constructor code 

    private function Awake (e : Event) : void 
    { 
     enemyArray = new Array(); 
     trace(enemyArray.length); 

    } 

    public function OpenDoor() : void 
    { 
     if (NumKeys <= 0) 
     { 
      DoorLock = true; 
     } 
     if (NumKeys > 0) 
     { 
      DoorLock = false; 
     } 
    } 

    public function NextLevel() : void 
    { 
     RemoveListeners(); 

     trace("SHOULD BE GOING TO THE NEXT LEVEL"); 

     while (Levels.length > 0) 
     { 
      for each (var level in Levels) 
      { 
       level.NextLevel(); 
      } 
     } 
    } 

    public function RespawnPlayer() : void 
    { 
     //Spawn Player at player start point 

     player = new Player(); 

     player.x = PlayerSpawnPoint.x; 
     player.y = PlayerSpawnPoint.y; 

     addChild(player); 

     trace("PLAYER ARRAY IS THIS LONG " + enemyArray.length); 
     trace("spawned Player!"); 
    } 

    public function setSpellIcons (spell : String , opacity : int) : void 
    { 
     if (spell == "dodge") 
     { 
      if (opacity == 0) 
      { 
       dodgeSymbol.alpha = 0; 
      } 

      if (opacity == 1) 
      { 
       dodgeSymbol.alpha = 1; 
      } 
     } 

     if (spell == "shield") 
     { 
      if (opacity == 0) 
      { 
       shieldSymbol.alpha = 0; 
      } 

      if (opacity == 1) 
      { 
       shieldSymbol.alpha = 1; 
      } 
     } 

    } //public function setSpellIcons (spell : String , opacity : int) : void 


    public function RemoveListeners() : void 
    { 

     while (enemyArray.length > 0) 
     { 
      for each (var enemy : MovieClip in enemyArray) 
      { 
       enemy.RemovePlayer(); 
      } 
     } 

     while (Door.length > 0) 
     { 
      for each (var door : MovieClip in Door) 
      { 
       door.RemoveDoorFunctions(); 
      } 
     } 

     while (Bullets.length > 0) 
     { 
      for each (var bullet : MovieClip in Bullets) 
      { 
       bullet.RemoveProjectile(); 
      } 
     } 

     while (Keys.length > 0) 
     { 
      for each (var key : MovieClip in Keys) 
      { 
       key.RemoveKey(); 
      } 
     } 

     while (Terrain.length > 0) 
     { 
      for each (var terrain : MovieClip in Terrain) 
      { 
       terrain.RemoveTerrainListeners(); 
      } 
     } 

     while (Turrets.length > 0) 
     { 
      for each (var turret in Turrets) 
      { 
       turret.RemoveTurretListeners(); 
      } 
     } 

     while (Blood.length > 0) 
     { 
      for each (var splatter in Blood) 
      { 
       splatter.RemoveBlood(); 
      } 
     } 

     while (Shields.length > 0) 
     { 
      for each (var shield in Shields) 
      { 
       shield.RemoveShield(); 
      } 
     } 

    } //public function RemoveListeners() : void 


    } 
} 

(문)

package game.Levels 
{ 
    import game.GameStates.GameState; 
    import flash.display.MovieClip; 
    import flash.events.Event; 


public class CampaignLevel_001 extends MovieClip 
{ 
    var currentLevel : int = currentFrame; 


    public function CampaignLevel_001() 
    { // constructor code 
     addEventListener(Event.ADDED_TO_STAGE, Awake); 
    } 

    private function Awake (e : Event) : void 
    { 
     GameState.gameState.Levels.push(this); 
     gotoAndStop(currentLevel); 
     trace ("CURRENT LEVEL IS " + currentLevel); 
    } 

    public function NextLevel() : void 
    { 
     var nextLevel : int = currentFrame + 1; 
     gotoAndStop(nextLevel); 
     trace ("NEXT LEVEL IS " + nextLevel); 
    } 
} 

}

및 호출 클래스 (문) 보유 클래스

package game.Assets 
{ 
    import flash.display.MovieClip; 
    import flash.events.Event; 
    import game.GameStates.GameState; 

public class Door extends MovieClip 
{ 

    public function Door() 
    { // constructor code 
     addEventListener(Event.ADDED_TO_STAGE, Awake); 
    } 

    private function Awake (e : Event) : void 
    { 
     GameState.gameState.Door.push(this); 
     GameState.gameState.OpenDoor(); 
     stage.addEventListener(Event.ENTER_FRAME, update); 
     open.alpha = 0; 
    } 

    private function update (e : Event) : void 
    { 
     if (GameState.gameState.DoorLock == true) 
     { 
      open.alpha = 1; 
     } 
     if (GameState.gameState.DoorLock == false) 
     { 
      open.alpha = 0; 
     } 
    } 

    public function RemoveDoorFunctions() : void 
    { 
     GameState.gameState.Door.splice(GameState.gameState.Door.indexOf(this),1); 
     stage.removeEventListener(Event.ENTER_FRAME, update); 
     parent.removeChild(this); 
    } 
} 

가}

+0

정적 var를 초기화하지 않았을 것입니다. # 1009는 참조가 null임을 의미합니다. – Vesper

+1

당신은 생성자 GameState "gameState = this"를 넣었지만 GameState.gameState를 참조 할 때는 생성자를 넘기지 않습니다 (정적 변수이기 때문에). 그래서 variabile NULL이고 변수의 속성을 참조하려고하면 dexcribed 오류 (1009) –

+0

무엇을 권하고 싶습니까? 나는 awake 함수에 gameState = this를 넣으려고했지만 여전히 작동하지 않습니다. 이것이 정적 변수로 작동하지 않습니까? 마음에 들지 않으면 어떻게 접근 할 수 있습니까? – KingWrex

답변

0

그것은 당신처럼 보이는 것입니다 싱글 톤을 만들기 위해 노력하고 있지만, 하. 인스턴스 함수를 추가하지 마라.

변경이 :

공공 정적 var에 gameState : GameState;

to :

private static var _gameState : GameState;

생성자를 제거하십시오. gamestate = this;

및 기능 추가 :

public static function get gameState():GameState { 
    if{_gameState == null) { 
    _gameState = new GameState(); 
    } 
    return _gameState; 
} 

그런 다음 호출 만에 의해 GameState의 인스턴스를 얻을 수 있습니다 :

GameState.gameState.DoorLock == true; 

및 GameState의 다른 기능을 같은 방법으로

+1

그게 효과가있는 것처럼 보입니다! 다른 클래스와 함수를 조정하여 기능적으로 만들면됩니다. 감사합니다 – KingWrex

+0

사실 난 아직도 gameState가) (생성자 공공 기능 플레이어() { 하여 addEventListener (이 Event.ADDED_TO_STAGE 년 ADDED_TO_STAGE 이벤트에 액세스 할 수 없습니다 스폰 플레이어 기능 RespawnPlayer을 사용하려고 할 때, 문제가 무엇입니까 , 깨우기); \t \t } \t \t 개인 기능 깨어 (예 : 이벤트) : 무효 { 추적 ("양산 플레이어!"); \t \t \t \t GameState.gameState.enemyArray.push (this); \t \t \t 스테이지.addEventListener (KeyboardEvent.KEY_DOWN, keyDown); stage.addEventListener (KeyboardEvent.KEY_UP, keyUp); stage.addEventListener (Event.ENTER_FRAME, update); \t } – KingWrex

+0

MovieClip을 사용하지 않도록 GameState 클래스를 변경해야합니다. 다른 주 레벨 클래스가 무언가 (addChild)에 물건을 놓는 것을 처리하도록하십시오. 즉, GameState에서 물건을 관리 할 수 ​​있지만 정적 var이므로 스테이지를 다른 곳에서 처리 할 수 ​​있습니다. – Gone3d