2011-09-20 3 views
0

startDrag()関数を使用せずに、MovieClipを選択してドラッグする単純な関数を作成しようとしています。AS3:MCを選択すると、なぜ「震える」のですか?

ステージ上にMCがいくつかあります。マウスをMC上に置くと、MCをマウスで動かすことができます。しかし、私がマウスを押し下げたとき、MCは "震える"ようになり、私は理由が分かりません。

私は他の理由で各MCの中にコードを持っています。ここで私はこれまで持っているものです。

var selectX:Number; //x coordinate of mouse click (to select right point on mc on mouse down) 


this.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler); 
this.addEventListener(MouseEvent.MOUSE_UP, mouseUpHandler); 

function mouseDownHandler(e:MouseEvent):void { 
    selectX = this.x - mouseX; 
    addEventListener(Event.ENTER_FRAME, onEnterFrameHandler); 
} 


function mouseUpHandler(e:MouseEvent):void { 
    mouseX2 = mouseX; 
    removeEventListener(Event.ENTER_FRAME, onEnterFrameHandler); 
} 

function onEnterFrameHandler(e:Event):void { 
    this.x = mouseX + selectX + stage.x; 
} 

答えて

2

これは、ムービークリップの内側にmouseXを使用しているために発生しています。 movieClipのxを設定しようとすると、親ムービークリップにxが設定されます。

例えば:

のMainClip | - DragableButton

あなたはDragableButton.x = 100を追加し、それはのMainClipのinsided x位置です。 あなたのコードがmouseXをDragableButtonの内側に入れているときは、実際のmouseX = x + mouseXです。 DragableButtonの内部のmouseXは、例えば、等しいです。 20、そしてあなたが追加する:selectX = this.x - mouseX - >あなたはselectX = 100-20ですが、それは100-120でなければなりません。そう

あなたはまだそれをあなたのコードの変更にビットを保持する場合:

var selectX:Number; //x coordinate of mouse click (to select right point on mc on mouse down) 
var mouseX2:Number; 


this.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler); 
this.addEventListener(MouseEvent.MOUSE_UP, mouseUpHandler); 

function mouseDownHandler(e:MouseEvent):void { 
    selectX = this.x - parent.mouseX; 
    // selectX = this.x - stage.mouseX; 
    addEventListener(Event.ENTER_FRAME, onEnterFrameHandler); 
} 


function mouseUpHandler(e:MouseEvent):void { 
    mouseX2 = parent.mouseX; 
    removeEventListener(Event.ENTER_FRAME, onEnterFrameHandler); 
} 

function onEnterFrameHandler(e:Event):void { 
    this.x = parent.mouseX + selectX; 
    // this.x = stage.mouseX + selectX; 
} 

P.S. stage.x = 0、常にそうです。プロパティを変更しない限り p.s.s.どのMCからでもそれを取得しようとしているにもかかわらず、ステージは1つの同じインスタンスです。

私の提案のdragingは次のようになります。

this.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler); 

function mouseDownHandler(e:MouseEvent):void 
{ 
    this.startDrag(); 
    stage.addEventListener(MouseEvent.MOUSE_UP, mouseUpHandler); 
} 


function mouseUpHandler(e:MouseEvent):void 
{ 
    this.stopDrag(); 
    stage.addEventListener(MouseEvent.MOUSE_UP, mouseUpHandler); 
} 
+0

+1しかし彼は自分のコードでXを動かしているだけなので、startDragではバウンディングボックスを実装してXだけにすることができます。これはすべてstartDragを使いたくない理由であると仮定しています –

+0

Jevgenjiありがとう、完璧に動作します。 @Dhe_asManのように、私はトラックの下にバウンディングボックスを実装している可能性があるので、startDragを使用したくないので、その可能性を計画しようとしています。再度、感謝します。 – muudless

0

私はあなたのドラッグ中に、アプリケーションがselectXを変更し、mouseDownHandlerを呼び出し続けますので、ムービークリップが震えていると思います。

MOUSE_DOWNイベントリスナーを削除してみます。 mouseDownHandlerでは、まずこれを行います(これはメモリーリークを防ぐための良い方法です)。マウスを上に動かすと、リスナーを元に戻すことができます(そしてマウスの上のリスナーを削除します)。

0

なぜEvent.ENTER_FRAMEイベント(高価)を使用していますか?このようにMouseEvent.MOUSE_MOVEを使用してみてください。

function mouse_move(e:Event) 
{ 
    this.x = mouseX + selectX + stage.x; 
} 

このイベントハンドラをマウスアップして削除します。

+0

おかげで、私は今、それを交換しました。理由はわかりませんが、マウスイベントを使用する方が理にかなっています。 – muudless

関連する問題