2014-06-19 3 views
0

У меня проблема с моими кнопками, которые работают только один раз. Кнопка запускает пользовательское событие. Пользовательское событие срабатывает, и слушатель на моем DocumentClass выбирает его в первый раз, но не отвечает в любое время после этого.Кнопки работают только один раз

реплицировать Click Here, затем нажмите кнопку «Начать игру», а затем кнопку меню в правом верхнем углу нажмите кнопку главного меню, а затем нажмите кнопку «Начать игру», а затем кнопку меню в правом верхнем углу, обратите внимание на то, вы не можете снова нажать главное меню , Это моя проблема. Он должен продолжать работать.

DocumentClass добавляет дочерний openScreen. openScreen запускает событие для DocumentClass для добавления дочернего playScreen и удаления openScreen. playcreen добавляет дочернее меню экрана при нажатии кнопки меню на экране воспроизведения. ** Когда нажата кнопка главного меню, она вызывает событие, которое прослушивается DocumentClass. Функция, которая запускается, удаляет экран playScreen и добавляет открытый экран. Эта серия событий работает только один раз, прежде чем подвешивать, когда ** шаг.

класса Document

public class DocumentClass extends MovieClip 
{ 
    public var playScreen:PlayScreen = new PlayScreen(); 
    public var openScreen:OpenScreen = new OpenScreen(); 
    public var started:Boolean = false;  

    public function DocumentClass() 
    { 
     openScreen.addEventListener(GameEvent.STAR, OnPlayClick); 
     playScreen.addEventListener(GameEvent.NG, NewGame); 
     playScreen.menuScreen.addEventListener(GameEvent.NG, NewGame, true, 0, true); 
     playScreen.menuScreen.addEventListener(GameEvent.MM, onMain); 
     addChild(openScreen) 


    } 

