2012-11-18 48 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