AS3在阵列中定位混乱

时间:2014-01-30 06:23:56

标签: arrays actionscript-3

我创建数组以在点击时在舞台上添加多个子项。当孩子彼此靠近时,我会添加一条线来将两者结合在一起。

问题是,X和Y的位置在我的阵列中变得混乱,在那里线没有移动到我孩子的正确协调。

修改 原来的问题已得到解决;但需要根据化学规则限制何时可以将一个点添加到其中一个数组(cArray,hArray,xArray,oArray):

Example of running code

更新的代码:

package  
{

    import flash.display.*;
    import flash.events.*;

    public class main extends MovieClip 
    {
        public static var cArray:Array = new Array();
        public static var hArray:Array = new Array();
        public static var xArray:Array = new Array();
        public static var oArray:Array = new Array();

        var bondArray:Shape=new Shape();

        public function main() 
        {
            addEventListener(MouseEvent.MOUSE_UP,stopAllDrag);

            add_c_mol.addEventListener(MouseEvent.MOUSE_DOWN, clickCmol);
            add_h_mol.addEventListener(MouseEvent.MOUSE_DOWN, clickHmol);
            add_x_mol.addEventListener(MouseEvent.MOUSE_DOWN, clickXmol);
            add_o_mol.addEventListener(MouseEvent.MOUSE_DOWN, clickOmol);

            addEventListener(Event.ENTER_FRAME,checkBond);
        }

        private function stopAllDrag(e:MouseEvent):void
        {
            stopDrag();
        }

        private function clickCmol(e:MouseEvent)
        {
            cArray.push(new C_mol());
            cArray[cArray.length - 1].x=112;
            cArray[cArray.length - 1].y=197;
            addChild(cArray[cArray.length - 1]);
            cArray[cArray.length - 1].addEventListener(MouseEvent.MOUSE_DOWN,dragCmol);
            cArray[cArray.length - 1].addEventListener(Event.ENTER_FRAME,trashC);
        }
        private function dragCmol(e:MouseEvent):void
        {
            e.target.startDrag();
        }
        private function trashC (e:Event):void
        {
            if(e.target.hitTestObject(trash))
            {
                e.target.visible=false;
            }
            if(e.target.y<180)
            {
                e.target.y=180;
                stopDrag();
            }
        }



        private function clickHmol(e:MouseEvent)
        {
            hArray.push(new H_mol());
            hArray[hArray.length - 1].x=280;
            hArray[hArray.length - 1].y=174;
            addChild(hArray[hArray.length - 1]);
            hArray[hArray.length - 1].addEventListener(MouseEvent.MOUSE_DOWN,dragHmol);
            hArray[hArray.length - 1].addEventListener(Event.ENTER_FRAME,trashH);
        }
        private function dragHmol(e:MouseEvent):void
        {
            e.target.startDrag();
        }
        private function trashH (e:Event):void
        {
            if(e.target.hitTestObject(trash))
            {
                e.target.visible=false;
            }
            if(e.target.y<152)
            {
                e.target.y=152;
                stopDrag();
            }
        }



        private function clickXmol(e:MouseEvent)
        {
            xArray.push(new X_mol());
            xArray[xArray.length - 1].x=474;
            xArray[xArray.length - 1].y=201;
            addChild(xArray[xArray.length - 1]);
            xArray[xArray.length - 1].addEventListener(MouseEvent.MOUSE_DOWN,dragXmol);
            xArray[xArray.length - 1].addEventListener(Event.ENTER_FRAME,trashX);
        }
        private function dragXmol(e:MouseEvent):void
        {
            e.target.startDrag();
        }
        private function trashX (e:Event):void
        {
            if(e.target.hitTestObject(trash))
            {
                e.target.visible=false;
            }
            if(e.target.y<186)
            {
                e.target.y=186;
                stopDrag();
            }
        }


        private function clickOmol(e:MouseEvent)
        {
            oArray.push(new O_mol());
            oArray[oArray.length - 1].x=648;
            oArray[oArray.length - 1].y=189;
            addChild(oArray[oArray.length - 1]);
            oArray[oArray.length - 1].addEventListener(MouseEvent.MOUSE_DOWN,dragOmol);
            oArray[oArray.length - 1].addEventListener(Event.ENTER_FRAME,trashO);
        }
        private function dragOmol(e:MouseEvent):void
        {
            e.target.startDrag();
        }
        private function trashO (e:Event):void
        {
            if(e.target.hitTestObject(trash))
            {
                e.target.visible=false;
            }
            if(e.target.y<187)
            {
                e.target.y=187;
                stopDrag();
            }
        }

        private function checkBond(e:Event):void
        {
            bondArray.graphics.clear();
            for (var i:uint = 0; i < main.cArray.length; i++) 
            {
                for (var j:uint = 0; j < main.hArray.length; j++) 
                {
                    if (Math.pow(Math.abs(main.cArray[i].x - main.hArray[j].x),2)+Math.pow(Math.abs(main.cArray[i].y - main.hArray[j].y),2) < Math.pow(100,2))
                    {
                        //trace("yes");
                        bondArray.graphics.lineStyle(8,00000, 1);
                        bondArray.graphics.moveTo(main.cArray[i].x,main.cArray[i].y);
                        bondArray.graphics.lineTo(main.hArray[j].x,main.hArray[j].y);
                        addChildAt(bondArray,0);
                    }
                    else
                    {
                        //bondArray.graphics.clear();

                    }
                }
            }
        }

    }
}

1 个答案:

答案 0 :(得分:0)

如果我正确理解代码,您有两种不同类型的子代:

cArray的孩子和hArray的孩子。我是否正确期望行将一端作为cArray元素,另一端作为hArray元素? (这是您的代码目前正在做的事情)

另一个问题是嵌套循环的运行方式。如果您正在寻找从cArray[0]hArray[0]cArray[1]hArray[1]的行;但不是cArray[0]cArray[1]等等,那么你需要一个没有嵌套for循环的常量索引:

var numLines = ???;
for (var i:uint = 0; i < numLines; i++) 
{
   var cPosition = cArray[index];
   var hPosition = hArray[index];

   //Then draw the line between them.
}

作为一个注释,你的矢量距离数学看起来没问题,但你的图形绘图看起来是另一个问题。

看起来在某些时候你正在为每一行创建一个新的形状,你认为这是正确的,是不必要的。但是,每次创建新行时都会清除以前的行。

您希望在开始此帧的任何绘图(即for循环之上)之前清除图形:

bondArray.graphics.clear();
for (var i:uint = 0; i < main.cArray.length; i++)   
{
...

修改

对于你的第二个问题 - “我想做的只有1 C能够连接到H,这意​​味着H只能接受1个债券。

如果你在(分子?)之间添加线条,你只需计算你已连接的数量。所以你现在正在做这件事:

//1. Add this counter.
var numberCToHConnections:int = 0;
for (var i:uint = 0; i < main.cArray.length; i++) 
{
    for (var j:uint = 0; j < main.hArray.length; j++) 
    {
        // 3. Check if the counter is less than 1, 
        // if it is, then we dont want any more lines to be drawn.
        if( numberCToHConnections < 1 ) {
            if (Math.pow(Math.abs(main.cArray[i].x - main.hArray[j].x),2)+Math.pow(Math.abs(main.cArray[i].y - main.hArray[j].y),2) < Math.pow(100,2))
            {
                //2. Then increment the counter each time you draw the line.
                numberCToHConnections = numberCToHConnections + 1;
            }
        }
    }
}