ฉันกำลังมองหาสูตรในการพล็อต (หน้าจอโลก>) และตัวเลือกเมาส์ (หน้าจอโลก>) กระเบื้องสามมิติในโลกรูปเพชร สิ่งที่ฉันพยายามทำอยู่เสมอเป็นไปได้ วิธีปกติ / ถูกต้องในการทำเช่นนี้คืออะไร?
ฉันกำลังมองหาสูตรในการพล็อต (หน้าจอโลก>) และตัวเลือกเมาส์ (หน้าจอโลก>) กระเบื้องสามมิติในโลกรูปเพชร สิ่งที่ฉันพยายามทำอยู่เสมอเป็นไปได้ วิธีปกติ / ถูกต้องในการทำเช่นนี้คืออะไร?
คำตอบ:
จากความคิดเห็นของคุณนี่คือรหัสที่ฉันใช้ในการแปลงไทล์ x, ค่า y เป็นพิกัดหน้าจอ ตอนนี้มันไม่ได้คำนึงถึง "ไทล์ 3 มิติ" ทุกอย่างถือว่าอยู่ในระนาบเดียวกันดังนั้นหากคุณกำลังเขียนเกมที่มีความสำคัญรหัสนี้จะไม่ทำงาน
//this converts a map x/y coordinate into screen coordinates
//public, static method, so can be called outside the Tile object
point Tile::convertToScreen(int x, int y, int offsetX, int offsetY)
{
point screen;
//calculate the screen coordinates
//note: these will then be modified by the camera
screen.x = offsetX - (y * TILE_WIDTH/2) + (x * TILE_WIDTH/2) - (TILE_WIDTH/2);
screen.y = offsetY + (y * TILE_DEPTH/2) + (x * TILE_DEPTH/2);
return screen;
}
จุดเป็นเพียงโครงสร้างที่มี x และ y ints TILE_WIDTH จะเป็น 64 ในกรณีของคุณ TILE_DEPTH เป็นชื่อที่ไม่ดี (จริง ๆ แล้วมันเป็นความสูงของกราฟิกกระเบื้อง) แต่มันจะเป็น 32 ในกรณีของคุณ ออฟเซ็ตคือถ้าคุณต้องการให้แผนที่ย่อยของคุณ "เริ่มต้น" ที่ตำแหน่ง x, y ที่แตกต่างกัน (เช่นถ้าคุณต้องการให้ไทล์อยู่เหนือไทล์ชุดอื่น) โดยทั่วไปแล้วออฟเซ็ตสามารถเป็น 0,0
สิ่งนี้จะสร้างแผนที่ที่มี 0,0 ด้านบน, กลาง, เช่นนี้:
0,0
0,1 1,0
0,2 1,1 2,1
สำหรับการค้นหา tile x, y ของเคอร์เซอร์:
point selectedTile;
int x = mX - camera.x;
int y = mY - camera.y;
selectedTile.x = (y + x/2)/TILE_DEPTH;
selectedTile.y = (y - x/2)/TILE_DEPTH;
ในรหัสบิตนี้ mX และ mY เป็นพิกัดหน้าจอเมาส์ซึ่งเรารวมกับค่ากล้องเพื่อค้นหาว่าเราอยู่ที่ไหนใน "พิกัดโลก" ทุกอย่างอื่นจะเหมือนกับตัวอย่างรหัสก่อนหน้า
อีกครั้งนี้จะถือว่าแผนที่มีมิติเท่ากันแบบ 2 มิติของกระเบื้อง มีงานเพิ่มเติมถ้าคุณต้องการใช้มุมมองแบบสามมิติของแผนที่และสิ่งนี้ถือว่าคุณทำงานในแบบ 2 มิติอยู่ดี