Phát hiện va chạm Isometric


11

Tôi đang gặp một số vấn đề với việc cố gắng phát hiện sự va chạm của hai gạch đẳng cự.

Tôi đã thử vẽ các đường giữa mỗi điểm trên ô và sau đó kiểm tra các chặn dòng tuy nhiên nó không hoạt động (có thể do công thức không chính xác)

Sau khi xem xét điều này một lúc hôm nay tôi tin rằng tôi đang suy nghĩ nhiều về nó và phải có một cách dễ dàng hơn.

Tôi không tìm kiếm mã chỉ là một số lời khuyên về cách tốt nhất để đạt được sự phát hiện chồng chéo


4
Chính xác những gì bạn đang cố gắng để làm? Phát hiện khi chuột ở trên một ô, hoặc phát hiện nếu hai đơn vị chồng chéo? Nếu đó là sau này, bạn thực sự nên nghĩ về việc tách "trò chơi" của bạn khỏi "đồ họa"
John McDonald

Tôi cần phải làm cho nó khi cạnh của một viên gạch di chuyển chạm vào một viên gạch không di chuyển thì viên gạch đang di chuyển dừng lại. Điều duy nhất tôi gặp khó khăn là thử nghiệm va chạm. Tôi có thể sử dụng một hộp ràng buộc nhưng tôi cần sự va chạm là chính xác.
Chris phi hành đoàn

Câu trả lời:


23

Tôi sẽ đi thẳng ra và nói rằng tôi không biết cách giải quyết vấn đề mà bạn đã mô tả trong câu hỏi (phát hiện va chạm giữa các hình chữ nhật hình gạch), nhưng tôi có thể cho bạn biết những người khác đã giải quyết nó như thế nào trong quá khứ :

Cách thức thực hiện trong các trò chơi khác là tách thế giới trò chơi khỏi thế giới màn hình . Khi bạn bắt đầu, người ta thường tưởng tượng chúng giống nhau, nhưng sau đó nó sẽ dẫn đến những vấn đề giống như bạn đang mô tả.

Ý tưởng chung là thế giới trò chơi được lưu trữ hoàn toàn trong bộ nhớ, đằng sau hậu trường, đó chỉ là những con số, tài liệu tham khảo và logic. Việc bạn đang vẽ thế giới trò chơi bằng isometric là không liên quan. Thế giới trò chơi của bạn không nên có khái niệm đẳng cự, hoặc hình vuông hoặc ngay cả khi màn hình được vẽ dưới dạng 3D. Tất cả điều đó được quan tâm khi bạn vẽ thế giới trò chơi lên màn hình (hay còn gọi là thế giới màn hình ). Thế giới trò chơi nên được lưu trữ và duy trì theo cách đơn giản nhất có ý nghĩa đối với trò chơi, trong các trò chơi đẳng cự, bạn thường hoàn toàn bỏ qua thực tế rằng đó là iso và thay vào đó lưu trữ các vị trí như thể bạn đang sử dụng lưới được căn chỉnh theo trục. Hầu hết các trò chơi sẽ có phương thức chuyển đổi tọa độ giữa hai thế giới, tôi gọi là của tôi ScreenToWorld(x, y)WorldToScreen(x, y). Việc chuyển đổi thường được thực hiện với toán học Ma trận, nhưng có thể đạt được các cách khác. Bạn sẽ sử dụng ScreenToWorld khi bạn sử dụng chuột và WorldToScreen khi bạn vẽ.

Có một số lợi thế để phân chia thế giới trò chơithế giới màn hình . Một trong những lợi thế là phát hiện va chạm và chuyển động đều xảy ra trong thế giới trò chơi, và do đó thường khá đơn giản vì bạn không xử lý lưới nghiêng, hoặc tọa độ lệch, hoặc nơi có màn hình, v.v. , bạn sẽ xử lý các hình chữ nhật và hình vuông được căn chỉnh theo trục. Khi thế giới trò chơi đã được cập nhật, sau đó bạn vẽ một đại diện của thế giới trò chơi lên màn hình, từ khóa: đại diện. Thoạt nhìn có vẻ phản trực giác, nhưng màn hình của bạn chỉ là đại diện cho những gì đang diễn ra trong thế giới trò chơi. Điều này làm cho những thứ như máy chủ chuyên dụng và máy khách giống như thiết bị đầu cuối có thể.

