การเรนเดอร์ Isometric และการเลือก?


23

ฉันกำลังมองหาสูตรในการพล็อต (หน้าจอโลก>) และตัวเลือกเมาส์ (หน้าจอโลก>) กระเบื้องสามมิติในโลกรูปเพชร สิ่งที่ฉันพยายามทำอยู่เสมอเป็นไปได้ วิธีปกติ / ถูกต้องในการทำเช่นนี้คืออะไร?


วิธีการที่แน่นอนและสูตรที่ใช้นั้นขึ้นอยู่กับรูปร่างของแผ่นกระเบื้องของคุณและอาจเป็นเพียงเล็กน้อยเกี่ยวกับวิธีการวาดแผนที่ของคุณ (คือ 0,0 ที่ด้านบนด้านล่างหรือด้านใดด้านหนึ่งของแผนที่) รายละเอียดเพิ่มเติม เกี่ยวกับปัญหาของคุณจะช่วย
thedaian

1
แผ่นต่อคือ 2: 1 (โดยเฉพาะ, 64x32) ระบบพิกัดไม่สำคัญเนื่องจากฉันกำลังเขียนโปรแกรมแก้ไข (0,0 ที่ด้านบนหรือซ้ายดูเหมือนจะสมเหตุสมผล)
mpnk121

สายเกินไปสำหรับคำถามและฉันยังไม่มีคำตอบที่สมบูรณ์ แต่มี Google Tech Talk ที่ดีมากในหัวข้อที่แม่นยำนี้ การตั้งค่าของพวกเขารวมถึงการเลือกส่วนที่ไม่โปร่งใสของรูปภาพที่กำหนดเอง (ใน javascript, ไม่น้อยกว่า) youtube.com/watch?v=_RRnyChxijA
Seth Battin

คำตอบ:


21

จากความคิดเห็นของคุณนี่คือรหัสที่ฉันใช้ในการแปลงไทล์ 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 มิติอยู่ดี


1
ขอขอบคุณ! - ใช้งานได้ดีสำหรับแผนที่แบน ตอนนี้คุณช่วยบอกฉันอีกเล็กน้อยเกี่ยวกับวิธีที่ฉันสามารถเพิ่มขนาด (โดยมีความลึก Z) ที่อยู่ในเลเยอร์อื่นโดยพลการ (เช่นอุปกรณ์ประกอบฉากเช่นหลุมหรือถนน)
mpnk121

2
นั่นคือเมื่อคุณใช้ค่า offsetY และ offsetX หากไฟถนนของคุณคือ 64x64 แสดงว่าผ่านไปเป็นลบ 32 สำหรับค่า offsetY ควรทำให้มันปรากฏในตำแหน่งที่ถูกต้อง หวังว่าจะเพียงพอสำหรับคุณในการเริ่มต้น
thedaian

6
พิกัดของคุณควรเป็น "2,1" ในตัวอย่างของคุณหรือไม่?
Chris
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.