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.
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?
ai
game-mechanics
data-structure
sound
Chris
fonte
fonte
Respostas:
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.
fonte
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
fonte
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.
fonte