How to remove dynamically created MovieClip from different function?

Using an array, I've created a MovieClip made up of tiles. I need to create the grid dynamically as there are multiple size options. If the user selects a different grid size, I need to remove the grid currently in place before adding the new grid - that is where I'm having trouble. Here is the code for creating the grid:

    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;

    }

How can I remove grid from within a different function? It seems that whenever I leave the createGrid() function the reference to grid is lost.

Thanks for any suggestions!


Full code below. Dropdown menu is from http://www.codingcolor.com/as3/as3-drop-down-menu/ - I know the code is messy...it's a work in progress.

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)

  }}}

Variables are only available to the scope they are defined in (and any sub scopes). In your case, the scope is your function ( createGrid ). So anything outside that scope (the { } braces) will not have access to those variables.

Also worth noting, those vars have no persistence once the function finishes executing. So the next time that function runs all new vars with new values will be created.

You need to declare those variables you wish to use later, outside of the function. Then, if you need to remove previous grid items, you can check and do so before creating new ones.

So something like this:

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);
}
链接地址: http://www.djcxy.com/p/17766.html

上一篇: 简单的as2加载到as3电影中

下一篇: 如何从不同的功能中删除动态创建的MovieClip?