Làm cách nào để thêm âm thanh mà AI của kẻ thù có thể nghe thấy?


10

Được:

  • trò chơi 2D từ trên xuống
  • Gạch được lưu trữ chỉ trong một mảng 2D
  • Mỗi ô có một thuộc tính - làm ẩm (vì vậy các viên gạch có thể là -50db, không khí có thể là -1)

Từ đây tôi muốn thêm nó để âm thanh được tạo ra tại điểm x1, y1 và nó "gợn ra". Các hình ảnh dưới đây loại phác thảo nó tốt hơn. Rõ ràng mục tiêu cuối cùng là kẻ thù AI ​​có thể "nghe" được âm thanh - nhưng nếu một bức tường đang chặn nó, âm thanh sẽ không truyền đi xa được.

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

Màu đỏ là bức tường, có độ ẩm 50db.

Tôi nghĩ rằng trong trò chơi thứ 3, tôi đang nhầm lẫn môn toán của mình.

Điều gì sẽ là cách tốt nhất để thực hiện điều này?


1
Bạn có quan tâm đến âm thanh phản xạ / vang dội không? Đó là, nếu một phần của bức tường cách âm nằm trực tiếp giữa nguồn âm thanh và tác nhân AI, nhưng bức tường có thể được đi lại tự do, liệu tác nhân AI có còn nghe thấy âm thanh không? Nếu câu trả lời là không, thì chỉ cập nhật mỗi ô một lần cho mỗi âm thanh, do đó việc giảm âm chỉ được áp dụng một lần cho mỗi nguồn âm thanh. Nếu bạn chỉ có một vài tác nhân AI, chỉ cần theo dõi một dòng từ nguồn đến tác nhân.
Sean Middleditch

Mục tiêu là có nhiều tác nhân 'ngu ngốc' theo âm thanh của bạn xung quanh tường và những gì không.
Chris

Câu trả lời:


7

Có vẻ như đó là một ý tưởng hợp lý, tuy nhiên, hãy nhớ rằng, đây là một tính năng chơi trò chơi, đừng làm cho nó phức tạp hơn những gì cần thiết cho trò chơi.

Tôi sẽ thay đổi lược đồ của bạn để có âm thanh lan truyền ngay lập tức, vì điều đó có thể dễ lập trình hơn và có vẻ phù hợp hơn với sự lan truyền nhanh của âm thanh thực.

Đây thực chất là một vấn đề tìm đường và có lẽ nó đã được giải quyết tốt nhất bằng thuật toán của Dijkstra. Đây là một tìm kiếm nhiều điểm (một nguồn âm thanh, nhiều kẻ thù) và như vậy có thể được giải quyết một cách hiệu quả bằng cách bắt đầu tại một điểm.

Bạn bắt đầu bằng cách thực hiện một chênh lệch từ nguồn và đánh dấu tất cả các hàng xóm chưa được đánh dấu và có khối lượng tính toán trên 0, mỗi hàng xóm mà bạn thêm vào danh sách. Danh sách đó phải được sắp xếp theo khối lượng tính toán. Sau đó, bạn lặp lại quy trình cho mục nhập âm lượng cao nhất trong danh sách, thêm các mục mới vào danh sách nếu cần và xóa mục bạn đã xử lý. Lặp lại cho đến khi danh sách trống.

Bất cứ khi nào bạn trong quá trình này tiếp cận một ô với kẻ thù, bạn sẽ biết âm lượng mà kẻ thù nghe thấy.


1
+1 cho du lịch âm thanh ngay lập tức. Trừ khi bạn đang thực hiện một mô phỏng vật lý quan tâm đến những thứ đó, KISS.
Hackworth

Hmmm âm thanh thực sự tốt. Tôi cũng đồng ý với @Hackworth về việc giữ cho nó đơn giản. Âm thanh ngay lập tức là một 'đồng xu đã giảm' ngay khi nó được đề cập. Tôi đã bắt đầu đọc về thuật toán của Dijkstra, nhưng chỉ để xác nhận, nó có thể bao gồm các nút có trọng số để điều chỉnh cho các loại tường khác nhau?
Chris

