적 AI가들을 수있는 소리를 추가하는 방법?


10

주어진:

  • 2D 하향식 게임
  • 타일은 2D 배열에만 저장됩니다
  • 모든 타일에는 속성이 있습니다-댐핑하십시오 (따라서 벽돌은 -50db, 공기는 ​​-1 일 수 있습니다)

이것으로부터 나는 x1, y1 지점에서 소리가 발생하고 그것을 "리플 아웃"시키기 위해 그것을 추가하고 싶습니다. 아래 이미지는 더 잘 설명되어 있습니다. 분명히 최종 목표는 AI의 적이 소리를 "듣게"할 수 있다는 것입니다. 그러나 벽이 소리를 막 으면 소리가 멀어지지 않습니다.

여기에 이미지 설명을 입력하십시오

빨강은 벽이며, 50db의 완충 효과가 있습니다.

나는 세 번째 게임 진드기에 수학을 혼란스럽게 생각합니다.

이것을 구현하는 가장 좋은 방법은 무엇입니까?


1
소리가 반사 / 반향되는 소리에 관심이 있습니까? 즉, 방음벽의 일부가 음원과 AI 에이전트 사이에 직접 있지만 벽을 자유롭게 걸을 수 있다면 AI 에이전트가 여전히 소리를들을 수 있습니까? 대답이 '아니요'인 경우 사운드 당 각 셀을 한 번만 업데이트하므로 감쇠는 각 사운드 소스에 한 번만 적용됩니다. AI 에이전트가 몇 개인 경우 소스에서 에이전트까지 한 줄을 추적하십시오.
Sean Middleditch

목표는 벽 주위의 소리와 그 밖의 소리를 따르는 많은 '멍청한'요원을 갖는 것입니다.
Chris

답변:


7

그것은 합리적인 아이디어처럼 보이지만, 이것은 게임 플레이 기능이며, 게임 플레이에 필요한 것보다 더 복잡하게 만들지 마십시오.

프로그래밍이 더 쉽고 실제 사운드의 빠른 퍼짐과 더 일치하는 것처럼 보이기 때문에 사운드가 즉시 퍼지도록 구성표를 변경했습니다.

이것은 본질적으로 길 찾기 문제이며 Dijkstra의 알고리즘을 사용하여 해결하는 것이 가장 좋습니다. 이것은 일대 다 포인트 검색 (하나의 음원, 여러 적)이며, 단일 포인트에서 시작하여 효율적으로 해결할 수 있습니다.

소스에서 스프레드를 시작하여 시작하고 아직 표시되지 않은 모든 이웃을 표시하고 계산 된 볼륨이 0보다 큰 경우 각 이웃을 목록에 추가합니다. 이 목록은 계산 된 수량별로 정렬해야합니다. 그런 다음 목록에서 가장 높은 볼륨 항목에 대한 프로세스를 반복하고 필요에 따라 목록에 새 항목을 추가하고 처리 한 항목을 제거하십시오. 목록이 비워 질 때까지 반복하십시오.

이 과정에서 적과 타일에 도달 할 때마다 적의 음량을 알 수 있습니다.


1
즉각적인 사운드 여행을 위해 +1 당신이 그 물건에 관심이있는 물리 시뮬레이션을하지 않는 한, KISS.
Hackworth

흠 소리가 정말 좋아. 또한 @Hackworth에 간단하게 유지하는 것에 동의합니다. 즉각적인 소리는 언급 된 순간 '페니가 떨어졌습니다'라는 순간이었습니다. Dijkstra의 알고리즘에 대해 읽기 시작했지만 확인하기 위해 다른 유형의 벽에 맞게 가중치 노드를 포함 할 수 있습니까?
Chris

@Chris 예, Dijkstra 's는 또한 벽을 모델링하는 좋은 방법이 될 수있는 가중치 노드 (weighted node)에서도 작동합니다 (예 : 무게가 볼륨을 줄입니다)
bummzack

9

경로 찾기가 필요하다고 생각하지 않습니다. 해당 지역의 각 AI에 광선을 캐스트하기 만하면됩니다. 방해가되는 벽이 있으면들을 수 없습니다. 이것은 일종의 장면 그래프 + 공간 분할에서 가장 잘 작동합니다.


이 답변에 동의합니다.
bobobobo

사운드를 저장하는 데이터 구조도이 방법으로 훨씬 간단 해집니다.
Chris

나는 레이 캐스트의 아이디어를 좋아하지만, 그것이 다른 유형의 벽을 통과하는 사운드를 설명하는지 모르겠습니다. 예를 들어 작은 발자국 소리는 벽을 통과하지 않지만 총 발사 소리는 들립니다. 그러나이 경우 레이 캐스팅이 이러한 상황을 해결할지 여부는 알 수 없습니다.
Chris

1
크리스, 그냥 레이 캐스트 아이디어를 가지고 조금 확장 해봐 광선이 물체와 교차 할 때마다 소리의 양이 어느 정도 줄어 듭니다. AI에 도달하기 전에 볼륨이 0으로 줄어들면 들리지 않습니다. AI에 도달하면 "볼륨"값을 갖게됩니다. 이러한 종류의 "볼륨 감소를 가진 광선 추적"을 사용하여 거리에 따라 사운드 드롭 오프를 적용 할 수도 있습니다.
팀 홀트

@ 팀 홀트-좋은 지적, 나는 그 라인을 따라 생각하지 않았다
Chris

0

귀하의 구현에서는 셀의 사운드 레벨이 누적되고 진폭이 모든 방향으로 균등하게 바깥쪽으로 이동한다고 가정합니다. 사운드가 프레임 단위로 퍼지지 않고, 재생 중이거나 재생 중이 아니며, 특정 지점에서 재생할 진폭을 찾아야합니다.

타일을 통한 레이 캐스팅은 타일을 수행하는 한 가지 방법 (그리고 아마도 가장 효과적인 방법)입니다. 이미 터와 수신기 사이에 선을 긋고 길을 따라 각 셀의 감쇠 값을 뺍니다. 숫자가 양수이면 사운드가 재생됩니다.

간접 사운드를 모델링하려면 경로를 찾아야합니다. 이미 터를 트리의 루트로 취급하고 인접한 각 셀을 연결된 노드로 모델링하십시오. 각 링크에는 현재 볼륨에서 차감 된 비용이 있습니다. 수신기를 찾거나 볼륨이 0 아래로 떨어질 때까지 그래프를 계속 탐색하십시오 (있는 경우 역 추적하고 다른 경로를 시도하십시오). 볼륨이 양인 수신기로가는 경로가 없으면 이미 터가 들리지 않습니다. 주의 : 이미 터에서 수신기까지의 경로가 여러 개일 수 있으며 볼륨이 가장 높은 경로가 필요하기 때문에 수신기를 찾을 때 순회를 포기할 수 없습니다.

사운드가 어디에서 왔는지에 관심이있는 AI를 모델링하는 경우 후자의 접근 방식이 도움이됩니다. AI는 경로의 마지막 세그먼트 방향에서 소리가 들리는 것을 '청력'합니다. 다행스럽게도 수신기로 향하는 두 개의 가청 경로가 있다면 AI는 여러 사운드와 어떤 방향으로 혼란 스러울 수 있습니다.


1
소리 유체를 통해 전달되는 파동입니다. 게임에서 그런 식으로 시뮬레이션하는 것은 적절하지 않지만 "소리가 작동하는 방식"이 아닙니다.
Kevin Reid

공정한 포인트 편집
MrCranky
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.