2012-12-15 7 views
6

Próbuję określić, kiedy fabric.Rect nakłada się na inną tkaninę.Sprawdź podczas obserwowania zdarzenia "object: moving", ale o niespójnych wynikach między fabric.Group a fabric.RectFabricwy przecinaWithObject powraca false, gdy Object jest fabric.Rect

Po przeniesieniu grupy przez instancję Rect metoda intersectsWithObject zwraca wartość true, ale gdy przenosisz instancję Rect na inną instancję klasy Rect, funkcja zwraca wartość false.

Zastanawiam się, czy robię coś złego tutaj.

Oto mój obsługi zdarzeń

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"); 
      } 
     } 
    } 
}); 

Utworzyłem skrzypce. Spróbuj wybrać dwa lub więcej bloków, aby je pogrupować. Zobaczysz, że zgrupowany obiekt zmienia kolor na czerwony, gdy zostanie przeciągnięty na inną instancję fabric.Rect lub fabric.Group. Po przeciągnięciu jeden Rect nad innym fabric.Object dowolnego typu, nigdy nie stanie się czerwony jak intersectsWithObject zawsze zwraca false ...

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

Odpowiedz

7

Okazało się, że przez jawne wywołanie myObj.setCoords() przed Wywołanie metody myObj.intersectsWithObject (otherObj) rozwiązuje problem.

zaktualizowałem skrzypce tutaj http://jsfiddle.net/cyberpantz/9MkYJ/29/

Wydaje się, że współrzędne fabric.Rect nie są aktualizowane automatycznie, gdy jest on przesuwany, gdy współrzędne fabric.Group są, choć mogę być off-bazy tutaj ...

Poprawiony (i uproszczony) Kod

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() robi to świetnie! – cincplug

Powiązane problemy