ต่อเรื่อง hitTest()
ด้วยความอยากลอง จำลองหาวิธีทำ hitTest() ให้มันตรวจด้วยรูป shape ทั้งสองฝ่าย
ปรากฎว่า
ไม่ได้ (หรือป่าว ) มันทำได้แค่
- ฝ่ายแรก เป็นรูปทรง
- ฝ่ายที่สอง ต้องเป็นจุด x,y
( หรือกลับกัน )
จึงใช้วิธีแบบนี้แทน
- ฝ่ายแรก เป็นรูปทรง
- ฝ่ายที่สอง ต้องเป็นจุด x,y หลายๆจุด ( ขอเรียก sensor แล้วกันนิ )
โดยวิธียังมั่วๆอยู่นิดหน่อย และมั่วต่อๆมาอีกจึงรู้มาอีกว่า
ดูภาพนะ
ในภาพเป็น main_mc
ที่มี sub_mc อยู่ข้างในพิกัด(ภายใน)ของ sub_mc คือ _x = 14 , _y = 0
มันจะเห็น main_mc เป็นรูท ( อธิบายยากแฮะ
) ขอเรียกว่ามันอิง local นะ
ไม่ว่าเราจะเรียกค่าพิกัด sub_mc._x , sub_mc._y เมื่อไร
มันจะเป็น x = 14 , _y = 0 แม้ว่า main_mc._x , y จะอยู่ที่ไหนในโลก
ปัญหาที่ผมเจอคือผมลองทำ sensor เป็น mc หลายๆ ตัว
อยู่ใน main_mc อีกที เพื่อไว้เป็นจุดเช็ค hitTest
แต่เมื่อเช็คเป็นจุด แต่ค่าพิกัดมัน local อยู่ ซึ่งอิงอยู่ใน main_mc ( ไม่ว่าจะเลื่อน main_mc ไปไหน ค่า sub_mc._x , y ก็ไม่เปลี่ยน)
จึงต้องทำค่าให้มันอิงกับ _root หลักก่อนโดย
public localToGlobal(pt:Object) : Void
// Converts the pt object from the movie clip's (local) coordinates to the Stage (global) coordinates.
อธิบายได้ว่า Converts the pt object from the movie clip's (local) coordinates to the Stage (global) coordinates.
ครับ
ก็ตามนั้นนะครับ ถ้ายังไม่เข้าใจก็....
จาร์ก่อ มาอธิบาย localToGlobal(pt:Object) ง่ายๆหน่อยสิครับ เอาวิธีใช้ง่ายๆด้วยนะครับส่วนวิธีใช้ ยัง งงๆ อยู่ครับ แต่พอเข้าใจ ( เอ๊ะยังไง ) คือ ส่วนนี้ยังลอกวิธีเขามานิดหน่อย ( ขอข้ามไปนะ ให้จารย์ก่อมาอธิบาย)
จึงสรุปได้ว่า
ผมใช้วิธีวาง mc หลายๆตัว เป็น sensor ในการเช็ค hitTest แบบนี้ครับ
แล้วเรียงชื่อ ลูปเช็คครับ ( ยิ่งเยอะ ยิ่งละเอียด) ผมลองใช้ 20 จุด
โค้ด เกินอนุบาลไปนิดเดียวเองครับ ลองดู
ufo_mc.onPress = function() {
this.startDrag();
_root.onEnterFrame = function() {
for (i=1; i<=20; i++) {
this["point"+i] = {x:ufo_mc["chkmc"+i]._width/2, y:ufo_mc["chkmc"+i]._height/2};
ufo_mc["chkmc"+i].localToGlobal(this["point"+i]);
if (plan_mc.hitTest(this["point"+i].x, this["point"+i].y, true)) {
txt.gotoAndPlay(2)
}
}
};
};
ufo_mc.onRelease = function() {
delete _root.onEnterFrame;
this.stopDrag();
};
http://img3.f0nt.com/flash/0f9f4910a9382528b2ced40e504880b6.swfทีนี้ก็สามารถเช็คละเอียดๆ ได้แล้วครับ
แต่ อันนี้ดูเป็นแนวนะครับ โค้ดนี้ใช้งานจริงยังไม่ได้นะครับ
มันจะทำงานหนึ่งครั้ง ต่อ 1 sensor หาก โดนทั้ง 20 sensor ก็จะทำงาน 20 ครั้งครับ
จริงๆน่าจะลูปเก็บเป็นอาเรย์ครั้งเดียวดีกว่า หรือใครคิดออกเอามาแจมเลยครับ ตอนนี้หมดมุขแล้ว
เขียนๆทำๆไว้ก่อนไว้มาอ่านทีหลังจะได้ไม่ลืม