Làm cách nào để xác định thứ tự bốc thăm trong trò chơi flash xem đẳng cự?


12

Đây là một trò chơi flash, với chế độ xem isometric. Tôi cần biết cách sắp xếp đối tượng để không cần kiểm tra bộ đệm z khi vẽ. Điều này có vẻ dễ dàng nhưng có một hạn chế khác, một cảnh có thể có hơn 10.000 đối tượng nên thuật toán cần được chạy trong ít hơn O (n ^ 2). Tất cả các đối tượng là các hộp hình chữ nhật, và có 3-4 đối tượng di chuyển trong cảnh. Cách tốt nhất để làm điều này là gì?

CẬP NHẬT

trong mỗi ô chỉ có một đối tượng (ý tôi là các đối tượng không thể xếp chồng lên nhau). và chúng tôi truy cập vào cả bản đồ của Đối tượng và Đối tượng có vị trí riêng.

CẬP NHẬT2

xem những số liệu sau:

nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây

trong đầu tiên một đối tượng màu xanh đầu tiên nên được vẽ sau đó màu xanh lá cây sau đó màu đỏ. trong khi ở cái thứ hai bạn phải vẽ chúng theo thứ tự ngược lại. bạn cần vẽ màu đỏ trước rồi đến màu xanh và cuối cùng là đối tượng màu xanh. như bạn có thể thấy không có sự khác biệt về vị trí của các vật thể màu xanh và đỏ, cả hai đều có khoảng cách khác với máy ảnh, v.v. nhưng vì vị trí tương đối của chúng với hộp màu xanh lá cây, bạn cần thay đổi thứ tự vẽ giữa hai hình ảnh. đó là những gì làm cho vấn đề này trở nên lộn xộn.

lưu ý phụ: vì tất cả các vật thể đều là hình lăng trụ hình chữ nhật, về mặt toán học có thể chứng minh rằng có ít nhất một lệnh vẽ để thỏa mãn nhu cầu vấn đề.


2
Bạn nên đăng thêm thông tin. Các đối tượng có thể ngăn xếp (3d)? Đối tượng có vị trí hay bản đồ có đối tượng? v.v.
kaoD


@Tetrad yeah, nhưng có một chút khác biệt về các đối tượng chúng ta đặt trong cảnh.
Ali1S232

Các đối tượng @Gajet (sau khi cập nhật) chỉ có thể là 1 * X và X * 1 hoặc X * Y? Bạn có thể đủ khả năng để phân chia các đối tượng trong một số đối tượng phụ? (giống như màu xanh lá cây là 4 đối tượng phụ màu xanh lá cây) Hướng của đối tượng có cố định không?
kaoD

Ngoài ra: có bao nhiêu gạch liền kề mà chiều cao của đối tượng của bạn bị che khuất?
kaoD

Câu trả lời:


8

Điều này thực sự rất đơn giản nếu các đối tượng của bạn khớp với các ô đẳng cự của bạn. Hãy nhìn vào hình ảnh này:

Trình tự vẽ Isometric

Trước tiên bạn nên vẽ đối tượng ở vị trí màu đỏ, sau đó là các đối tượng màu xanh lam, sau đó là màu xanh lá cây, sau đó là màu đỏ, sau đó là màu đỏ, v.v. có vị trí như một thuộc tính. Nếu đó không phải là trường hợp của bạn, bạn nên giữ một cấu trúc dữ liệu riêng biệt, cập nhật nó bất cứ khi nào một đối tượng di chuyển (điều này cũng khá dễ dàng.)

Điều này có một vấn đề mới: bạn có thể dễ dàng thấy mức độ phức tạp của nó là O (N) trong đó N là kích thước bảng của bạn ( N=W*H). Để khắc phục vấn đề này, chỉ cần tạo cấu trúc dữ liệu tuyến tính mới trong đó mỗi chỉ mục trong cấu trúc của bạn khớp với độ sâu nhất định, cập nhật nó bất cứ khi nào một đối tượng thay đổi độ sâu.

Trường hợp một đối tượng không khớp với một ô đơn sẽ khó hơn một chút, vì vậy tôi sẽ đăng nó nếu bạn cần ngay khi bạn cập nhật câu hỏi của mình.


