Как убрать всех детей статичной формы на сцене? - PullRequest
1 голос
/ 09 ноября 2019

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

Поэтому, когда я нажимаю кнопку График (кнопка_2), слой шаблона графика становится видимым. Существует предварительно рассчитанный массив с координатами значений, которые должны быть нанесены на график.

Для каждой координаты (за 0,1 секунды, как указано таймером обратного отсчета), там помещается «точка» мувиклипа. Затем создается новая форма круга и помещается в ту же точку (копируя ее координаты). Таким образом, сцена теперь имеет параболическую пунктирную линию. Однако при нажатии кнопки «назад» все созданные круги не исчезают / не сбрасываются (удаляя все дочерние элементы), как предполагалось.

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

button_2.addEventListener(MouseEvent.CLICK, goToGraph);

function goToGraph(event:MouseEvent):void
{

graphTemplate.visible = true;
backToSim1.visible = true;
point.visible = true;

point.x = 42
point.y = 608

var vx = velocity*Math.cos(angle/(180/Math.PI));
var vy = velocity*Math.sin(angle/(180/Math.PI));
var Time = int(((2*vy)/9.81)*100)/100

if (Time != 0) {


    var t :Number = 0;
    var position:Array = new Array();
    var pos_idx :int = 0; //the position within the array


    while(t <= Time)
    {
        position[ pos_idx ] = (vy * t) - 4.905 * (t * t);
        trace("position[" + pos_idx + "]: " + position[ pos_idx ] );

        t += 0.1;
        t = Number( t.toFixed(3) ); 
        trace("t is: " + t);

        pos_idx += 1; 
    }



    var fl_TimerInstance:Timer = new Timer(100, (Time*10));
    fl_TimerInstance.addEventListener(TimerEvent.TIMER, fl_TimerHandler);
    fl_TimerInstance.start();
    var a = 0;
    var timeElapsed = 0;


    function fl_TimerHandler(event:TimerEvent):void
    {
        a = a+1;



        point.x = point.x + (vx*1.2);
        point.y = 608 - (position[a]*10);
        timeElapsed = timeElapsed + 1;

        var circle:Shape = new Shape();
        circle.graphics.clear();
        circle.graphics.lineStyle(2,0x000000);
        circle.graphics.beginFill(0x990000);
        circle.graphics.drawCircle(0,0,1);
        circle.graphics.endFill();
        addChild(circle);
        circle.x = point.x
        circle.y = point.y


        if (position[a+1] == null) {
            point.visible = false;

            }

    }

}

    backToSim1.addEventListener(MouseEvent.CLICK, fl_ClickToHide_2);

    function fl_ClickToHide_2(event:MouseEvent):void
    {
    graphTemplate.visible = false;
    backToSim1.visible = false;
    point.visible = false;

    while (circle.numChildren > 0) {
    circle.removeChildAt(0);
    }


    }

}

Я получаю следующие ошибки:

  • Доступ к возможно неопределенному свойству numChildren через ссылку со статическим типом flash.display: Shape.

  • Вызов возможно неопределенного метода removeChildAt через ссылку со статическим типом flash.display: Shape.

Я ожидаю, что все созданные переменные «круга» будутбыть сброшен / удален. Как я могу это сделать?

1 Ответ

1 голос
/ 09 ноября 2019

Есть несколько способов структурирования картинки. Лично я бы выбрал решение Array , но ваш код грязный (плохое форматирование, функции внутри функций), поэтому прибегаю к именам.

var Circles:Array = new Array;

function fl_TimerHandler(event:TimerEvent):void
{
    // ...

    var circle:Shape = new Shape();

    circle.name = "Circle";

    // ...
}

function fl_ClickToHide_2(event:MouseEvent):void
{
    // ...

    for (var i:int = numChildren - 1; i >= 0; i--)
    {
        var aChild:DisplayObject = getChildAt(i);

        if (aChild.name == "Circle")
        {
            removeChildAt(i);
        }
    }
}
...