Como adicionar um som que uma IA inimiga pode ouvir?


10

Dado:

  • um jogo 2D de cima para baixo
  • Os blocos são armazenados apenas em uma matriz 2D
  • Cada bloco possui uma propriedade - umedecer (para que os tijolos sejam -50db, o ar possa ser -1)

A partir disso, quero adicioná-lo para que um som seja gerado no ponto x1, y1 e "ondule". A imagem abaixo meio que descreve melhor. Obviamente, o objetivo final é que o inimigo da IA ​​possa "ouvir" o som - mas se uma parede estiver bloqueando-o, o som não vai tão longe.

insira a descrição da imagem aqui

Vermelho é a parede, que tem um amortecimento de 50db.

Acho que no terceiro jogo estou confundindo minha matemática.

Qual seria a melhor maneira de implementar isso?


1
Você se importa com o som refletindo / reverberando? Ou seja, se uma seção da parede à prova de som estiver diretamente entre a fonte sonora e o agente de IA, mas a parede puder ser movimentada livremente, o agente de AI ainda deve ouvir o som? Se a resposta for não, atualize apenas cada célula uma vez por som, para que o amortecimento seja aplicado apenas uma vez a cada fonte de som. Se você tiver apenas alguns agentes de IA, basta traçar uma linha de origem para agente.
Sean Middleditch

O objetivo é ter muitos agentes "estúpidos" acompanhando seus sons nas paredes e o que não.
31412 Chris

Respostas:


7

Parece uma idéia razoável, lembre-se, porém, este é um recurso de jogabilidade, não o torne mais complicado do que o necessário para a jogabilidade.

Eu mudaria seu esquema para que o som se espalhasse imediatamente, já que provavelmente é mais fácil de programar e parece mais consistente com a rápida propagação do som real.

Este é essencialmente um problema de busca de caminhos, e provavelmente é melhor resolvido usando o algoritmo de Dijkstra. É uma busca de um para muitos pontos (uma fonte de som, vários inimigos) e, como tal, pode ser resolvida com eficiência, iniciando no ponto único.

Você começa espalhando a partir da fonte e marca todos os vizinhos que ainda não foram marcados e têm um volume calculado acima de 0, cada um dos vizinhos que você adiciona a uma lista. Essa lista deve ser classificada pelo volume calculado. Em seguida, repita o processo para a entrada de maior volume na lista, adicionando novas entradas à lista conforme necessário e removendo a que você manipulou. Repita até que a lista esteja vazia.

Sempre que você, durante esse processo, alcança um ladrilho com um inimigo, você sabe qual volume esse inimigo ouve.


1
+1 para viagens sonoras imediatas. A menos que você esteja fazendo uma simulação de física que se preocupe com isso, KISS.
Hackworth

Hmmm parece muito bom. Também concordo com @Hackworth sobre como mantê-lo simples. O som imediato foi um momento de 'centavo caiu' no minuto em que foi mencionado. Comecei a ler sobre o algoritmo de Dijkstra, mas apenas para confirmar, ele pode incluir nós ponderados para ajustar-se a diferentes tipos de paredes?
31412 Chris

@ Chris Sim, Dijkstra também está funciona com nodos ponderada que seria uma boa maneira de paredes modelo (por exemplo, o peso vai diminuir o volume etc.)
bummzack

9

Eu não acho que um localizador de caminhos seja necessário, apenas o raio lançado para cada IA ​​na área, se houver um muro no caminho, eles não o ouvirão. Isso funcionaria melhor com algum tipo de gráfico de cena + particionamento espacial


Eu concordo com esta resposta.
bobobobo

Essa estrutura de dados para armazenar o som também será muito mais simples.
31412 Chris

Gosto da idéia de um elenco de raios, mas não sei se isso explicaria o som passando por diferentes tipos de paredes. Por exemplo, um pequeno passo no pé não passaria pela parede, mas o som de uma arma dispararia. Mas neste caso eu não sei se fundição ray iria resolver essas situações
Chris

1
Chris, apenas pegue a idéia do raycast e expanda-a um pouco. Cada vez que o raio cruza um objeto, reduz o volume do som em alguma quantidade. Se o volume for reduzido a zero antes de atingir a IA, ele não será ouvido. Se atingir a IA, você terá um valor de "volume" em mãos. Você também pode usar esse tipo de "traçado de raio com redução de volume" para aplicar uma queda de som à distância.
Tim Holt

@ Tim Holt - ponto bom, eu não estava pensando ao longo destas linhas
Chris

0

Eu acho que sua implementação assume que o nível de som em uma célula é cumulativo e que a amplitude simplesmente se move para fora uniformemente em todas as direções. O som não se espalha, quadro a quadro, é reproduzido ou não, e você deseja descobrir a amplitude para reproduzi-lo em qualquer ponto.

A transmissão de raios através das peças é uma maneira (e provavelmente a maneira mais eficaz) de fazer isso. Basta traçar uma linha entre o emissor e o receptor e subtrair o valor de amortecimento de cada célula ao longo do caminho. Se o número for positivo, você reproduz o som.

Se você deseja modelar o som indireto, precisará localizar o caminho. Trate o emissor como a raiz da sua árvore e modele cada célula adjacente como um nó vinculado. Cada link tem um custo, subtraído do volume atual. Continue percorrendo o gráfico até encontrar o receptor ou seu volume cair abaixo de zero (se houver, retorne e tente outro caminho). Se não houver caminhos para o receptor com um volume positivo, seu emissor não poderá ser ouvido. Nota: você não pode simplesmente desistir de percorrer quando encontra o receptor, porque pode haver vários caminhos de emissor para receptor, e você precisa daquele com o volume mais alto.

Se você estiver modelando IA que se preocupa com a origem do som, a última abordagem ajudará - uma AI estaria 'ouvindo' o som vindo da direção do último segmento no caminho. Bem, se houver dois caminhos audíveis para o receptor, eles podem ficar confusos sobre os vários sons e qual direção seguir.


1
O som é uma onda transmitida através de fluido. Pode não ser apropriado simulá-lo dessa maneira em um jogo, mas certamente não é "assim que o som funciona".
Kevin Reid

Fair point, editado
MrCranky
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.