อัปเดต: อัลกอริทึมการเรนเดอร์แผนที่ที่ถูกต้อง, เพิ่มภาพประกอบมากขึ้น, เปลี่ยนรูปแบบ
บางทีความได้เปรียบของเทคนิค "ซิกแซก" สำหรับการทำแผนที่กระเบื้องไปที่หน้าจออาจกล่าวได้ว่าการเรียงตัวของกระเบื้องx
และy
พิกัดนั้นอยู่ในแกนตั้งและแนวนอน
วิธีการ "วาดภาพในเพชร":
โดยการวาดแผนที่แบบวาดภาพสามมิติโดยใช้ "การวาดในเพชร" ซึ่งฉันเชื่อว่าหมายถึงเพียงการแสดงผลแผนที่โดยใช้ซ้อน - for
ห่วงเหนืออาร์เรย์สองมิติเช่นตัวอย่างนี้:
tile_map[][] = [[...],...]
for (cellY = 0; cellY < tile_map.size; cellY++):
for (cellX = 0; cellX < tile_map[cellY].size cellX++):
draw(
tile_map[cellX][cellY],
screenX = (cellX * tile_width / 2) + (cellY * tile_width / 2)
screenY = (cellY * tile_height / 2) - (cellX * tile_height / 2)
)
ความได้เปรียบ:
ข้อดีของวิธีนี้คือมันใช้งานได้ง่าย for
มีตรรกะไปข้างหน้าค่อนข้างตรงไปตรงมาซึ่งทำงานได้อย่างต่อเนื่องตลอดทั้งแผ่นกระเบื้อง
ข้อด้อย:
ข้อเสียอย่างหนึ่งของวิธีการนี้คือx
และy
พิกัดของแผ่นกระเบื้องบนแผนที่จะเพิ่มขึ้นในแนวเส้นทแยงมุมซึ่งอาจทำให้ยากต่อการมองเห็นตำแหน่งบนหน้าจอไปยังแผนที่ที่แสดงเป็นอาร์เรย์:
อย่างไรก็ตามจะมีข้อผิดพลาดในการใช้โค้ดตัวอย่างด้านบน - ลำดับการเรนเดอร์จะทำให้กระเบื้องที่ควรจะอยู่ด้านหลังไทล์บางอันถูกลากไปด้านบนของไทล์:
ในการที่จะแก้ไขปัญหานี้คำสั่งภายในfor
-loop จะต้องถูกกลับรายการ - เริ่มจากมูลค่าสูงสุดและแสดงไปยังค่าที่ต่ำกว่า:
tile_map[][] = [[...],...]
for (i = 0; i < tile_map.size; i++):
for (j = tile_map[i].size; j >= 0; j--): // Changed loop condition here.
draw(
tile_map[i][j],
x = (j * tile_width / 2) + (i * tile_width / 2)
y = (i * tile_height / 2) - (j * tile_height / 2)
)
ด้วยการแก้ไขข้างต้นการแสดงผลของแผนที่ควรได้รับการแก้ไข:
วิธีการ "ซิกแซก"
ความได้เปรียบ:
บางทีข้อดีของวิธีการ "ซิกแซก" คือแผนที่ที่เรนเดอร์อาจดูเหมือนจะเล็กกว่าแนวตั้งเล็กน้อยกว่าวิธี "ไดมอนด์":
ข้อด้อย:
จากการพยายามใช้เทคนิค zig-zag ข้อเสียอาจเป็นว่ามันยากกว่านิดหน่อยในการเขียนรหัสการเรนเดอร์เพราะมันไม่สามารถเขียนได้อย่างง่ายเหมือนซ้อนกัน - for
ลูปเหนือแต่ละองค์ประกอบในอาเรย์:
tile_map[][] = [[...],...]
for (i = 0; i < tile_map.size; i++):
if i is odd:
offset_x = tile_width / 2
else:
offset_x = 0
for (j = 0; j < tile_map[i].size; j++):
draw(
tile_map[i][j],
x = (j * tile_width) + offset_x,
y = i * tile_height / 2
)
นอกจากนี้อาจเป็นเรื่องยากเล็กน้อยที่จะพยายามคิดหาพิกัดของไทล์เนื่องจากลักษณะของลำดับการเรนเดอร์:
หมายเหตุ: ภาพประกอบที่รวมอยู่ในคำตอบนี้ถูกสร้างขึ้นด้วยการนำ Java มาใช้ของรหัสการเรนเดอร์ที่แสดงโดยมีint
อาร์เรย์ต่อไปนี้เป็นแผนที่:
tileMap = new int[][] {
{0, 1, 2, 3},
{3, 2, 1, 0},
{0, 0, 1, 1},
{2, 2, 3, 3}
};
ภาพย่อยคือ:
tileImage[0] ->
กล่องที่มีกล่องด้านใน
tileImage[1] ->
กล่องดำ
tileImage[2] ->
กล่องสีขาว
tileImage[3] ->
กล่องที่มีวัตถุสีเทาสูงอยู่ในนั้น
หมายเหตุเกี่ยวกับความกว้างและความสูงของกระเบื้อง
ตัวแปรtile_width
และtile_height
สิ่งที่ใช้ในตัวอย่างโค้ดข้างต้นอ้างถึงความกว้างและความสูงของการเรียงต่อกันในภาพที่แสดงถึงการเรียงต่อกัน:
การใช้ขนาดของภาพจะใช้งานได้ตราบใดที่ขนาดภาพและขนาดกระเบื้องตรงกัน มิฉะนั้นแมปกระเบื้องอาจถูกแสดงด้วยช่องว่างระหว่างแผ่น