2015-01-28 2 views
0

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

в конструкторе У меня есть nLives = 2; addPlayerLivesToStage();

Вот addPlayerLivesToStage(); функция, а также removePlayerLives();

private function addPlayerLivesToStage():void 
    { 

     var startPoint:Point = new Point((stage.stageWidth/2) + 240, (stage.stageHeight/2) - 180); 
     var xSpacing:Number = 30; 

     lives = new Vector.<Sprite>(); 

     for (var i:int = 0; i < nLives; i++) 
     { 
      var playerLives:mcPlayerLives = new mcPlayerLives(); 

      playerLives.x = startPoint.x + (xSpacing * i); 
      playerLives.y = startPoint.y; 

      addChild(playerLives); 

      lives.push(playerLives); 
      //aPlayerLivesArray.push(playerLives); 
     } 
    } 



private function removePlayerLive():void 
    { 
     //Remove live from screen 
     removeChild(lives[lives.length - 1]); 
     lives[lives.length - 1] = null; 
     lives.splice(lives.length - 1, 1); 
    } 

Сейчас в моих играх ENTER.FRAME Loop У меня есть функция purchaseExtraLifeFunc();, которая управляет Закуп и является должен добавить 1 жизнь на сцену.

Как Итак:

private function purchaseExtraLifeFunc():void 
    { 
     if (nCoins >= 5 && purchaseItem) 
     { 
      trace("purchase life"); 
      //remove coins from cost of purchase 
      nCoins -= 5; 
      updatecoinsTextScore(); 

      //add extra life 
      nLives += 1; 
      addPlayerLivesToStage(); 

     } 
     else 
     { 
      purchaseItem = false; 
     } 
    } 

, как вы можете сказать, что я добавить 1 Живи и вызовите функцию addPlayerLivesToStage.

THis не работает правильно, и я все из идей, если кто-то может помочь мне с этим я бы действительно aprreciate это

ответ

1

Я вижу несколько логических проблем, которые могут быть причиной.

Похоже, что ваш метод addPlayerLivesToStage игнорирует тот факт, что его можно было бы назвать раньше, и уже могут существовать жизни, которые добавляют Sprites на сцену. Затем вы перезаписываете жизнь Vector с новым вектором. Таким образом, у вас больше нет доступа к ранее добавленным Sprites.

Бьюсь об заклад, если вы сделали жизнь Спрайтами немного прозрачной, вы увидите, что они стекаются друг над другом, когда вы покупаете больше жизней. Или, чтобы проверить, вы можете сохранить число, которое вы увеличиваете каждый раз, когда вы добавляете жизненный Sprite в свой цикл. И установите Y нового спрайта на это число. Таким образом, вы увидите все спрайты, которые вы добавляете.

Чтобы исправить это, вы хотите удалить все жизни Sprites в начале вашей функции addPlayerLivesToStage, потому что вы все равно воссоздаете их позже в этой функции.

EDIT *

Проблема заключается в том, что до сих пор Спрайты не очищены между addPlayerLivesToStage вызовов.

Это проще, если вы впервые используете контейнер Spirte для хранения всех ваших спрайтов. Так добавить частную собственность к классу:

private var livesContainer:Sprite; 

Тогда в вас конструктору, просто установите его:

livesContainer = new Sprite(); 
livesContainer.x = (stage.stageWidth/2) + 240; 
livesContainer.y = (stage.stageHeight/2) - 180; 
addChild(livesContainer); 

вы можете просто добавить все жизни в этом контейнере.

Я изменил вашу функцию addPlayerLivesToStage, чтобы удалить оставшиеся оставшиеся спрайты жизни в конце и очистил добавление, поэтому он не добавляет уже добавленную жизнь.

private function addPlayerLivesToStage():void 
{ 
    var xSpacing:Number = 30; 

    // Add new life sprites if we need to. 
    for (var i:int = lives.length; i < nLives; i++) 
    { 
     var playerLives:mcPlayerLives = new mcPlayerLives(); 
     playerLives.x = xSpacing * i; 
     livesContainer.addChild(playerLives); 
     lives.push(playerLives); 
    } 

    // Remove any life Sprites that are left over from last time. 
    for (var j:int = lives.length - 1; j > nLives; j--) 
    { 
     var life:Sprite = lives[j] 
     livesContainer.removeChild(life); 
     lives.splice(j, 1); 
    } 
} 
+0

Да, вы правы, это именно то, что происходит и когда я живу.length == 0 на моем endGameFunction он игнорирует лишние живые спрайты на сцене, и они не удалены. Итак, что именно вы имеете в виду, чтобы удалить спрайты жизни в начале функции? Все еще смущаюсь по поводу этой части. Но большое спасибо за помощь, насколько я ее ценю. – Nathan

+0

Я добавил life = new Vector. (); к моей функции конструктора и удалил ее из addPlayerLivesToStage(); Функция, но это все еще, похоже, не устраняет проблему. Не уверен, что делать дальше. – Nathan

+0

Интересно, что с этим новым изменением мне также нужно будет обновить мой removePlayerLive(); функция правильная? когда враг ударяет игрока, чтобы удалить живое со сцены? – Nathan