Eu tenho uma mecânica de jogo de “ameba”. Alguma idéia de como implementá-lo?

19

Fora de um clone de tetris , um jogo de tiro 2D de baixa qualidade e alguns brincando com coisas como Unity e Flixel, percebo que ainda tenho que concluir um único jogo polido e sinuoso . Quero mudar isso e tenho uma ideia para o meu próximo projeto.

A idéia é que você é uma ameba. As amebas têm esses núcleos oculares (ou algo assim, eu não sei biologia), e você tem dois deles. Você controla um com WASDe o outro com IJKL. Tem que haver um raio constante de coisas torno de cada um dos núcleos:

2meba1

E a área da ameba deve permanecer constante. Portanto, se você move um núcleo em uma direção, aumenta a área da ameba, mas esse aumento é compensado por uma diminuição em outro lugar:

2meba2

Ah, e eu gostaria de implementar um mecânico de vaginação . Você absorve as coisas, envolvendo-as, como um chefe. Talvez até um núcleo extra, ou uma agulha que o abra e faça com que todo o seu interior comece jorrar :

2meba3

Mas aqui está o problema: não sei como fazer isso. No entanto, gostaria de algumas idéias sobre como implementá-lo. Devo explorar bibliotecas de física como o Box2D? Ou talvez algo envolvendo física dos fluidos? Qualquer ajuda seria muito apreciada.

PS Sinta-se livre para roubar essa idéia. Eu tenho muitas idéias. Se o fizer, diga-me como você fez para que eu possa experimentar.

Jason Tu
fonte
3
As formas substantivas e verbais são invaginação e invaginam , respectivamente, para sua informação. (Eu fiz biologia.) Belas fotos.
Engenheiro
2
onde você conseguiu esse doce papel preto?
Brendan
5
@brendan: Se você trocar preto por branco, vermelho por azul e branco por preto, fica muito mais evidente onde ele conseguiu esse "papel preto". ;)
knight666 27/07/12
11
Vocês são muito espertos: D
Jason Tu

Respostas:

16

No topo da minha cabeça, a cláusula que se destaca para mim é que você deseja que a área seja constante. Isso me parece a dor de tudo isso, então vamos tentar encontrar uma solução fácil para isso.

Pegue um pedaço de barbante e amarre as pontas para formar um círculo. Posso estar errado, mas minha intuição diz que o interior dessa corda tem uma área constante, ou que atuaria muito como o limite da sua ameba.

Então eu diria: implemente a string. ;) A maioria das bibliotecas de física pode fazer molas (no Box2D isso se parece com a junta de distância), e a maneira mais fácil de criar uma string é conectar muitas strings. Junte o último até o primeiro para criar um loop. Certifique-se de que as molas da corda tenham uma constante de mola alta o suficiente para não se esticarem - você quer que elas sejam bastante rígidas e se movam em uníssono, para não se expandir.

Em seguida, crie forças para atuar na string. Trivialmente, seus dois núcleos / olhos / pontos de controle criam forças nos pontos que compõem a corda. Faça a força cair com uma função quadrada inversa:

float forceOnPoint(point, ball)
{
  float d = distance(point, ball);
  return K / (d*d);
}

E direcione a força diretamente para longe do olho / bola de controle, como uma força repelente que emana da bola. Aperte K para controlar a força da força. Certifique-se de que K não seja muito alto - você não quer que ele seja empurrado massivamente pela força, apenas mantenha-o longe das bolas. Deixe muita folga na corda.

Com apenas esses dois, você provavelmente terá uma forma bastante uniforme, então eu também sugiro que você crie algumas forças mais fracas ao redor da 'sopa' ao redor para mudar a forma da ameba. Você pode fazer esses lugares aleatórios, mudar sua força regularmente (você pode torná-la uma função sinusóide para movimentos agradáveis) e fazê-los funcionar da mesma maneira que as bolas.

Vaginação (fnarr): essa é a difícil. Você faz com que ele envolva um objeto, verificando se dois pontos não adjacentes na sequência conseguiram se aproximar o suficiente e, se for o caso, é necessário:

Meça a distância entre os pontos na corda. Conte o número de seções da mola. Encontre o caminho 'mais curto' de A a B.

Quebre a corda e junte-a novamente com os dois pontos adjacentes. Em outras palavras, junte diretamente o ponto A ao ponto B e descarte todas as coisas no meio.

Reinsira o número de pontos ausentes (mais pontos de bônus, se você quiser expandir em tamanho comendo alguma coisa) na sequência do outro lado - ou seja, o lado de B a A. Se você os inserir igualmente ao longo do comprimento e Para torná-los menores que a distância desejada entre os pontos, você deve obter um bom efeito de expansão elástica.

