2015-05-29 4 views
1

Используя массив, я создал MovieClip, состоящий из фрагментов. Мне нужно создать сетку динамически, так как есть несколько параметров размера. Если пользователь выбирает другой размер сетки, мне нужно удалить сетку, существующую на месте, перед добавлением новой сетки - вот где у меня возникают проблемы. Вот код для создания сетки:AS3 Flash - Как удалить динамически созданный MovieClip из разных функций?

public function createGrid() { 

    var gridItems = new Array(); 
    var grid:MovieClip = new MovieClip(); 
    addChildAt(grid, 0); 

    for (var i:int = 0; i < gridSize; i++) { 
    gridItems[i] = new tile(); 
    gridItems[i].x = (i % gridBreak) * (gridItems[i].width); 
    gridItems[i].y = int(i/gridBreak) * (gridItems[i].height); 
    grid.addChild(gridItems[i]); 
     } 

    grid.x = stage.stageWidth/ 2 - grid.width/2; 
    grid.y = (stage.stageHeight - 100)/2 - grid.height/2; 

    } 

Как удалить сетку из другой функции? Кажется, что всякий раз, когда я покидаю функцию createGrid(), ссылка на сетку теряется.

Спасибо за любые предложения!


Полный код ниже. Выпадающее меню от http://www.codingcolor.com/as3/as3-drop-down-menu/ - Я знаю, что код грязный ... это незавершенное производство.

package { 

import flash.display.MovieClip; 
import flash.events.*; 
import flash.geom.*; 
import flash.display.*; 
import flash.ui.*; 
import flash.text.*; 
import com.dropdown.DropDown; 
import fl.controls.*; 

public class sp2h extends MovieClip { 

    public var gridSize:Number = 225; 
    public var gridBreak:Number = 15; 

    private var gridItems = new Array(); 
    private var grid:MovieClip = new MovieClip(); 

    public var rotate:Number = 1; 
    public var gridStatus:Number = 0; 

    public var dropDwn:MovieClip; 
    public var t:TextField; 
    public var dropDArray:Array = new Array({label:"Size 0 - 15x15",  data:225},{label:"Size 1 - 18x15", data:270},{label:"Size 2 - 18x18", data:324}, 
              {label:"Size 3 - 21x18", data:378},{label:"Size 4 - 21x21", data:441},{label:"Size 5 - 24x21", data:504}, 
              {label:"Size 6 - 24x24", data:576},{label:"Size 7 - 27x24", data:648},{label:"Size 8 - 27x27", data:729}, 
              {label:"Size 9 - 30x27", data:810},{label:"Size 10 - 30x30", data:900},{label:"Size 11 - 33x30", data:990}, 
              {label:"Size 12 - 33x33", data:1089},{label:"Size 13 - 36x33", data:1188},{label:"Size 14 - 36x36", data:1296}, 
              {label:"Size 15 - 39x36", data:1404},{label:"Size 16 - 39x39", data:1521},{label:"Size 17 - 42x39", data:1638}, 
              {label:"Size 18 - 42x42", data:1764}); 
    public var dropDArray2:Array = new Array({label:"Hip & Stylish", data:0},{label:"Christmas", data:1},{label:"Easter", data:2},{label:"Slick", data:3}); 

public function sp2h() { 
    createGrid(); 

    dropDwn = new DropDown(); 
    dropDwn.x = 50; 
    dropDwn.y = 820; 
    dropDwn.init(dropDArray,150, 25,"up"); 

    addChild(dropDwn); 
    dropDwn.addEventListener(Event.CHANGE,onDropDown); 

    createStatusField(); 

    function createStatusField():void 
    { 
      t = new TextField(); 
      t.name = "tField"; 
      t.x = 350; 
      t.y = 100; 
      t.selectable = false; 
      t.autoSize = TextFieldAutoSize.CENTER; 
      addChild(t); 
    } 

    function onDropDown(event:Event) 
    { 

     t.text = event.target.selectedObject.label; 

     gridSize = event.target.selectedObject.data; 

    switch (gridSize){ 
    case 225: 
    gridBreak = 15; 
    break; 
    case 270: 
    gridBreak = 18; 
    break; 
    case 324: 
    gridBreak = 18; 
    break; 
    case 378: 
    gridBreak = 21; 
    break; 
    case 441: 
    gridBreak = 21; 
    break; 
    case 504: 
    gridBreak = 24; 
    break; 
    case 576: 
    gridBreak = 24; 
    break; 
    case 648: 
    gridBreak = 27; 
    break; 
    case 729: 
    gridBreak = 27; 
    break; 
    case 810: 
    gridBreak = 30; 
    break; 
    case 900: 
    gridBreak = 30; 
    break; 
    case 990: 
    gridBreak = 33; 
    break; 
    case 1089: 
    gridBreak = 33; 
    break; 
    case 1188: 
    gridBreak = 36; 
    break; 
    case 1296: 
    gridBreak = 36; 
    break; 
    case 1404: 
    gridBreak = 39; 
    break; 
    case 1521: 
    gridBreak = 39; 
    break; 
    case 1638: 
    gridBreak = 42; 
    break; 
    case 1764: 
    gridBreak = 42; 
    break; 
    } 

    createGrid(); 
    } 

    wtt1.addEventListener(MouseEvent.MOUSE_DOWN, wtt1_ClickToDrag); 

    function wtt1_ClickToDrag(event:MouseEvent):void 
    { 
    wtt1.startDrag(); 

    stage.addEventListener(KeyboardEvent.KEY_DOWN, myKeyDown); 
    function myKeyDown(e:KeyboardEvent):void{ 
    if (e.keyCode == Keyboard.SPACE){ 
     rotate = rotate + 1; 
     if (rotate == 5){ 
      rotate = 1; 
     } 
     trace(rotate); 
     wtt1.gotoAndStop(rotate); 
     } 
    } 

    stage.addEventListener(MouseEvent.MOUSE_UP, wtt1_ReleaseToDrop); 

    function wtt1_ReleaseToDrop(event:MouseEvent):void 
    { 

    wtt1.stopDrag(); 
    stage.removeEventListener(KeyboardEvent.KEY_DOWN, myKeyDown); 
    }}} 

    public function createGrid() { 

    removeGrid(); //a separate function that removes your grid 

    addChildAt(grid, 0); 
    gridStatus = 1; 

    for (var i:int = 0; i < gridSize; i++) { 
    gridItems[i] = new tile(); 
    gridItems[i].x = (i % gridBreak) * (gridItems[i].width); 
    gridItems[i].y = int(i/gridBreak) * (gridItems[i].height); 
    grid.addChild(gridItems[i]); 

     } 
    //align to center 
    grid.x = stage.stageWidth/ 2 - grid.width/2; 
    grid.y = (stage.stageHeight - 100)/2 - grid.height/2; 
    //send to back 
    addChildAt(bggrid,0); 

    } 

    public function removeGrid():void { 

    if(grid && grid.parent) removeChild(grid); 
    if (contains(grid)) { 
    trace("grid is on still on stage") 
    } 
    trace(grid.parent) 

    }}} 

