2016-07-22 8 views
3

Mein Problem zu beeinflussen ist: Ich habe einen Movieclip (obj), dass die Benutzer auf beiden Seiten den Code, den ich für diese navigieren ziehen, verwenden:Wie eine Drag-Aktion verhindern, dass die Kinder eines MovieClip-

import flash.events.MouseEvent; 
import flash.geom.Point; 
import flash.events.Event; 
import flash.geom.Rectangle; 

var destination: Point = new Point(); 
var dragging: Boolean = false; 
var speed: Number = 10; 
var offset: Point = new Point(); 
var bounds: Rectangle = new Rectangle(0, 0, stage.stageWidth, stage.stageHeight); 

obj.addEventListener(MouseEvent.MOUSE_DOWN, startdrag); 
stage.addEventListener(MouseEvent.MOUSE_UP, stopdrag); 
obj.addEventListener(Event.ENTER_FRAME, followmouse); 

function startdrag(e: MouseEvent): void { 
    offset.x = obj.mouseX * obj.scaleX; 
    dragging = true; 
} 

function stopdrag(e: MouseEvent): void { 
    dragging = false; 
} 

function followmouse(e: Event): void { 
    if (obj) { 
     if (dragging) { 
      destination.x = mouseX; 
     } 

     obj.x -= (obj.x - (destination.x - offset.x))/speed; 

     if (obj.x > bounds.left) { 
      obj.x = bounds.left; 
     } 

     if (obj.x < -obj.width + bounds.right) { 
      obj.x = -obj.width + bounds.right; 
     } 
    } 
} 

so weit so gut, das Problem kommt, wenn ich in diesem Movieclip (obj) einige klickbare Elemente setzen, sind hier der Code für die klickbare Elemente:

objA.addEventListener(MouseEvent.CLICK, objATrigger); 
objB.addEventListener(MouseEvent.CLICK, objBTrigger); 
objC.addEventListener(MouseEvent.CLICK, objCTrigger); 

function objATrigger(event: MouseEvent): void { 
    MovieClip(this.parent).gotoAndPlay(1, "Main"); 
} 

function objBTrigger(event: MouseEvent): void { 
    MovieClip(this.parent).gotoAndPlay(1, "Main"); 
} 

function objCTrigger(event: MouseEvent): void { 
    MovieClip(this.parent).gotoAndPlay(1, "Main"); 
} 

das Problem ist: wenn ich die MovieClip- ziehen (obj) Es gibt ein Confli ct mit dem Ereignis, wenn die Maus nach dem Ziehen freigeben, wird das Ereignis Click von MovieClips innerhalb des MovieClip (obj) ausgelöst, wie kann ich das beheben? Sie sollten nur ausgelöst werden, wenn keine Drag-Aktion stattfindet.

Antwort

2

So handhabe ich das Ziehen eines übergeordneten Objekts mit anklickbaren untergeordneten Elementen. Der Vorteil dieser Methode besteht darin, dass Sie den Kindern nichts tun müssen (keine zusätzlichen Bedingungen in ihren Klickhandlern usw.), das Klickereignis erreicht sie einfach nicht.

Sie können auch einige Effizienz Tipps von den Code/Kommentaren unten hoffentlich glänzen:

var wasDragged:Boolean = false; 
var dragThreshold:Point = new Point(10,10); 
//^how many pixels does it need to move before it's considered a drag 
//this is good especially on touchscreens as it's easy to accidentally drag the item a couple pixels when clicking. 

var dragStartPos:Point = new Point(); //to store drag origin point to calculate whether a drag occured 
var dragOffset:Point = new Point(); //to track the gap between the mouse down point and object's top left corner 

obj.addEventListener(MouseEvent.MOUSE_DOWN, startdrag); 
obj.addEventListener(MouseEvent.CLICK, dragClick, true); //listen on the capture phase of the event. 