Eu acho que cobre tudo. A propósito: a ideia parece incrível.

Matt Kemp
fonte
18
FWIW, embora eu goste desta solução em geral, sua intuição sobre o interior da string com área constante está errada - o círculo tem a área máxima de qualquer forma com essa string amarrada como limite. A maneira mais fácil de ver que isso varia é imaginar 'apertando' a corda puxando duas pontas esticadas; então, a forma que você obtém (retângulo, elipse ou o que você tem) nunca pode ter mais do que metade do perímetro, mas sua altura diminui para zero, então a área (que é delimitada pela largura * altura) também diminui para zero.
Steven Stadnicki
11
Eu acho que você quis dizer "... fazer uma corda é conectar muitas molas ".
Richard Marskell - Drackir
8

Para simular a endocitose (o processo da célula consumindo núcleos externos), cada núcleo, dentro e fora da ameba, repeliria os limites da ameba. Os núcleos dentro da ameba terão um efeito repulsivo moderadamente forte, enquanto os do lado de fora terão um pequeno efeito repulsivo. Isso é ilustrado abaixo.

insira a descrição da imagem aqui

À medida que o núcleo externo (vermelho) se aproxima da ameba, seu campo repulsivo cria um recuo circular na ameba. Eventualmente, os dois lados (destacados em verde) se tocam. Quando uma colisão como essa é detectada, a indentação circular é apagada e o que quer que seja dentro dela é consumido.

Isso imita o processo de endocitose bastante bem e fornece um bom efeito visual.

Quanto a simular o limite da ameba, gosto da idéia de Matt Kemp de usar um número muito grande de fontes conectadas. Isso não mantém uma área constante, mas um perímetro constante. Na vida real, a água pode fluir livremente dentro e fora de uma membrana celular (o limite da ameba), de modo que as células não têm um volume constante.


Algumas outras idéias para tornar o jogo realista seriam capazes de modificar o teor de sal das células de alguma forma. Quando a concentração de sal no interior e no exterior de uma célula não corresponde, a água corre através da membrana celular em direção ao local com maior teor de sal em um processo chamado osmose. Se a ameba tiver um alto teor de sal, teria um volume maior, mas o perímetro não mudaria. No jogo, isso pode ser simulado, dando aos núcleos internos um efeito repulsivo mais alto se o teor de sal for maior.

Como um alto teor de sal daria aos núcleos um efeito repulsivo mais alto, ele tem a vantagem de facilitar o controle da ameba. Ter um teor menor de sal faria com que a ameba se flexionasse e se dobrasse sob a influência do meio ambiente. Isso tem a vantagem de poder comer outros núcleos com mais facilidade, já que a ameba seria capaz de cercá-lo com mais facilidade.

PhiNotPi
fonte
3

Bem, para fazer o efeito gráfico, você provavelmente usaria metaballs (há muitos tutoriais online para eles)

CobaltHex
fonte
2

Bem, eu conheço um jogo educacional chamado CellCraft (embora não tenha relação com o Minecraft) que envolve o controle de criaturas semelhantes a células que têm movimentos muito semelhantes aos necessários. O jogo é gratuito e provavelmente o mais importante é que eles declararam claramente em seu site que pretendem disponibilizar o código fonte gratuitamente e foi feito no ActionScript 3 e é um jogo baseado em flash.

http://www.cellcraftgame.com/Home.html

TenaciousD
fonte
1

A maneira como eu faria isso seria simular um loop de cordas semelhante ao sugerido por Matt Kemp, mas encher o interior com partículas que se repelem e à corda. Dessa forma, você garantirá uma conservação aproximada do volume. Você terá que tomar cuidado para garantir que grandes forças não joguem as partículas para fora.

Procure "hidrodinâmica de partículas suavizadas" para simulação das partículas e "integração de verlet" para simulá-las (e a corda). Verlet é uma técnica baseada em posição, por isso é muito simples e estável.

Para manter as coisas eficientes, eu sugeriria um sistema de "particionamento espacial de grade uniforme". Mais uma vez, fácil de implementar e gerar grandes acelerações.

Você também pode usar metaballs para visualizar o objeto em vez de usar a string. Mas você tem o problema de que as partículas podem se separar em grupos separados. Consulte "Forças de Van der Waals" para obter um equilíbrio de atração / repulsão que leve ao aglomerado.

Outra abordagem seria fornecer uma pequena força "inflável" para as partículas da corda na direção de seus normais "externos". Isso simulará um tipo de pressão interna. O resultado é que o loop tentará manter uma forma de círculo. Isso é o que eu usei para isso .

Espero que ajude.

DaleyPaley
fonte