@Chris Vâng, Dijkstra's cũng hoạt động với các nút có trọng số, đó sẽ là một cách tốt để mô hình các bức tường (ví dụ: trọng lượng sẽ giảm âm lượng, v.v.)
bummzack

9

Tôi không nghĩ rằng một công cụ tìm đường là cần thiết, chỉ cần chiếu tia tới từng AI trong khu vực, nếu có một bức tường cản đường, chúng sẽ không nghe thấy. Điều này sẽ hoạt động tốt nhất với một số loại biểu đồ cảnh + phân vùng không gian


Tôi đồng ý với câu trả lời này.
bobobobo

Cấu trúc dữ liệu để lưu trữ âm thanh cũng sẽ đơn giản hơn nhiều theo cách này.
Chris

Tôi thích ý tưởng về việc đúc tia, nhưng tôi không biết liệu điều đó có giải thích cho âm thanh đi qua các loại tường khác nhau hay không. Ví dụ, âm thanh bước chân nhỏ sẽ không xuyên qua tường, nhưng âm thanh của tiếng súng sẽ nổ. Nhưng trong trường hợp này, tôi không biết liệu việc truyền tia có giải quyết được những tình huống đó hay không
Chris

1
Chris, chỉ cần lấy ý tưởng raycast và mở rộng về nó một chút. Mỗi lần tia giao nhau với một vật thể, nó sẽ giảm âm lượng của âm thanh xuống một lượng nào đó. Nếu âm lượng giảm xuống 0 trước khi chạm tới AI, thì không nghe thấy. Nếu nó đạt đến AI, thì bạn có sẵn giá trị "âm lượng". Bạn cũng có thể sử dụng loại "dấu vết tia giảm âm lượng" này để áp dụng giảm âm thanh theo khoảng cách.
Tim Holt

@Tim Holt - điểm tốt, tôi đã không suy nghĩ theo những dòng đó
Chris

0

Tôi nghĩ rằng việc thực hiện của bạn giả định rằng mức âm thanh trong một ô được tích lũy và biên độ chỉ đơn giản là di chuyển ra ngoài theo mọi hướng. Âm thanh không phát ra, từng khung hình, nó phát hoặc không, và bạn muốn tìm ra biên độ để phát nó ở bất kỳ điểm nào.

Raycasting thông qua các gạch là một cách (và có lẽ là cách hiệu quả nhất) để làm điều đó. Chỉ cần vẽ một đường thẳng giữa bộ phát và bộ thu và trừ đi giá trị giảm dần của mỗi ô trên đường đi. Nếu số dương, bạn phát âm thanh.

Nếu bạn muốn mô hình hóa âm thanh gián tiếp, thì bạn sẽ phải tìm đường dẫn. Hãy coi bộ phát là gốc của cây của bạn và mô hình hóa từng ô liền kề như một nút được liên kết. Mỗi liên kết có một chi phí, được trừ vào khối lượng hiện tại. Tiếp tục di chuyển qua biểu đồ cho đến khi bạn tìm thấy máy thu hoặc âm lượng của bạn giảm xuống dưới 0 (nếu có, quay lại và thử đường dẫn khác). Nếu không có đường dẫn đến máy thu có âm lượng dương, bộ phát của bạn không thể được nghe thấy. Lưu ý: bạn không thể từ bỏ di chuyển ngang khi tìm thấy máy thu, bởi vì có thể có nhiều đường dẫn từ bộ phát đến bộ thu và bạn cần một đường dẫn có âm lượng cao nhất.

Nếu bạn đang mô hình hóa AI quan tâm đến việc âm thanh phát ra từ đâu, cách tiếp cận sau sẽ có ích - một AI sẽ là 'nghe' âm thanh đến từ hướng của đoạn cuối cùng trên đường đi. Đặc biệt, nếu có hai đường dẫn âm thanh đến máy thu, AI có thể bị nhầm lẫn về nhiều âm thanh và hướng đi nào.


1
Âm thanh một sóng truyền qua chất lỏng. Có thể không phù hợp để mô phỏng theo cách đó trong một trò chơi, nhưng điều đó chắc chắn không phải "không phải là cách âm thanh hoạt động".
Kevin Reid

Điểm công bằng, được chỉnh sửa
MrCranky
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.