ответ

2

Переменные доступны только для сферы действия, в которой они определены (и любых подложек). В вашем случае область действия - ваша функция (createGrid). Таким образом, что-либо вне этой области (скобки {}) не будет иметь доступа к этим переменным.

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

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

Так что-то вроде этого:

private var gridItems:Array; 
private var grid:MovieClip; 

public function createGrid() { 

    removeGrid(); //a separate function that removes your grid 

    gridItems = new Array(); 
    grid = new MovieClip(); 
    addChildAt(grid, 0); 

    for (var i:int = 0; i < gridSize; i++) { 
     gridItems[i] = new tile(); 
     gridItems[i].x = (i % gridBreak) * (gridItems[i].width); 
     gridItems[i].y = int(i/gridBreak) * (gridItems[i].height); 
     grid.addChild(gridItems[i]); 
    } 

    grid.x = stage.stageWidth/ 2 - grid.width/2; 
    grid.y = (stage.stageHeight - 100)/2 - grid.height/2; 

} 

public function removeGrid():void { 
    //if the grid has a value already and has a parent (is on the stage), remove it 
    if(grid && grid.parent) removeChild(grid); 
} 
+0

Спасибо! Именно то, что я искал. – jdfinch3

+0

Хорошо, перемещая переменные, работающие для реферирования сетки - однако у меня все еще проблема с удалением сетки. Я добавил следующие следы, чтобы посмотреть, что происходит: public function removeGrid(): void { \t \t if (grid && grid.parent) removeChild (grid); \t \t, если (содержит (сетку)) { \t \t след ("сетки по-прежнему на стадии") \t \t} \t \t, если (getChildByName ("сетка") == NULL) { \t \t следа («сетка равна нулю») \t \t} и получил «сетку нулевую». Тем не менее, сетка все еще видна на экране ... Итак, похоже, что ссылка на сетку удаляется, но фактический объект остается на сцене? – jdfinch3

+0

И вы помещаете функцию removeGrid в тот же файл класса, что и функция createGrid? 'getChildByName (" grid ")' будет 'null', потому что дочернее имя и ссылка на переменные - это не одно и то же. Вместо этого сделайте 'trace (grid.parent)' и посмотрите, что происходит. – BadFeelingAboutThis

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