2012-09-12 3 views
3

Так что это немного сложно объяснить, я постараюсь изо всех сил, но, пожалуйста, просто несите меня.AS3: Keep MovieClip сверху

OK. Таким образом, я создаю игру, которая включает в себя дорогу, и автомобили перемещаются по ней в случайное время (каждые 5 секунд или около того)

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

public function animateCars() 
    { 
     CarMC = Random_Car(); 

     if (CarLeft) 
     { 
      CarMC.x = 0; 
      CarMC.y = 245; 
      CarMC.name = "CarNumber_"+CarNumber; 
      addChildAt(CarMC,numChildren - 1); 
      MoveCar = new Tween(CarMC,"x",None.easeNone,-60,900,12,true); 
      MoveCar.addEventListener(TweenEvent.MOTION_FINISH, CarFinished); 
      MoveCar.start(); 
     } 
     else 
     { 
      CarMC.x = 0; 
      CarMC.y = 258; 
      CarMC.name = "CarNumber_"+CarNumber; 
      CarMC.scaleX *= -1; 
      addChildAt(CarMC,numChildren - 1); 
      MoveCar = new Tween(CarMC,"x",None.easeNone,800,-260,12,true); 
      MoveCar.addEventListener(TweenEvent.MOTION_FINISH, CarFinished); 
      MoveCar.start(); 
     } 
     CarNumber++; 
    } 

    // Loads another car when finished 
    function CarFinished(e:TweenEvent):void 
    { 
     removeChild(getChildByName("CarNumber_"+CarNumberR)); 
     CarNumberR++; 
    } 

Это все работает отлично (ну Сорта, но это не актуальный вопрос) *

В этой игре вы также можете подобрать и разместить объекты. Используя приведенный ниже код:

function addBuilding(Text:String) 
    { 
     HoldingBuilding = true; 
     CursorPointer.visible = false; 
     CursorGrab.visible = true; 
     Building = new CarWash(); 
     Building.x = MouseX - MouseX % size; 
     Building.y = MouseY - MouseY % size2; 
     Building.rotation = 0; 
     addChildAt(Building,numChildren); 
    } 

Опять же это отлично работает, когда вы наведете здание над автомобилем автомобиль остается под ним. (как и следовало бы)

Проблема возникает, когда вы размещаете автомобиль слишком близко к дороге, а для первого здания это прекрасно работает, но если вы добавите второе здание, автомобиль будет находиться под самым новым зданием и над самым старым зданием здание.

, и я не могу работать, как я могу держать размещаемые здания на верхней или автомобили на нижней

Это код размещения:

function DropBuilding(e:MouseEvent):void 
     { 
      if (HoldingBuilding) 
      { 
       if (BuildingPlacement) 
       { 
        HoldingBuilding = false; 
        BuildingPlacement = false; 
        CursorPointer.visible = true; 
        CursorGrab.visible = false; 

        Building.x = MouseX - MouseX % size; 
        Building.y = MouseY - MouseY % size2; 
        Building.rotation = 0; 
        Building.transform.colorTransform = NoColour; 
        Building.removeChild(BuildingBase); 
        BuildingBase = new Sprite(); 
        BuildingShaddow = new Sprite(); 
        ShakeTimer.stop(); 
       } 
       else 
       { 
        ShakeTimer.start(); 
       } 
      } 
     } 

Спасибо заранее все, что вы можете сделать, чтобы помочь сохранить здания сверху или автомобили всегда на дне.

Эли


* Только упаковывают вы задавались этот вопрос, я с автомобилем промежуточных кадров в настоящее время является каждый нет, и снова (и я не работал, почему) один или два из автомобилей просто прекратить движение в течение 5 секунд, затем исчезают.

+0

@bokan Спасибо за ваш комментарий, я в какой-то момент смотреть в него больше. Но если это единственный способ исправить мою проблему, я пока не вижу в этом большого смысла. –

+1

Просто примечание/совет: 'addChildAt (Building, numChildren)' точно так же, как 'addChild (Building)'. addChild всегда ставит ребенка поверх всего остального – BadFeelingAboutThis

+1

