2012-06-21 24 views
0

字符串效果我想做一个像这个网站的字符串效果http://www.bcaa.it/ 我可以学习什么样的脚本或教程?如何实现像http://www.bcaa.it/

基本上我想实现与网站相同。有弹跳的字符串效果,拖动项目,并远离其他项目,靠近它,拖动和子对象后跟缓动...

+0

你的意思是你只是想画一条线,附加两个元素? – Marty

+0

Yah就像那个网站,当你点击1个对象时,它会出现另一个对象,它带有字符串并附加在主对象上。当拖动主要对象时,子对象跟随缓动/反弹。我可以遵循的任何教程? – pizza0502

+0

包括圆圈,线条绘制和弹跳补间让这个问题变得相当宽泛。我可以写一个答案,涵盖在两个移动物体之间绘制一条线。 – Marty

回答

1

嘿刚开始编码这个,需要类似的图形显示我工作。这里是我的开始,只是两个按钮,但这个想法可以外推/优化:

<?xml version="1.0" encoding="utf-8"?> 
<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009" 
         xmlns:s="library://ns.adobe.com/flex/spark" 
         xmlns:mx="library://ns.adobe.com/flex/mx" 
         creationComplete="windowedapplication1_creationCompleteHandler(event)"> 

    <fx:Script> 
     <![CDATA[ 
      import mx.events.FlexEvent; 

      private var optimalDistanceUpdateTimer:Timer; 

      private var optimalDistance:Number = 100; 

      private var objectUserGrabbed:Button; 

      private var delayDenominator:Number = 6; 

      protected function button1_mouseDownHandler(event:MouseEvent):void 
      { 
       objectUserGrabbed = event.target as Button; 
       objectUserGrabbed.startDrag(); 
      } 

      protected function button1_mouseUpHandler(event:MouseEvent):void 
      { 
       objectUserGrabbed.stopDrag(); 
      } 

      protected function windowedapplication1_creationCompleteHandler(event:FlexEvent):void 
      { 
       optimalDistanceUpdateTimer = new Timer(33); 
       optimalDistanceUpdateTimer.addEventListener(TimerEvent.TIMER, optimalDistanceTickedHandler); 
       optimalDistanceUpdateTimer.start(); 
      } 
      private function optimalDistanceTickedHandler(event:TimerEvent):void 
      { 
       var targetPoint:Point; 
       var deltaX:Number; 
       var deltaY:Number; 

       if(!objectUserGrabbed) 
        return; 

       if(objectUserGrabbed == button1) 
       { 
        //Basically here I'm playing of Pythagorean theorem for a 45 degree triangle the x component and the y component are the distance of the hypotenuse over Sqrt(2) for different offsets, radially you'd need to adjust this to compute the target point for each object... would do something like var angleForEach:Number = 360/numObjects; then figure out the target point for each of the objects in a loop var angleForThis = angleForEach*index; (in this example only two objects, no loop needed) 
        targetPoint = new Point(objectUserGrabbed.x-optimalDistance/Math.SQRT2, objectUserGrabbed.y-optimalDistance/Math.SQRT2); 


        deltaX = (targetPoint.x-button2.x); 
        deltaY = (targetPoint.y-button2.y); 

        button2.move(button2.x+deltaX/delayDenominator, button2.y+deltaY/delayDenominator); 
       } 
       else 
       { 
        targetPoint = new Point(objectUserGrabbed.x+optimalDistance/Math.SQRT2, objectUserGrabbed.y + optimalDistance/Math.SQRT2); 

        deltaX = (targetPoint.x-button1.x); 
        deltaY = (targetPoint.y-button1.y); 

        button1.move(button1.x+deltaX/delayDenominator, button1.y+deltaY/delayDenominator); 
       } 
       lineDrawingArea.graphics.clear(); 
       lineDrawingArea.graphics.lineStyle(1); 
       lineDrawingArea.graphics.moveTo(button1.x + button1.width/2,button1.y + button1.height/2); 
       lineDrawingArea.graphics.lineTo(button2.x + button2.width/2,button2.y + button2.height/2); 
      } 
     ]]> 
    </fx:Script> 

    <fx:Declarations> 
     <!-- Place non-visual elements (e.g., services, value objects) here --> 
    </fx:Declarations> 
    <s:Group id="lineDrawingArea"/> 
    <s:Button id="button1" label="Item 1" mouseDown="button1_mouseDownHandler(event)" mouseUp="button1_mouseUpHandler(event)" x="0" y="0"/> 
    <s:Button id="button2" label="Item 2" mouseDown="button1_mouseDownHandler(event)" mouseUp="button1_mouseUpHandler(event)" x="0" y="0"/> 
</s:WindowedApplication> 
+0

哎呀抱歉,我没有提到我只熟悉Flash AS3,但是我可以将您的代码实现到AS3吗? – pizza0502

+0

@ pizza0502是的,你可以在AS3 pure中实现这个代码,没有太多问题......在Sprite上存在startDrag/stopDrag,几乎所有的东西都可以在Flash中使用,没有Flex。您可能想要在构造函数中处理该代码,而不是使用创建完成,否则这应该是一个非常好的起点,将用一条线显示一个对象连接到另一个对象,并在其中一个对象被另一个对象拖动时“追逐“。为了进一步扩展这个概念,你必须处理一组对象而不是两个。 – shaunhusain

+0

@ pizza0502基本上我在这里碰到的问题是,现在这对于我继续使用我自己的数据结构(一个图形实现)来填充这条线路网络的工作非常好,所以我做的剩余工作这将面向我希望它为我的实现/数据结构工作。您必须想出数据结构/值对象设置,以便以某种对此交互有意义的方式(parent - > children,其中parent具有isOpen的属性)存储所有“节点”的数据。 – shaunhusain