    public function OnPlayClick(gameEvent:GameEvent):void{ 
     trace("start") 

     addChildAt(playScreen,0) 
     var tweenX:Tween = new Tween(openScreen, "x", None.easeIn, 0, -480, .5, true); 
     tweenX.addEventListener(TweenEvent.MOTION_FINISH, onTweenDone); 


    } 
    public function NewGame(gameEvent:GameEvent):void{ 
     removeChild(playScreen) 
     playScreen = new PlayScreen(); 
     addChild(playScreen) 
     playScreen.begin() 
    } 
    public function onMain(gameEvent:GameEvent):void{ 
     playScreen.removeChild(playScreen.menuScreen) 
     this.removeChild(playScreen) 
     //openScreen = new OpenScreen(); 
     openScreen.x = 0 
     addChild(openScreen) 
     playScreen = new PlayScreen(); 

MenuScreen общественного класса MenuScreen расширяет MovieClip {

public function MenuScreen() 
    { 
     backButton.buttonMode = true 
     backButton.addEventListener(MouseEvent.CLICK, OnBackClick); 

     exitButton.buttonMode = true 
     exitButton.addEventListener(MouseEvent.CLICK, OnExitClick); 

     restartButton.buttonMode = true 
     restartButton.addEventListener(MouseEvent.CLICK, OnRestartClick); 

     mainButton.buttonMode = true 
     mainButton.addEventListener(MouseEvent.CLICK, OnMainClick); 

     //NativeApplication.nativeApplication.addEventListener(KeyboardEvent.KEY_DOWN, onSystemKey); 

     backButton.AnswerText.text = "Return to Game" 
     restartButton.AnswerText.text = "Restart" 
     mainButton.AnswerText.text = "Main Menu" 
     exitButton.AnswerText.text = "Exit" 
    } 

    public function OnBackClick(myEvent:MouseEvent):void{ 
     this.dispatchEvent(new GameEvent(GameEvent.BAC)) 

    } 
    public function OnExitClick(myEvent:MouseEvent):void{ 
     //NativeApplication.nativeApplication.exit(); 

    } 
    public function OnRestartClick(myEvent:MouseEvent):void{ 
     this.dispatchEvent(new GameEvent(GameEvent.NG)) 
     trace("restrt click") 
    } 
    public function OnMainClick(myEvent:MouseEvent):void{ 
     this.dispatchEvent(new GameEvent(GameEvent.MM)) 
     trace("main click") 
    } 

    protected function onSystemKey(e:KeyboardEvent):void 
    { 
     if(e.keyCode == Keyboard.BACK) 
     { 
      e.preventDefault(); 
      this.dispatchEvent(new GameEvent(GameEvent.BAC)) 
     } 
     else if(e.keyCode == Keyboard.HOME) 
     { 
      //handle the button press here. 
     } 
     else if(e.keyCode == Keyboard.MENU) 
     { 
      //handle the button press here. 
     } 
    } 


} 

OpenScreen

public class OpenScreen extends MovieClip 
{ 

    public var hs:String 

    public function OpenScreen() 
    { 
     startButton.buttonMode = true 
     startButton.addEventListener(MouseEvent.CLICK, OnStartClick); 

     exitButton.buttonMode = true 
     exitButton.addEventListener(MouseEvent.CLICK, OnExitClick); 


     //NativeApplication.nativeApplication.addEventListener(KeyboardEvent.KEY_DOWN, onSystemKey); 
     readObject() 
     highScoreText.text = String(hs) 
     trace(highScoreText.text) 
     startButton.AnswerText.text = "Start" 
     //restartButton.AnswerText.text = "Restart" 
     //mainButton.AnswerText.text = "Main Menu" 
     exitButton.AnswerText.text = "Exit" 
    } 

    public function OnStartClick(myEvent:MouseEvent):void{ 
     trace(this.hasEventListener(GameEvent.STAR)) 
     this.dispatchEvent(new GameEvent(GameEvent.STAR)) 


    } 
    public function OnExitClick(myEvent:MouseEvent):void{ 
     //NativeApplication.nativeApplication.exit(); 

    } 


    protected function onSystemKey(e:KeyboardEvent):void 
    { 
     if(e.keyCode == Keyboard.BACK) 
     { 

      //NativeApplication.nativeApplication.exit(); 
     } 
     else if(e.keyCode == Keyboard.HOME) 
     { 
      //handle the button press here. 
     } 
     else if(e.keyCode == Keyboard.MENU) 
     { 

     } 
    } 

ответ

2

Похоже, причина в том, что на вашем методе onMain, вы удаляете со сцены, а затем создаете совершенно новый экземпляр экрана воспроизведения. поэтому ваши слушатели привязаны к старому. Это также создает утечку памяти.

public function onMain(gameEvent:GameEvent):void{ 
     playScreen.removeChild(playScreen.menuScreen) 
     this.removeChild(playScreen) 
     //openScreen = new OpenScreen(); 
     openScreen.x = 0 
     addChild(openScreen) 
     playScreen = new PlayScreen(); //RIGHT HERE - this is creating a whole new play screen, your listeners are attached to the old one. 
} 

Если, вероятно, выглядеть следующим образом: (вынимают код экрана игры в конструкторе и не создать его экземпляр, когда ваш объявляя ее)

//Create a function that kill your current play screen 
public function clearPlayScreen():void { 
    if(!playScreen) return; //don't do anything if there isn't a play screen 
    playScreen.removeChild(playScreen.menuScreen) 
    this.removeChild(playScreen); 

    //remove your listeners so the old play screen can be garbage collected - other they will all stay in memory causing a memory leak 
    playScreen.removeEventListener(GameEvent.NG, NewGame); 
    playScreen.menuScreen.removeEventListener(GameEvent.NG, NewGame, true); 
    playScreen.menuScreen.removeEventListener(GameEvent.MM, onMain); 

    playScreen = null; 
} 

public function NewGame(gameEvent:GameEvent):void{ 
    clearPlayScreen(); //kill the old play screen if it exists 

    playScreen = new PlayScreen(); 
    addChild(playScreen); 

    //add the listeners to the new play screen 
    playScreen.addEventListener(GameEvent.NG, NewGame); 
    playScreen.menuScreen.addEventListener(GameEvent.NG, NewGame, true, 0, true); 
    playScreen.menuScreen.addEventListener(GameEvent.MM, onMain); 

    playScreen.begin(); 
} 

public function onMain(gameEvent:GameEvent):void{ 
    clearPlayScreen(); 

    //openScreen = new OpenScreen(); 
    openScreen.x = 0; 
    addChild(openScreen); 
} 
+0

Это имеет смысл, что это проблема, и это исправляет мою проблему с кнопками, которые не работают. Новый playScreen был моим способом создания новой игры, поскольку вся игровая механика заключена в playScreen. Есть ли лучший способ сбросить этот ребенок до того, как он был вызван? – Jimbo145

+1

Возможно, это более эффективный способ, но это будет зависеть от вашего приложения в целом. Нет ничего плохого в очистке и повторной инстанцировании, если она достаточно эффективна - просто убедитесь, что в памяти нет предыдущего сохранения экрана (например, прослушиватели событий) – BadFeelingAboutThis

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