thuật toán đó cũng là thuật toán đầu tiên xuất hiện trong đầu tôi, nhưng hãy xem cập nhật của tôi, đó là lý do tại sao bạn không thể sử dụng nó mà không thay đổi.
Ali1S232

1
@Gajet và đó là loại điều bạn phải đăng trong câu hỏi của bạn ở vị trí đầu tiên: P
kaoD

3
Đây là cách để đi, chia ra các phần lớn trong 'gạch' +1
Valmond

2

Tôi không có kiến ​​thức đặc biệt về chủ đề này, nhưng đây là một suy nghĩ.

Bắt đầu bằng cách đánh dấu mỗi ô là "không được vẽ". (Hoặc, tương ứng, sử dụng một mảng để biểu thị vị trí của vật "được vẽ" gần nhất trên mỗi "đường gần" của ô, hoặc một tập hợp, v.v.) Sau đó, cho mỗi ô (tôi có thể sẽ đi qua chúng trong thứ tự kaoD đã mô tả): kiểm tra xem ô đó đã được rút ra chưa; nếu nó chưa được vẽ và chứa một đối tượng, hãy kiểm tra xem mỗi ô có bị che khuất bởi đối tượng đó đã được vẽ hay không và nếu không vẽ nó một cách đệ quy; vẽ đối tượng chứa trong ô đó nếu cần thiết; và đánh dấu ô đó và bất kỳ ô nào bị chiếm bởi đối tượng của nó là "được vẽ".

Tôi giả sử rằng bạn có thể nhanh chóng ánh xạ một ô tới đối tượng bên trong nó, nếu có. Tôi tin rằng đây là thời gian O (n), mặc dù nó có thể kết thúc việc xây dựng một ngăn xếp lớn (mà bạn có thể muốn biến thành một danh sách được liên kết nếu bạn lo lắng về việc hết dung lượng ngăn xếp).

Nếu bạn thực sự cần một danh sách, bạn có thể thêm vào danh sách thay vì vẽ. Tôi nghi ngờ rằng bắt đầu với một danh sách được sắp xếp chủ yếu không giúp được gì.


Tôi tin rằng thuật toán này có thể được coi là một dạng sắp xếp tôpô thích nghi với vấn đề; Tôi chỉ định mơ hồ chỉ theo hướng đó. Topo sort là một giải pháp cho hầu hết các vấn đề đặt hàng / phụ thuộc.
Kevin Reid

1

Tôi sẽ sử dụng thuật toán của họa sĩ với khoảng cách taxi từ ô xa nhất ra khỏi máy ảnh, vẽ những cái gần máy ảnh nhất trước rồi sau đó di chuyển ra ngoài.

Chỉnh sửa: Điều này không hoạt động trừ khi bạn có thể vẽ nội dung của từng ô riêng lẻ.


điều này có thể hoạt động, nhưng tôi không thể biết nó khác với thuật toán byte56 hay kaoD như thế nào. Đối với tôi có vẻ như nó vẫn có vấn đề như được mô tả trong lần chỉnh sửa thứ hai của tôi.
Ali1S232

1

Điều gì khiến bạn tin rằng nó có thể chứng minh được về mặt toán học rằng có ít nhất một lệnh rút thăm để thỏa mãn nhu cầu về vấn đề? Đây là một ví dụ tầm thường mà bạn không thể dựa vào các đối tượng sắp xếp z:

nhập mô tả hình ảnh ở đây


Vì tò mò ... bạn có thể xây dựng ví dụ không? Đó không phải là một lưới.
kaoD

cũng lưu ý rằng chỉ có một đối tượng trên mỗi ô và đối tượng có thể chiếm một hoặc nhiều ô, nhưng chúng luôn có hình chiếu hình chữ nhật trên mặt phẳng. hai điều kiện này là đủ để chứng minh tuyên bố đó.
Ali1S232

Được rồi, với những hạn chế đó và thực tế là lưới phẳng có một giải pháp. Tôi sẽ đăng nó sau.
sam hocevar
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.