2012-11-18 27 views
0

我真的是新来的Flash和as3 ...我试图在flash中创建2个场景 - 其中一个我的movieclip从它附近离开鼠标时远离它的地方,其他影片剪辑被鼠标吸引的地方。我在actionscript 2上找到了答案,但是我不能在as3文件中使用它... 任何帮助或想法? 干杯!Movieclip对鼠标的吸引/排斥

+0

你的问题是相当本地化的。我相信你可以在那里找到大量的例子。如果你不熟悉as3,但想获得一些实用程序,我建议看看[Hype](http://www.hypeframework.org/)。回到你的问题试试[this](http://www.hypeframework.org/01_background/content/mousefollow-as3/),你所需要的只是一个方向变量,你在放松后乘以一个方向变量,它的值为1 -1排斥。 –

+0

是的,我真的是新的闪光灯...感谢您的帮助:) – Dan434

回答

2

下面是一个关于鼠标位置被“推”和“拉”的显示对象的例子。

Main.as(文档类):

package 
{ 
    import flash.display.Sprite; 
    import flash.events.Event; 
    import flash.events.MouseEvent; 
    import flash.geom.Point; 

    public class Main extends Sprite 
    { 

     public static var PULL:String = "pull"; 
     public static var PUSH:String = "push"; 

     private var _circle:Circle; 
     private var _force:String; 

     public function Main():void 
     { 
      if (stage) init(); 
      else addEventListener(Event.ADDED_TO_STAGE, init); 

     }// end function 

     private function init(e:Event = null):void 
     { 
      removeEventListener(Event.ADDED_TO_STAGE, init); 

      _circle = new Circle(); 
      addChild(_circle); 

      _force = PULL; 

      stage.addEventListener(MouseEvent.MOUSE_DOWN, onStageMouseDown); 

     }// end function 

     private function onStageMouseDown(e:MouseEvent):void 
     { 
      stage.addEventListener(MouseEvent.MOUSE_UP, onStageMouseUp); 
      stage.addEventListener(Event.ENTER_FRAME, onStageEnterFrame); 

     }// end function 

     private function onStageMouseUp(e:MouseEvent):void 
     { 
      stage.removeEventListener(MouseEvent.MOUSE_UP, onStageMouseUp); 
      stage.removeEventListener(Event.ENTER_FRAME, onStageEnterFrame); 

      _force = (_force == PULL) ? PUSH : PULL; 

     }// end function 

     private function onStageEnterFrame(e:Event):void 
     { 
      var point1:Point = new Point(_circle.x, _circle.y); 
      var point2:Point = new Point(stage.mouseX, stage.mouseY); 
      var point3:Point = point2.subtract(point1); 
      point3.normalize(10); 

      if (_force == PULL) { 

       _circle.x += point3.x; 
       _circle.y += point3.y; 

      } else if (_force == PUSH) { 

       _circle.x -= point3.x; 
       _circle.y -= point3.y; 

      }// end else if 

     }// end function 

    }// end class 

}// end package 

import flash.display.Sprite; 
import flash.events.Event; 

class Circle extends Sprite { 

    public function Circle() { 

     draw(); 

    }// end function 

    private function draw():void { 

     this.graphics.lineStyle(1); 
     this.graphics.beginFill(0xFFFFFF); 
     this.graphics.drawCircle(0, 0, 20); 
     this.graphics.endFill(); 

    }// end function 

}// end class 

init()方法我们新的显示对象添加到阶段,这是我们将“拉”以及显示对象“推动”关于鼠标的位置。

_circle = new Circle(); 
addChild(_circle); 

然后我们设置_force属性我们PULL不变。 _force属性将决定显示对象是“拉”还是“推”。

_force = PULL; 

接下来我们将我们的鼠标事件监听器添加到舞台上。在MouseEvent.MOUSE_DOWN上,我们称之为onStageMouseDown()事件处理程序。当处理程序被调用时,我们将一个Event.ENTER_FRAMEMouseEvent.MOUSE_UP事件监听器添加到舞台上。

private function onStageMouseDown(e:MouseEvent):void 
{ 
    stage.addEventListener(MouseEvent.MOUSE_UP, onStageMouseUp); 
    stage.addEventListener(Event.ENTER_FRAME, onStageEnterFrame); 

}// end function 

MouseEvent.MOUSE_UP事件处理函数被调用时,先前的Event.ENTER_FRAMEMouseEvent.MOUSE_UP事件侦听器从舞台上删除。然后根据_force属性的值,其值在PUSHPULL之间交替。

private function onStageMouseUp(e:MouseEvent):void 
{ 
    stage.removeEventListener(MouseEvent.MOUSE_UP, onStageMouseUp); 
    stage.removeEventListener(Event.ENTER_FRAME, onStageEnterFrame); 

    _force = (_force == PULL) ? PUSH : PULL; 

}// end function 

最后,onStageEnterFrame事件处理程序。这是我们计算显示对象相对于鼠标的新位置的地方。

有不同的方式去做这件事,但我决定用Point类来简化事情。首先,我们必须获得显示对象位置的Point对象和鼠标位置的另一个对象Point

var point1:Point = new Point(_circle.x, _circle.y); 
var point2:Point = new Point(stage.mouseX, stage.mouseY); 

接下来我们要开始使用Point对象的subtract()方法点之间的差异。

var point3:Point = point2.subtract(point1); 

有了这个新的点,我们可以使用Point对象的normalize()方法是按比例的显示对象的位置和鼠标的为设定的长度的位置之间的线段。

point3.normalize(10); 

最后取决于_force属性的值,我们要么减去或者从显示对象的xy属性添加该点的xy性质。

+0

哇,我字面上得到了所有这一切。非常感谢你解释它:) :) – Dan434

+0

total ledgend .. – Dan434