我创建数组以在点击时在舞台上添加多个子项。当孩子彼此靠近时,我会添加一条线来将两者结合在一起。
问题是,X和Y的位置在我的阵列中变得混乱,在那里线没有移动到我孩子的正确协调。
修改 原来的问题已得到解决;但需要根据化学规则限制何时可以将一个点添加到其中一个数组(cArray,hArray,xArray,oArray):
更新的代码:
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();
}
}
}
}
}
}
答案 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;
}
}
}
}