//the only reason we listen for click on the draggable object, is to cancel the click event so it's children don't get it 
function dragClick(e:Event):void { 
    //if we deemed it a drag, stop the click event from reaching any children of obj 
    if(wasDragged) e.stopImmediatePropagation(); 
} 

function startdrag(e: MouseEvent): void { 
    //reset all dragging vars 
    wasDragged = false; 
    dragStartPos.x = obj.x; 
    dragStartPos.y = obj.y; 

    //set the offset so the object doesn't jump when first clicked 
    dragOffset.x = stage.mouseX - obj.x; 
    dragOffset.y = stage.mouseY - obj.y; 

    //only add the mouse up listener AFTER the mouse down 
    stage.addEventListener(MouseEvent.MOUSE_UP, stopdrag); 
    //mouse_move is more efficient that enter_frame, and only listen for it when dragging 
    stage.addEventListener(MouseEvent.MOUSE_MOVE, followmouse); 
} 

function stopdrag(e:MouseEvent = null): void { 
    //remove the dragging specific listeners 
    stage.removeEventListener(MouseEvent.MOUSE_UP, stopdrag); 
    stage.removeEventListener(MouseEvent.MOUSE_MOVE, followmouse); 
} 

function followmouse(e:MouseEvent): void { 
    if (obj) { 
     //do what you need to move the object 
     obj.x = stage.mouseX - dragOffset.x; 
     obj.y = stage.mouseY - dragOffset.y; 

     //check if the obj moved far enough from the original position to be considered a drag 
     if(!wasDragged 
      && (Math.abs(obj.x - dragStartPos.x) > dragThreshold.x 
      || Math.abs(obj.y - dragStartPos.y) > dragThreshold.y) 
     ){ 
      wasDragged = true; 
     } 
    } 
} 
0

Fügen Zustand in objATrigger Funktion zu überprüfen, ob schlepp falsch ist

function objATrigger(event: MouseEvent): void { 
    if(!MovieClip(root).dragging){ 
     MovieClip(this.parent).gotoAndPlay(1, "Main"); 
    } 
} 
+0

immer noch nicht funktioniert, habe ich die Variable verfolgt und es gibt 'false' Ändern –

+0

Versuchen addEventListener zu: objA.addEventListener (MouseEvent.MOUSE_DOWN, objATrigger); –

+0

TypeError: Fehler # 1009: Zugriff auf eine Eigenschaft oder Methode eines Nullobjektverweises nicht möglich. –

1

Ich weiß, don `t, ob dies der beste Ansatz ist, aber es war möglich, unter Verwendung des Codes zu überprüfen:

stage.addEventListener(MouseEvent.MOUSE_DOWN, setmousepos); 
brose_trigger.addEventListener(MouseEvent.MOUSE_UP, broseTrigger); 
denso_trigger.addEventListener(MouseEvent.MOUSE_UP, densoTrigger); 
honda_trigger.addEventListener(MouseEvent.MOUSE_UP, hondaTrigger); 

var mousePos: Point = new Point(); 

function setmousepos(e:MouseEvent): void { 
    mousePos.x = mouseX; 
} 

function broseTrigger(e:MouseEvent): void { 
    if(mousePos.x == mouseX){ 
     MovieClip(this.parent).gotoAndPlay(1, "Main"); 
    } 
} 

function densoTrigger(event:MouseEvent): void { 
    if(mousePos.x == mouseX){ 
     MovieClip(this.parent).gotoAndPlay(1, "Main"); 
    } 
} 

function hondaTrigger(event:MouseEvent): void { 
    if(mousePos.x == mouseX){ 
     MovieClip(this.parent).gotoAndPlay(1, "Main"); 
    } 
} 

Wenn MOUSE_DOWN Ereignis ausgelöst wird, ich die mouse.x Position in einer Variablen speichern, danach im MOUSE_UP Ereignis, ich vergleiche die gespeicherte Position mit der tatsächlichen Position, wenn gleich, TÃDÃ!

Verwandte Themen