2016-03-28 167 views
0

一旦圓圈接觸矩形,矩形應該是alpha = 0.1。但如果陳述不起作用。它變爲0.1不透明而沒有擊中flash cc createjs hittest作品沒有命中

/* js 

var circle = new lib.mycircle(); 
stage.addChild(circle); 

var rect = new lib.myrect(); 
stage.addChild(rect); 
rect.x=200; 
rect.y=300; 

circle.addEventListener('mousedown', downF); 
function downF(e) { 
stage.addEventListener('stagemousemove', moveF); 
stage.addEventListener('stagemouseup', upF); 
}; 
function upF(e) { 

stage.removeAllEventListeners(); 
} 
function moveF(e) { 
circle.x = stage.mouseX; 
circle.y = stage.mouseY; 
} 

if(circle.hitTest(rect)) 
{ 
    rect.alpha = 0.1; 

} 
stage.update(); 
*/ 
+0

在這個演示中,hitTest只運行一次(在開始處)。這是用意嗎? – Lanny

+0

另外,您使用的是什麼版本的CreateJS?/* js */code語法來自相當舊版本的CreateJS Toolkit(與支持JavaScript代碼的Flash/Animate HTML5文檔格式相比) – Lanny

+0

我更新了最新的託管庫。沒有任何問題 。但是內涵就是讓代碼「在矩形碰觸它時,矩形應該變爲alpha 0.1 – Salma

回答

1

您使用hitTest的方式不正確。 hitTest方法不檢查對象到對象。它需要一個x和y座標,並確定在其自己的座標系中的點是否具有填充像素。

我修改你的榜樣,使之更加正確的,但它實際上並沒有做你期待什麼:

circle.addEventListener('pressmove', moveF); 
function moveF(e) { 
    circle.x = stage.mouseX; 
    circle.y = stage.mouseY; 
    if (rect.hitTest(circle.x, circle.y)) { 
     rect.alpha = 0.1; 
    } else { 
     rect.alpha = 1; 
    } 
    stage.update(); 
} 

要點:

  • 再介紹pressmove。它工作正常。
  • 移動圓圈更新以上的hitTest檢查。否則,您正在檢查上次顯示的位置
  • 將舞臺更新移至最後。它應該是你更新的最後一件事。但請注意,您可以將其完全移除,因爲您的HTML文件中的舞臺上有一個Ticker監聽器,它不斷更新舞臺。
  • 如果hitTest失敗,則添加else語句以將alpha恢復爲1。

然後,最重要的一點是我將hitTest改爲在矩形上。這基本上說:「在矩形內提供的x和y位置處是否有填充像素?」由於矩形邊界是-49.4, -37.9, 99, 76,當圓的座標位於這些範圍內時(這恰好在畫布的左上方時),這是正確的。如果你用我的代碼替換你的代碼,你可以看到這種行爲。

因此,爲了讓它更像你想要的,你可以做一些事情。

  1. 變換座標。使用localToGlobal,或只是作弊並使用localToLocal。這需要在圓圈中使用[0,0],並將該座標轉換爲矩形的座標空間。

實施例:

var p = rect.localToLocal(0, 0, circle); 
if (rect.hitTest(p.x, p.y)) { 
    rect.alpha = 0.1; 
} else { 
    rect.alpha = 1; 
} 
  • 不要使用則hitTest。使用getObjectsUnderPoint,傳遞圓的x/y座標,並檢查矩形是否在返回列表中。
  • 希望有所幫助。正如我在上面的評論中提到的,你不能做全形碰撞,只是點碰撞(一個物體上的一個點)。