FreeCiv thực sự là một ví dụ tuyệt vời về tất cả những điều này. Bạn có thể xem thế giới chính xác giống như bất kỳ thế giới nào: Lưới Bắc / Nam vuông, Isometric hoặc thậm chí Hex. Mỗi trò chơi bạn chạy đều có một máy chủ chuyên dụng chạy trong nền, ngay cả đối với các trò chơi một người chơi, do đó, máy khách cũng chỉ là một cổng hiển thị, không có gì hơn.

Câu chuyện dài: Tách thế giới trò chơi và logic khỏi thế giới màn hình giúp đơn giản hóa logic trò chơi, giảm trò chơi <-> khớp nối hiển thị và lần lượt giúp phát hiện va chạm giữa các ô "iso" dễ xử lý và dễ hình dung hơn.


Cảm ơn câu trả lời được giải thích rõ ràng, tôi đã phân tách logic trong những gì được vẽ và những gì đang xảy ra trong nền nhưng tôi đã coi mọi thứ như một lưới nghiêng.
Chris phi hành đoàn

1
Đối với những người của tương lai; đồ họa là một giải thích dữ liệu. Bốn phần chính của một trò chơi: logic, dữ liệu, đầu vào, đầu ra. Tránh gộp chúng lại với nhau. Ngoài ra, phản hồi tuyệt vời John, +1
Aarowaim

9

Câu trả lời của John hoàn toàn đúng, nhưng tôi sẽ cố gắng giải thích nó theo một cách khác:

Không có phát hiện va chạm đẳng cự.

Phát hiện va chạm không quan tâm ma trận chiếu / biến đổi của bạn trông như thế nào. Phát hiện va chạm sẽ không thành vấn đề nếu bạn kết xuất mọi thứ (sau tất cả, các vật thể ở ngoài màn hình vẫn có thể va chạm, phải không?)

Đó là một câu hỏi triết lý hơn: Liệu một cái cây rơi xuống trong rừng vẫn thực sự va chạm với mặt đất khi không có ai ở đó?

Sự khôn ngoan thông thường sẽ nói: Có. Không quan trọng bạn nhìn nó như thế nào. Mọi thứ va chạm trong không gian thế giới, không phải không gian xem.


2
+1 Đặt tốt. "Không có phát hiện va chạm đẳng cự"
John McDonald

1
Cảm ơn, tôi chỉ nói những gì bạn nói rồi. Nhưng hơi khác một chút.
MarkR

0

Bạn có thể thử phân bổ một mảng pixel kết hợp một bitmap của từng giá trị getRGB () của từng pixel riêng lẻ. Hơn so sánh các giá trị với một câu lệnh if vì các đường viền của gạch là một giá trị màu riêng biệt hơn so với giá trị của gạch (nước, cát, cỏ). Đó là cho một lưới isometric cơ bản. Hoặc bạn có thể có hai lớp bản đồ. Một lớp có chứa giống như một màn hình màu xanh lá cây vẽ đường viền của mỗi đại diện của một vật thể va chạm và lớp kia sẽ là bản đồ.

Bạn không soạn một mảng bitmap của từng pixel của lớp bản đồ thay vào đó bạn muốn tính toán một tập hợp các màu đại diện cho các hiệu ứng mà nó có khi một đối tượng va chạm / cắt đường viền của giá trị màu duy trì. Hoặc bạn muốn các giá trị giảm giá trị hoặc tăng vận tốc trong đó đối tượng đang di chuyển. Mỗi đối tượng di chuyển chỉ là một bản sao của bộ nhớ được lưu trữ ở một vị trí khác nhau.

Tôi sẽ xem xét sự va chạm hoàn hảo của pixel và sự hiểu biết về mảng bitmap. Mỗi hình chữ nhật là một giới hạn chứa dữ liệu sao chép giống như bộ nhớ được in, mỗi sự kiện được kích hoạt tùy thuộc vào nơi mà một đối tượng được hiển thị trong một vị trí hoặc vectơ. Mọi điểm trên màn hình chỉ nằm trên mặt phẳng 2D mà độ sâu của bóng cung cấp ảo ảnh rằng đối tượng thể hiện chính nó là 3D. Sự biến đổi của các hình dạng trong một cái xiên cho nó cảm giác vật thể ở một góc. Có một điểm trung tâm nơi máy ảnh trình bày nó xem mọi thứ được mang theo xung quanh điểm trung tâm này di chuyển ra khỏi nó giảm kích thước hoặc di chuyển đến gần nó tăng kích thước.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.