2016-12-12 3 views
1

Я кодировал очень простую программу, которая позволяет перемещаться по кругу, а также прямоугольник на сцене. Я хотел сделать круг перед прямоугольником, пока вы его перетаскиваете, но когда вы отпустите мышь, кружок будет отправлен обратно.Как установить переменную public с помощью getChildIndex в as3?

Я не знаю, как установить общедоступную переменную с помощью метода getChildIndex. Мне все равно, остальная часть кода. Меня в основном интересует, как я могу заставить метод getChildIndex работать с общедоступной переменной.

package code 
{ 

    import flash.display.MovieClip; 
    import flash.events.MouseEvent; 
    import flash.events.Event; 
    import flash.display.Sprite; 


    public class Main extends MovieClip 
    {   
     public var myCircleIndex:int = getChildIndex(myCircle); 

     public function Main() 
     { 
      myCircle.addEventListener(MouseEvent.MOUSE_DOWN, mouseClicking); 
      stage.addEventListener(MouseEvent.MOUSE_UP, mouseReleased); 
     } 

     public function mouseClicking(e:MouseEvent): void 
     { 
      myCircle.startDrag(); 
      setChildIndex(myCircle, numChildren-1); 
     } 

     public function mouseReleased(e:MouseEvent): void 
     { 
      myCircle.stopDrag(); 
      setChildIndex(myCircle, myCircleIndex); 
     } 
    } 
} 

Я использую экземпляр («myCircle»), который я создал непосредственно на сцене в качестве видеоклипа.

Проблема в общедоступном var I, установленном в начале, она не позволяет мне получить дочерний индекс myCircle, но если я помещу ту же строку внутри функции, она будет работать.
Я знаю, что я мог бы сразу поместить номер индекса myCircle в последнюю строку (и стирать public var myCircleIndex), но я понял, что будет способ использования getChildIndex для публичного var в классе.

Как вы используете getChildIndex в общедоступной переменной внутри класса?

+0

Все, что вам нужно сделать, чтобы поставить круг за квадрат является на выпуске сделать AddChild (квадрат) или addChildAt (круг, 0); –

+0

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

+0

Если вы хотите немного более утонченно и хотите просто поместить круг прямо за квадрат (если было 100 слоев, а квадрат на уровне 12, но вы не уверены, на каком уровне находится квадрат), вы могли бы сделать ' addChildAt (circle, getChildIndex (square) -1); ' –

ответ

3

Причина этого не работает, потому что ваши объекты временной шкалы еще не существуют, когда работает линия public var myCircleIndex:int.

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

Вот как вы можете реорганизовать это (см комментарии код):

public class Main extends MovieClip 
{   
    public var myCircleIndex:int; //just create the reference here, don't assign it 
    public var myCircle:flash.display.DisplayObject; //this line is just for better compile time checking and code completion, completely optional 

    public function Main() 
    { 
     //wait for all the display stuff to be created before trying to access it. The constructor function can run before timeline stuff is created, so it's not safe to reference stage or timeline objects here. 
     if(!stage){ 
      this.addEventListener(Event.ADDED_TO_STAGE, timelineCreated); 
     }else { 
      timelineCreated(null); 
     } 
    } 

    private function timelineCreated(e:Event):void { 
     //now that we're certain the timeline stuff has been created, we can reference timeline objects and stage: 

     //store the initial z-index of myCircle 
     myCircleIndex = getChildIndex(myCircle); 

     //the rest of your code that was in the construction -Main()- before 
     myCircle.addEventListener(MouseEvent.MOUSE_DOWN, mouseClicking); 
     stage.addEventListener(MouseEvent.MOUSE_UP, mouseReleased); 
    } 

    //no change to any of the following stuff 

    public function mouseClicking(e:MouseEvent): void 
    { 
     myCircle.startDrag(); 
     setChildIndex(myCircle, numChildren-1); 
    } 

    public function mouseReleased(e:MouseEvent): void 
    { 
     myCircle.stopDrag(); 
     setChildIndex(myCircle, myCircleIndex); 
    } 
} 
+0

Спасибо, что ответили на мой вопрос, очень помогли мне :) – m5signorini

2

Все, что вам нужно сделать, чтобы поставить круг за квадрат на релизе, addChild(myRectangle) или addChildAt(myCircle, 0);

Вы усложнять вещи, пытаясь отслеживать переменную, на мой взгляд. Пусть вспышка рассортирует его за кулисами.

Если вы хотите немного более изящно и хотите просто поместить круг прямо за квадрат (если было 100 слоев, а квадрат - на уровне 12, но вы не уверены, на каком уровне находится квадрат) может сделать

addChildAt(myCircle, getChildIndex(myRectangle)-1); 

примечание

setChildIndex (MyCircle, numChildren-1);

Это хорошо, чтобы сделать это таким образом. Наиболее распространенный способ сделать это -

addChild(myCircle); 

Он делает то же самое. Многие люди смущены этим соображением, что это добавит новый myCircle, но он просто выводит его на передний план, если он уже находится в списке отображения, и если он отсутствует в списке отображения, он добавляет его в список отображения в верхней части z- порядок (numChildren-1).

+0

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

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