2014-02-14 82 views
1

我有一個循環來查看給定的形狀是否與KineticJS程序中的任何其他形狀發生碰撞。下面是僞代碼的情況唯一標識KineticJS形狀

function hasCollision(shape, index) { 
    var children = layer.children; 
    for(var i = 0, l = children.length; i < l; i++) { 
     if(i === index) continue; // Only check other shapes 
     if(collision(shape, children[i])) 
      return true; 
    } 
    return false; 
} 

我不喜歡這種方式,我必須保存在某個地方的指數每個形狀在我的代碼。此外,如果我從數組中刪除元素,代碼將會中斷。

我閱讀文檔,找不到任何關於比較形狀等,但我可能忽略了一些東西。 KineticJS是否已經有了唯一識別/比較形狀實例的方法?如果沒有,可以將自定義數據附加到節點上嗎?它會繼續使用序列化嗎?這樣做可能會破壞當前或未來版本的KineticJS?

編輯:要清楚,這是我考慮

shape.uid = uid_factory++; 

... 

function hasCollision(shape) { 
    var children = layer.children; 
    for(var i = 0, l = children.length; i < l; i++) { 
     var other = children[i]; 
     if(other.uid === shape.uid) continue; // Only check other shapes 
     if(collision(shape, other)) 
      return true; 
    } 
    return false; 
} 

回答

1

是解決方案。

可以分配一個唯一的ID任何動力學節點(形狀,文本等):

var shape123 = new Kinetic.Circle({ 
    id:(nextShapeId), 
    ... 

,你可以得到的任何節點的ID是這樣的:

anyNode.getId(); 

而且你可以問讓你參考這個節點的階段是這樣的:

// use stage.find to fetch all nodes with an id == theId 

var nodes = stage.find("#"+theId); 

// nodes is a collection, so grab the first element 

var myNode = nodes[0]; 
+0

\ * Derp \ *。非常感謝。 – acbabis