AS3从舞台中删除对象

时间:2013-12-03 23:06:19

标签: arrays actionscript-3 flash

标题很模糊,抱歉。想不出怎么用一句话来问这个问题。

我将总结一下我的代码应该做什么:

  1. 提示用户输入1-99之间的数字。这个数字是舞台上出现的地雷数量。
  2. 一旦地雷出现在舞台上,用户可以点击任何一个地雷,并发生“爆炸”。
  3. 刚刚爆炸的地雷将从舞台上移走。
  4. 然后,'爆炸'将引爆最近的两个。
  5. 这两个地雷将从舞台上移走,而另外两个地雷将被撤离。 (即连锁反应)
  6. 我有步骤1-3。我无法“掀起”最近的两个地雷(即从舞台上移走)。

    我可以确定最后爆炸的两个最近的地雷,但我似乎找不到如何移除它们的方法。

    代码:

    package 
    {
    
    import flash.display.MovieClip;
    import flash.text.TextField;
    import flash.text.TextFieldType;
    import flash.events.*;
    
    public class Minefield extends MovieClip
    {
    
        var inputNumber:int;
        var iField:TextField = new TextField();
        var button:iButton = new iButton();
        var i:int;
        var mines:Array = new Array();
    
        public function Minefield()
        {
    
            var explosion:iExplosion = new iExplosion();
    
            iField.type = "input";
            iField.height = 18;
            iField.x = 460;
            iField.y = 275;
            iField.border = true;
            iField.restrict = "0-9";
            iField.maxChars = 2;
            stage.focus = iField;
            addChild(iField);
            addChild(button);
            button.x = 450;
            button.y = 175;
            button.buttonMode = true;
            button.addEventListener(MouseEvent.CLICK, UponClick);
    
    
        }
    
        function AddMines()
        {
            for (i = 0; i < inputNumber; i++)
            {
                CreatorOfMine();
                mines[i].addEventListener(MouseEvent.CLICK, UponMineClick)
                mines[i].buttonMode = true;
            }
        }
    
        function CreatorOfMine()
        {
            mines[i] = new Mine();
            MineLocation()
        }
    
        function MineLocation()
        {
            mines[i].x = Math.round(Math.random() * 925);
            mines[i].y = Math.round(Math.random() * 525);
            mines[i].rotation = Math.random() * 360;
            addChild(mines[i]);
    
        }
    
        function UponClick(e:MouseEvent)
        {
            inputNumber = int(iField.text);
            RemoverOfChildren();
    
        }
    
        function RemoverOfChildren()
        {
            removeChild(button);
            removeChild(iField);
            AddMines();
        }
    
        function UponMineClick(event:MouseEvent)
        {
            var mineObject:Mine = Mine(event.currentTarget)
            var expl:iExplosion = new iExplosion() 
            expl.x = mineObject.x
            expl.y = mineObject.y
            expl.rotation = mineObject.rotation
            addChild(expl)
            removeChild(mineObject)
            ChainReaction(mineObject)
    
        }
    
        function ChainReaction(mineObject:Mine)
        {
            Distances(mineObject,i)
    
    
        }
    
    
        function Distances(mineObject:Mine, i:int)
        {
            var DistanceArray:Array = new Array()
            var x1:Number = mineObject.x;
            var y1:Number = mineObject.y;
            for (var q:int = 0; q < (mines.length); q++){
                if (q != i){
                    var x2:Number = mines[q].x
                    var y2:Number = mines[q].y
    
                    var dy:Number = y2 - y1 
                    var dx:Number = x2 - x1
    
                    var dist:Number = Math.sqrt(Math.abs(dx*dx + dy*dy))
                    if (dist != 0)
                    {   
                        DistanceArray[q] = [dist]
                        //trace(dist)
                        trace(DistanceArray[q])
                    }
                    else if (dist == 0)
                    { 
                        continue
                    }
                }
            }
            FindNearestMines(DistanceArray)
        }
    
        function FindNearestMines(DistanceArray:Array){
    
            DistanceArray.sort(Array.NUMERIC);
    // Sorted my distances numerically so that I can figure out the closest two. How do I remove those two mines from the stage?
    
    
        }
    
    }
    }
    

3 个答案:

答案 0 :(得分:0)

好的,我仔细看了一下你的代码,这是我的建议。

在“距离”功能中,您可以执行以下操作:

制作2个临时数组。一个叫做mines_l,一个叫做distance_l 拿第一个矿井,将其粘贴在mines_l中,并将其距离放在distance_l中。 然后通过你的矿井进行处理。每个矿井,与distance_l [0]进行比较。如果它比disances_l [0]更近,则将distance_l [0]和mines_l [0]移动到... [1]。 如果矿井比...更接近[1]但不比......更接近[0],然后替换... [1]与新矿。

最后,你将在阵列mines_l中拥有2个最近的地雷。

此外,您可以考虑将mines数组更改为属性。就目前而言,您没有从阵列中移除地雷的机制。如果将其转换为属性,则可以在需要时将当前的地雷收集到数组中。

答案 1 :(得分:0)

生成一个数组,其中每个数组项都是包含“mine”和“distance”字段的Object。然后使用Array.sortOn(“distance”,Array.NUMERIC)按距离对该数组进行排序。

此示例计算_target与_movieClips数组的距离,并返回按距离排序的新的movieClip / distance对象数组。

function getClosestMovieClips(_target:MovieClip, _movieClips:Array, _num:int):Array{

    // This array will store our objects. 
    var tempArray:Array = [];

    // Loop through _movieclips
    for(var i:int = 0; i < _movieClips.length; i++){

        // Don't check _target's distance
        if (_target != _movieClips[i]){

            // Distance calculation
            var dy:Number = _movieClips[i].y - _target.y;
            var dx:Number = _movieClips[i].x - _target.x;

            var dist:Number = Math.sqrt(Math.abs(dx*dx + dy*dy));

            // New object contains mc and distance
            var tempObject:Object = {
                mc:_movieClips[i], 
                distance:dist
            }

            // Push object into tempArray
            tempArray.push( tempObject );
        }
    }

    // Sort tempArray based on distance field
    tempArray.sortOn("distance",Array.NUMERIC);

    // return new array with length of the parameter _num
    return tempArray.slice(0,_num);
}

答案 2 :(得分:0)

您的代码如何使用这些函数:

function CreatorOfMine()
{
    mines[i] = new Mine();
    MineLocation()
}

function MineLocation()
{
    mines[i].x = Math.round(Math.random() * 925);
    mines[i].y = Math.round(Math.random() * 525);
    mines[i].rotation = Math.random() * 360;
    addChild(mines[i]);

}

至少需要一个整数参数来访问mines [] array:)

在AS3中,我们需要在从舞台中删除之前删除DisplayObject的所有侦听器。如果您只是从舞台中删除该对象但保留所有侦听器,则不会将其删除。

所以你需要一个像这样的小函数:

    function removeMineFromStage(var i):void {
        mines[i].removeEventListener(MouseEvent.CLICK);
        //remove any other event listeners that you might have added.
        removeChild(mines[i]);
        mines[i] = null;
    }