
หลายคนที่เขียนเกมด้วยแฟลชมันจะมีปัญหาหนึ่งที่ต้องคำนึงถึงอยู่เสมอ นั่นก็คือ การระบุพิกัดของวัตถุ
การระบุพิกัดนั้น เนื่องมาจากว่า วัตถุ เช่น MovieClip มักจะมีวัตถุซ้อนอยู่ภายในอีกทีหนึ่ง
ซึ่งวัตถุที่อยู่ภายใน ก็จะระบุพิกัดแกน x และแกน y โดยอ้างอิงจากวัตถุที่บรรจุตัวมันอยู่
ตามภาพประกอบด้านล่าง
จากภาพ MovieClip B ซึ่งอยู่ภายใน MovieClip A อีกทีหนึ่ง
เมื่อเราเขียนโค้ดเพื่ออ่านค่าพิกัด x,y ของ MovieClip B จะพบว่า ค่าที่ได้จะเป็นค่าพิกัดที่อ้างอิงจากตัวแม่ของมันเสมอ
โดยอิงจากจุด Registration ของ MovieClip A
พิกัดในรูปแบบนี้ จะเรียกว่า Local Coordinates
เป็นรูปแบบปรกติของแฟลช พิกัดแบบนี้ง่ายต่อการอ้างอิงมาก ถ้าเรานึกถึงว่าในโลกจริงๆของเรา เราอ้างอิงว่า ตัวเราอยู่ที่ใด เราเองก็จะระบุตำแหน่งตัวเราเป็น Local Coordinates เช่นกัน เช่น “ผมอยู่บนห้องนอน ครับแม่ “ คงไม่มีใครบอกแม่ว่า ผมอยู่ที่ xxxลิปดา xxxx ฟิลิปดา ครับแม่
ข้อดีของมันก็คือ เราสามารถควบคุมตำแหน่งของ MovieClip B ได้โดยง่าย ตามภาพ หากต้องการให้ MovieClip B อยู่ในตำแหน่ง 50×50 พิกเซลภายใน MovieClip A จะสามารถสั่งงานได้โดยง่าย โดยไม่ต้องคำนึงว่า MovieClip A นั้นอยู่ตำแหน่งใดบน Stage
แต่สำหรับบางกรณีที่เราต้องการทราบว่า MovieClip B นั้นมีพิกัดเท่าไร โดยอ้างอิงจาก Stage เช่นการเช็คการชนกันของวัตถุในเกม หรือการคุมตำแหน่งต่างๆ เราอาจจะพบปัญหาว่าจะต้องคำนวนตำแหน่งของ MovieClip A ร่วมด้วย
โดยจากภาพ MovieClip A อยู่ที่พิกัด 500×150 pixel
ดังนั้น เราอาจจะต้องคำนวนด้วยสูตร
coordX = A.x+A.B.x ;
coordY = A.y+A.B.y;
เพื่อหาตำแหน่งของ MovieClip B ต่อ Stage
พิกัดแบบนี้ก็คือ Global Coordinates ถ้าจะเทียบกับโลกแห่งความเป้นจริง ก็คงเป็นการระบุพิกัดบนโลก ลิปดา ฟิลิปดา
แต่จะว่าไปแล้ว พิกัดบนโลก ก็อาจจะยังมองเป็น Local ได้ เพราะว่า เราอาจจะต้องอิงไปยังตำแหน่งบนจักรวาล ใช่ไหมครับ (อันนี้ก็อาจจะไกลไป)
สำหรับการแปลงพิกัด กลับไปกลับมา ก็คงอาจจะปวดหัวไม่น้อย แต่สำหรับ ActionScript 3.0 แล้วเรามีคำสั่งแปลง ง่ายๆครับ
import flash.geom.Point;
var bPoint:Point = new Point(A.B.x, A.B.y);
var coord:Point = A.localToGlobal(bPoint);
trace(coord);
โดยเราจะใช้ Point ชี้ไปที่พิกัดของ B ก่อน แล้วจึงใช้ Method localToGlobal
เพื่อแปลงพิกัดจาก Local ไปเป็น Global
และ
import flash.geom.Point;
var StagePoint:Point = new Point( 200 , 200);
var coord:Point = A.globalToLocal(StagePoint);
trace(coord);
เป็นการใช้งาน Methode globalToLocal แปลงพิกัดจาก Stage มาระบุว่า เป็นตำแหน่ง Local ใดบน MovieClip A
ถ้ามีคำถามโพสไว้นะครับ
ถ้าไม่ค่อยได้เข้ามาเช็ค comment แนะนำให้ Register แล้วผมได้มาตอบเมื่อไหร่จะส่ง Email กลับไปหาครับ



ช่วยยกตัวอย่างให้ด้วยครับ อ่านแล้วงงๆนิดหน่อย
ต้องถามว่า เคยทำ MovieClip ซ้อน MovieClip หรือเปล่าครับ
ถ้าเคยต้องถามว่า เคยลองเขียนใช้งาน หรือควบคุมตำแหน่ง MovieClip ตัวข้างในหรือเปล่า
เราจะพบว่า ตัวข้างใน พิกัดจะอ้างอิงจากตัวหลักที่บรรจุมันอยู่
เคยเขียนครับ กำลังสงสัยว่า เวลาใช้งาน Point ครับ เราจะไปใช้ยังไงครับ
Point คือตัวไว้บอกตพแหน่งครับ
//เริ่มแรก import มาก่อน
import flash.geom.Point;
//ต่อมา ระบุ Pont จุด x=200 y=200
var StagePoint:Point = new Point( 200 , 200);
//ค้าหาว่า พิกัด 200,200 บน Stage นั้นอยู่จุดใด บนตัว A
var coord:Point = A.globalToLocal(StagePoint);
แสดงค่าที่คำนวนได้
trace(coord.x );
trace(coord.y );
จะได้ Pont x และ y ครับ บอกว่า พิกัดบน stage อยู่ตรงจุดไหนบนตัว A
ในทางตรงข้ามกัน คำสั่ง localToGlobal ก็จะใช้พิกัดจาก A ไปอิงบน Stage ว่าอยู่จุดไหนบน Stage
ขอบคุณครับ พอจะเข้าใจแล้วครับ ติดตรงทีผมเขียน AS3 ไม่เป็น 555 (อัพเดทบ่อยๆนะครับ ผมแอบดูความรู้อยู่)
ขอบคุณสำหรับข้อมูลครับ