Еще один совет в AS3 - чтобы сделать код более читаемым (очень хорошая вещь, когда просили других устранить его), стандарт defacto должен иметь экземпляры/vars начинать с нижнего регистра буквы и имена классов начинаются с букв верхнего регистра. – BadFeelingAboutThis

ответ

5

Каждый раз, когда вы создаете машину в вашей animateCars() функции, вы можете перебрать все дети и положить здания выше автомобилей, но это немного утомительно и ненужным (и не очень эффективным).

Это было бы гораздо лучше, метод:

//create a container for the cars 
var carContainer:Sprite = new Sprite(); 
addChild(carContainer); 

//create a container for the buildings 
var buildingContainer:Sprite = new Sprite(); 
addChild(buildingContainer); 

Поскольку вы добавили buildingContainer после carContainer, он всегда будет находиться на вершине (в том числе все, что вы положили в него)

Так что теперь ваш метод animateCars:

public function animateCars() 
{ 
    CarMC = Random_Car(); 
    carContainer.addChild(CarMC); 

    if (CarLeft) 
    { 
     CarMC.x = 0; 
     CarMC.y = 245; 
     MoveCar = new Tween(CarMC,"x",None.easeNone,-60,900,12,true); 
    } 
    else 
    { 
     CarMC.x = 0; 
     CarMC.y = 258; 
     CarMC.scaleX *= -1; 
     MoveCar = new Tween(CarMC,"x",None.easeNone,800,-260,12,true); 
    } 


    MoveCar.addEventListener(TweenEvent.MOTION_FINISH, CarFinished); 
    MoveCar.start(); 
} 

Тогда ваш carFinished метод:

function CarFinished(e:TweenEvent):void 
{ 
    carContainer.removeChild((e.currentTarget as Tween).obj as Random_Car); 
} 

Тогда в вашем методе addBuilding измените addChildAt(Building,numChildren); на:

buildingContainer.addChild(Building); 
+0

Это большое спасибо за объяснение всего этого. только одна проблема - это ошибка при удалении твинов. 'TypeError: Error # 2007: Параметр child должен быть не нулевым.' Я пробовал \t \t 'carContainer.removeChild (getChildByName (" CarNumber _ "+ CarNumberR)); но не проблема, вы думаете, что знаете, почему это вопрос? –

+0

Посмотрите на метод CarFinished, который я добавил выше, и попробуйте это. Нет необходимости в переменной CarNumber, плюс это может быть опечатка в вашем комментарии, но у вас есть «CarNumberR» - обратите внимание на R в конце - это не то, что вы используете, когда называете автомобиль – BadFeelingAboutThis

+0

@LondonDrugs_MediaServices Отличное объяснение. – Moorthy

1

Просто используйте контейнеры mcs и поместите все свои объекты внутрь. Это будет действовать как слои.

mc1 земля глубина глубина = 100
mc2 здание = 200 глубина
MC3 автомобилей = 300
mc4 оверлей (для оценки) = 1000

Клипы с большей глубиной будет выше клипов с более низкой глубиной. Я не выбрал последовательные глубины, например, 1,2,3, чтобы впоследствии добавить новый слой между существующими. используя глубину = 150, например.

Чтобы узнать, как установить глубину для использования тс http://www.foundation-flash.com/tutorials/changingdepths/

+0

clipClips не имеют каких-либо свойств глубины. Хотя я согласен, контейнеры - это путь. – BadFeelingAboutThis

+0

@LondonDrugs_MediaServices Я думал, что вы знаете, как это сделать. Вы устанавливаете глубину (или z-index) при использовании addChildAt(). Я обновил ответ с помощью учебника. Перед продолжением работы со вспышкой убедитесь, что вы освоили концепцию дерева дисплея и глубины. Это ключевая концепция. – bokan

+0

вы устанавливаете z-индекс рода с addChild, но это всего лишь простой указатель для слоев. Между элементами нет пустого пространства, которое можно оставить «открытым» для более позднего - например, при использовании CSS. Список отображения во флэш-памяти в основном представляет собой массив, и любой порядок, в котором находится массив, - это порядок, в котором они накладываются. Вы не можете просто сделать что-то вроде 'mc3.z-index = 300', как с помощью CSS. – BadFeelingAboutThis