Làm thế nào để tôi đại diện cho các viên đạn trong một trò chơi video?


14

Tôi đang làm một game bắn súng cố định đơn giản, tương tự như "Galaga" ,) như một phần của bài thuyết trình tôi đang làm. Tôi đang tự hỏi những chiến lược và cấu trúc dữ liệu nào mà mọi người sẽ sử dụng để theo dõi các viên đạn, như tia laser được bắn ra từ tàu vũ trụ. Một cách thực hiện siêu đơn giản mà trước đây tôi đã sử dụng là chỉ đại diện cho mỗi viên đạn như một điểm và kiểm tra va chạm với tất cả các đối tượng trong cảnh.

Tuy nhiên, điều này có vẻ tốn kém, trong những cảnh lớn với nhiều viên đạn; Tôi đang tự hỏi những loại chiến lược hoặc triển khai nào khác được sử dụng cho loại trường hợp sử dụng này. Những trò chơi như FPS sử dụng để theo dõi đạn (đạn, đạn xe tăng, v.v.) là gì?


5
Rất nhiều game FPS cho rằng đạn là tức thời, nhưng có những game tính toán quỹ đạo và thời gian di chuyển.
John McDonald

2
+1 đây là một câu hỏi hay và tôi cũng sẽ không giới hạn ở mức 3d.
tro999

Câu trả lời:


8

Đối với rất nhanh (như laser hoặc đạn), bạn có thể sử dụng, một tia .

Một tia có điểm bắt đầu và điểm kết thúc. Cấu trúc dữ liệu (rất tối thiểu) cho một tia là:

struct Ray
{
  Vector3f start, end ;
} ;

Trông như thế này:

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

(Bạn cũng có thể lưu trữ vectơ chỉ đường và độ dài, nhưng tôi đã sử dụng một defn rất đơn giản ở trên).

Nếu tia sáng là chùm tia laser truyền đi với tốc độ ánh sáng, bạn sẽ chỉ duy trì tia sáng (như bắt đầu từ vòi súng và kết thúc trên một bức tường ở đâu đó) trong một vài khung hình. Bất cứ điều gì giao nhau với tia mỗi khung hình đều bị hư hại.

Nếu tia là một viên đạn chậm hơn (ví dụ như viên đạn), thì quãng đường viên đạn đi qua dấu thời gian được mô hình hóa bởi tia. Điểm bắt đầu là nơi tia nằm ở đầu khung và điểm cuối là nơi tia sẽ ở sau khi khung được hoàn thành. Bất cứ thứ gì cản đường của viên đạn đều bị viên đạn làm hỏng.

Tia có thể được va chạm hiệu quả với các quả cầu, aabbs, vỏ lồi, v.v. Hãy xem dự án Hullinator của tôi để biết chương trình đang chạy thực tế (CTRL + Nhấp để bắn tia)


1
Một tia không hoạt động rất tốt cho nhiều đạn. Ví dụ, bất kỳ đạn nào có thể được thùy, như vỏ đạn. Tia là tuyệt vời cho các viên đạn bắn thẳng tuy nhiên.
MichaelHouse

Chà, nếu lớp vỏ di chuyển cực chậm (so với viên đạn hoặc tia laser), thì vâng, tôi sẽ mô hình nó như một cơ thể thông thường (giống như người chơi)
bobobobo

7
Về mặt kỹ thuật, một tia là điểm bắt đầu và hướng. Điều này có thể được xác định VỚI điểm bắt đầu và điểm khác, nhưng đây không phải là một phần định nghĩa của nó. Theo định nghĩa, tia là vô hạn, và không có điểm kết thúc.
Casey Kuball

1
Bạn nói đúng, những gì tôi đã mô tả thực sự là một đoạn đường , nhưng hầu hết mọi người gọi chúng là tia khi nói về phát hiện va chạm.
bobobobo

3

Sử dụng một tia hoạt động tốt cho các viên đạn di chuyển tức thời như đạn. Đối với các tên lửa có tốc độ chậm hơn, chẳng hạn như loại bạn sẽ sử dụng cho trò chơi không gian của mình, thật đơn giản để theo dõi vị trí của chúng trong thế giới trò chơi giống như bất kỳ thực thể nào khác. Những gì tôi thường làm là có một lớp cơ sở gọi là Thực thể chứa các thuộc tính của bất kỳ đối tượng trò chơi lâu dài nào - vị trí, góc quay, hộp va chạm, v.v. Thực thể siêu hạng, không phải từng loại thực thể riêng lẻ.

Để tăng hiệu suất, việc giữ một bể bơi cho bất kỳ đối tượng nào bạn sẽ tạo và phá hủy thường xuyên là điều rất phổ biến. Khi bạn cần một viên đạn mới, bạn sẽ lấy từ nhóm này, sửa đổi tên lửa mới khi cần và đưa nó trở lại nhóm khi nó hết hạn.


2

Khi bạn muốn tối ưu hóa để phát hiện va chạm, bạn có thể lưu trữ tất cả các đối tượng trò chơi trong một cây hai hoặc ba chiều . Cấu trúc dữ liệu này làm cho nó rất hiệu quả để lấy tất cả các đối tượng trong một khu vực nhất định.

Tuy nhiên, cây nhị phân có nhược điểm là chúng dễ bị thoái hóa khi các đối tượng được thêm, xóa và thay đổi vị trí của chúng, vì vậy bạn sẽ cần phải tự động cân bằng nó.

Một sự thỏa hiệp sẽ dễ thực hiện hơn nhưng không hiệu quả bằng việc sử dụng cách tiếp cận dựa trên cơ sở. Chia sân chơi thành các hình khối và theo dõi những vật thể nào chạm vào từng khối. Khi bạn kiểm tra va chạm với một đối tượng, bạn chỉ cần kiểm tra đối chiếu với danh sách đối tượng của các hình khối mà nó đang chạm vào (thay thế "khối" bằng "hình chữ nhật" cho trò chơi 2d).

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.