ฉันพบวิธีที่ง่ายและเป็นทางเลือกที่ใช้ตรรกะเดียวกับกระดานหมากรุกปกติ มันสร้างเอฟเฟ็กต์แบบสแน็ปอินถึงกริดโดยมีจุดอยู่ตรงกลางของทุกไทล์และทุกจุดสุดยอด (โดยการสร้างกริดที่แน่นขึ้น
วิธีนี้ใช้งานได้ดีสำหรับเกมเช่น Catan ที่ผู้เล่นโต้ตอบกับแผ่นกระเบื้องและจุดยอด แต่ไม่เหมาะกับเกมที่ผู้เล่นมีปฏิสัมพันธ์กับแผ่นกระเบื้องเท่านั้นเนื่องจากมันจะส่งกลับจุดกึ่งกลางหรือจุดสุดยอดที่ใกล้เคียงที่สุด พิกัดอยู่ภายใน
รูปทรงเรขาคณิต
หากคุณวางจุดในตารางที่มีคอลัมน์ที่มีความกว้างเป็นสี่ส่วนของไทล์และแถวที่มีความสูงครึ่งหนึ่งของไทล์คุณจะได้รูปแบบนี้:
หากคุณปรับเปลี่ยนรหัสเพื่อข้ามจุดทุกวินาทีในรูปแบบกระดานหมากรุก (ข้ามif column % 2 + row % 2 == 1
) คุณจะพบกับรูปแบบนี้:
การดำเนินงาน
เมื่อนึกถึงรูปทรงเรขาคณิตนั้นคุณสามารถสร้างอาเรย์ 2 มิติ (เช่นเดียวกับที่คุณใช้กับกริดสแควร์) เก็บx, y
พิกัดสำหรับแต่ละจุดในกริด (จากแผนภาพแรก) - ดังนี้:
points = []
for x in numberOfColumns
points.push([])
for y in numberOfRows
points[x].push({x: x * widthOfColumn, y: y * heightOfRow})
หมายเหตุ: ตามปกติเมื่อคุณสร้างกริดรอบจุด (แทนที่จะวางจุดที่จุดเอง) คุณจะต้องชดเชยจุดกำเนิด (ลบความกว้างครึ่งหนึ่งของคอลัมน์ออกจากx
และครึ่งความสูงของแถวจากy
)
ตอนนี้คุณมีอาร์เรย์ 2 มิติ ( points
) ที่เริ่มต้นแล้วคุณสามารถหาจุดที่ใกล้ที่สุดกับเมาส์ได้เช่นเดียวกับที่คุณทำบนสี่เหลี่ยมจัตุรัสโดยไม่ต้องละจุดอื่น ๆ เพื่อสร้างรูปแบบในแผนภาพที่สอง:
column, row = floor(mouse.x / columnWidth), floor(mouse.y / rowHeight)
point = null if column % 2 + row % 2 != 1 else points[column][row]
นั่นจะใช้งานได้ แต่พิกัดกำลังถูกปัดเศษไปยังจุดที่ใกล้ที่สุด (หรือไม่มีจุด) ตามสี่เหลี่ยมที่มองไม่เห็นตัวชี้อยู่ภายใน คุณต้องการโซนวงกลมรอบ ๆ จุด (ดังนั้นช่วง snap เท่ากับทุกทิศทาง) เมื่อคุณทราบว่าจุดใดที่ควรตรวจสอบคุณสามารถค้นหาระยะทางได้อย่างง่ายดาย (โดยใช้ทฤษฎีบทของพีธากอรัส) วงกลมโดยนัยจะยังคงต้องอยู่ภายในสี่เหลี่ยมขอบเขตเดิมโดย จำกัด เส้นผ่าศูนย์กลางสูงสุดไว้ที่ความกว้างของคอลัมน์ (ความกว้างของเศษกระเบื้อง) แต่ก็ยังใหญ่พอที่จะใช้งานได้ดีในทางปฏิบัติ