2013-04-06 2 views
0

Эй, ребята, поэтому у меня небольшая проблема с созданием нескольких уровней. Я не уверен, что если я создаю их правильно, но у меня есть игрок и цель_1, цель_2 и т. Д. В принципе, когда игрок hitTestObject цели_1, я хочу, чтобы он перешел к новой функции, называемой level_2, затем level_3 после этого hitTest. поэтому Level_1 работает просто отлично, потому что hitTest работает, и он инициализирует level_2, но когда я пытаюсь hitTest игрока и goal_2 или даже goal_1 снова, он просто проходит через него и ничего не делает.Создание нескольких уровней AS3

Теперь я понимаю, что level_2 не вызывается каждый кадр, такой как level_1, поскольку он не является частью прослушивателя Enter_Frame. Но я не могу понять, как иметь несколько событий Enter Frame и не запускать их одновременно. Если это даже правильный способ создания нескольких уровней.

Вы видите, что я могу сделать, чтобы заставить его работать?

private function gameLoop(e:Event):void 
    { 
     playerShoot(); 
     playerControl(); 
     playerStageBoundaries(); 

     checkEndGameCondition(); 
     checkPlayerOffScreen(); 

     level_1(); 
    } 


    private function level_1():void 
    { 


     if(player.hitTestObject(mGoal_1)) 
      { 

      trace("Goal_1 Collision"); 
      //Remove button for constant movement 
      btnShootPlayer = false; 
      mGoal_1.destroyGoal_1(); 
      player.destroyPlayer(); 
      //Update High Score text 
      nScore += 10; 
      updateHighScore(); 
      stage.removeEventListener(Event.ENTER_FRAME, gameLoop); 
      //Update level 
      nLevel++; 
      updatePlayerLevel(); 
      level_2(); 

      }else 
      { 

       checkEndGameCondition(); 
      } 
    } 



    public function level_2():void 
    { 

     stage.addEventListener(Event.ENTER_FRAME, gameLoop); 
     TweenMax.to(mGoal_1, 1, {y:40, repeat:-1, yoyo:true, ease:Power0.easeInOut}); 
     trace("Level_2 Initiated"); 
     //Keep Text Scores initiated 
     updateHighScore(); 
     updatePlayerLives(); 

     player = new mPlayer(); 
     stage.addChild(player); 
     player.x = (stage.stageWidth/2) - 280; 
     player.y = (stage.stageHeight/2); 

     mGoal_1 = new goal_1(); 
     stage.addChild(mGoal_1); 
     mGoal_1.x = (stage.stageWidth/2) + 300; 
     mGoal_1.y = (stage.stageHeight) - 35; 

     if (player.hitTestObject(mGoal_1)) 
     { 
      trace("Level 2 Hit test works!"); 


      nScore += 10; 
      updateHighScore(); 

     } 

    } 

ответ

0

Я не слишком тщательно читал весь код, но, я думаю, вы можете использовать функциональную переменную. Объявить его на уровне класса (вне любой функции):

var _doFunction:Function; 

чем, вместо вызова функции level1, передать ссылку и вызовите _doFunction:

_doFunction = level1; 
_doFunction();//or _doFunction.call(); - see Adobes documentation 

, когда вы сделали с ровном1, чем проход следующего уровня:

_doFunction = level2; 

PS не забудьте принять ответ, если это поможет решить вашу проблему.

+0

Интересно. Поэтому объявите функцию как: Частная функция _doFunction: Function; Затем я бы удалил функцию level_1 из моего gameLoop, добавив -doFunction внутри моего Enter_Frame gameLoop, как this -doFucntion(); Десять приходят к ним, как вы сказали выше? – Nathan

+0

Я думаю, вы не делаете этого, как я сказал выше. Я получил эту ошибку при попытке добавить функцию внутри цикла Enter_Frame TypeError: Ошибка # 1006: значение не является функцией. – Nathan

+0

после объявления переменной функции, не забудьте назначить ей функцию, например. 1-й уровень. В игровом цикле вам нужно вызвать только _doFucntion(). Затем, когда условие выполняется в level1, переназначьте функцию _doFucntion до point level2. – GeorgeCross

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