Trước tiên, bạn cần tổ chức lại việc đánh số các ô của mình trong bản đồ Isometric, việc xác định trục đẳng phương cùng với các ô xếp sẽ dễ dàng hơn nhiều.
Như thế này
Hãy xem hướng dẫn sau đây là hướng dẫn tốt nhất mà tôi tìm thấy trên Internet, có rất nhiều hướng dẫn toán học bản đồ đẳng cự trên web nhưng anh chàng này là một nhà tiên tri!
http://clintbellanger.net/articles/isometric_math/
như hướng dẫn nói rằng bạn có thể chuyển đổi tọa độ bản đồ thành tọa độ đẳng cự thông qua các phương trình sau
screen.x = (Isomap.x - Isomap.y) * TILE_WIDTH_HALF;
screen.y = (Isomap.x + ISomap.y) * TILE_HEIGHT_HALF;
vì các ô của bạn có chiều rộng và chiều cao bằng nhau thì dễ hơn một chút nhưng tôi đã sử dụng kích thước ô này: (36,24) có giao diện đẹp hơn, nhưng vị trí camera vẫn đủ cao để có thể xem tất cả các yếu tố trên bản đồ mà không bị chồng chéo
Tuy nhiên, công thức trên có thể cần phải thay đổi một chút vì nguồn gốc của hệ tọa độ gạch là điểm trên của ô đầu tiên từ trên xuống, nhưng bạn có thể sử dụng trung tâm của ô trên cùng làm gốc của mình, cá nhân tôi đã sử dụng phía dưới bên trái đỉnh MBB của ô trên cùng là gốc Vì vậy tôi phải dịch (di chuyển) nửa băng thông tọa độ, nửa sáng vì vậy đây là của tôi:
func project(Cartesian screen : CGPoint) -> CGPoint {
let TILE_WIDTH_HALF = (tileWidth / 2)
let TILE_HEIGHT_HALF = (tileHeight / 2)
let movedScreen = CGPointMake(-1, -1) * (screen - CGPointMake(tileWidth,tileHeight))
let mapx = ((movedScreen.x / TILE_WIDTH_HALF) + (movedScreen.y / TILE_HEIGHT_HALF)) / 2;
let mapy = ((movedScreen.y / TILE_HEIGHT_HALF) - (movedScreen.x / TILE_WIDTH_HALF)) / 2;
return CGPointMake(mapx+0.5, mapy+1.5)
}
Nếu bạn nhìn sâu hơn, bạn sẽ thấy rằng tôi đang đảo ngược Y trước và sau công thức biến đổi Bản đồ 2 vì trong iOs y tăng lên bằng cách đi lên trên màn hình nhưng trong hướng dẫn y sẽ hạ xuống bằng cách đi lên.
Vì vậy, nếu bạn đang viết trò chơi của mình cho một thiết bị di động, bạn cũng cần phải làm điều đó
Vào cuối chức năng của tôi, tôi đã thêm 0,5,1,5 vào hệ thống tọa độ gạch của mình.
Như bạn thấy, có một chút khó hiểu và tùy thuộc vào cách bạn đã vẽ các ô của mình và hướng tích cực của bạn lên hoặc xuống, bạn cần thay đổi công thức cơ bản trong hướng dẫn một chút. Xin lỗi vì tôi không thể cung cấp cho bạn phương trình chính xác nhưng tôi có thể chỉ cho bạn cách thực hiện. (tìm phương trình của riêng bạn)
viết công thức cơ bản nhưng thêm Tx và Ty vào cả hai phương trình, bạn cần tìm Tx và Ty là gì trong trường hợp của bạn. Để tìm hiểu những gì họ chỉ cần viết phương trình cho hai ô khác nhau (ví dụ: Ngói 0,1 và ô 1,1) như bạn đã làm trong câu hỏi của mình ở trên. sau đó bạn sẽ có một phương trình hoàn chỉnh
screen.x = (Isomap.x - Isomap.y) * TILE_WIDTH_HALF + Tx;
screen.y = (Isomap.x + ISomap.y) * TILE_HEIGHT_HALF+ Ty;
Và đây là mã ngược của tôi, nếu bạn so sánh nó với hướng dẫn, bạn sẽ thấy rằng nó cũng đã thay đổi một chút. và bạn phải tự tìm kiếm bằng kỹ năng bạn vừa đạt được ở trên.
func unproject (tileIndex tileIdx : CGPoint) -> CGPoint
{
let TILE_WIDTH_HALF = (tileWidth / 2) // 16
let TILE_HEIGHT_HALF = (tileHeight / 2) // 12
let screenX = TILE_WIDTH_HALF * (tileIdx.y - tileIdx.x + 1)
let screenY = 24 - TILE_HEIGHT_HALF * (tileIdx.x + tileIdx.y)
return CGPointMake(screenX, screenY)
}