2012-12-15 5 views
6

Ich versuche, zu bestimmen, wann ein fabric.Rect anderen fabric.Rect überlappt, während die Beobachtung ‚Objekts: Bewegen‘ Ereignis, sondern mit inkonsistenten Ergebnissen zwischen fabric.Group vs fabric.RectFabricjs intersectsWithObject Rückkehr falsch, wenn Objekt ist fabric.Rect

als ich Gruppe über eine Rect Beispiel bewegen die intersectsWithObject Methode true zurückgibt, aber wenn ich eine Rect Instanz über eine andere Rect Instanz bewegt wird false zurückgegeben.

Ich frage mich, wenn ich falsch liege hier etwas zu tun.

Hier ist meine Event-Handler

cvs.observe('object:moving', function(e) { 

    var targ = e.target; 

    // filter out itself 
    var items = cvs.getObjects().filter(function(o){ 
     return targ !== o; 
    }); 

    var hit = false; 

    for (var i = 0, n = items.length; i < n; i++) { 
     var m = items[i]; 

     if (targ.type == "group") { 
      if (targ.intersectsWithObject(m)) { 
       targ.setFill("red"); 
       hit = true; 
       console.log("GROUP HIT"); 
      } else { 
       if (!hit) { 
        targ.setFill("#CCCCCC"); 
       } 
      } 
     } 
     else { 
      // this is always returning false! why? 
      if (targ.intersectsWithObject(m)) { 
       var id = m.data ? m.data.entityId : " ??" 
       console.log("OBJECT HIT:" + id); 
       targ.setFill("red"); 
      } 
     } 
    } 
}); 

ich eine Geige erstellt haben. Versuchen Sie, zwei oder mehr Blöcke auszuwählen, um sie zu gruppieren. Sie werden sehen, das gruppierte Objekt rot, wenn es über eine andere fabric.Rect oder fabric.Group Instanz gezogen wird. Wenn Sie einen einzelnen Rect über einen anderen fabric.Object jeder Art ziehen, wird es nie rot wie intersectsWithObject immer false zurückkehrt ...

http://jsfiddle.net/cyberpantz/9MkYJ/27/

Antwort

7

ich, dass explizit gefunden myObj.setCoords() aufrufen vor Der Aufruf von myObj.intertersectsWithObject (otherObj) behebt das Problem.

ich die Geige hier aktualisiert http://jsfiddle.net/cyberpantz/9MkYJ/29/

Es scheint, dass fabric.Rect Koordinaten nicht automatisch aktualisiert werden, während es bewegt wird, während fabric.Group Koordinaten sind, obwohl ich hier off-base sein könnte ...

Aktualisiert (und vereinfacht) Code

cvs.observe('object:moving', function(e) { 

    var targ = e.target; 

    // this fixes it 
    targ.setCoords(); 

    var items = cvs.getObjects().filter(function(o){ 
     return targ !== o; 
    }); 

    var hit = false; 

    for (var i = 0, n = items.length; i < n; i++) { 
     var m = items[i]; 

     if (targ.intersectsWithObject(m)) { 
      targ.setFill("red"); 
      hit = true; 
     } 
     else { 
      if (!hit) { 
       targ.setFill("#CCCCCC"); 
      } 
     } 
    } 
}); 
+0

setCoords() tut es, großartig! – cincplug