Quero fazer uma série de padrões de marcadores em expansão que formam formas como quadrados, triângulos etc. estrela em expansão:
12
Quero fazer uma série de padrões de marcadores em expansão que formam formas como quadrados, triângulos etc. estrela em expansão:
Respostas:
A maneira mais fácil de fazer isso seria primeiro projetar a forma e depois calcular o movimento das partículas. Nesta resposta, estarei construindo um quadrado, mas isso se aplica a qualquer forma.
Comece projetando sua forma como posições relativas em torno de algum ponto de origem.
Agora você precisa calcular como a forma será expandida. Para fazer isso, simplesmente calculamos o vetor apontando de
origin
para todospoint
subtraindo aorigin
posição da posição de nossapoint
e normalizando o vetor.vector = normalize(point.x - origin.x, point.y - origin.y)
.Agora podemos calcular a posição dos pontos a qualquer momento usando esse vetor. Você calcula a próxima posição dos pontos fazendo
point.position += point.vector * point.velocity
. Exemplo de pseudocódigo usando nosso ponto anterior:Isso moverá todos os pontos para fora em 3 unidades a cada quadro.
Notas
fonte
Portanto, existe um projeto chamado BulletML, que é uma linguagem de marcação para criar padrões complexos de partículas / marcadores. Você quase certamente precisará portar o código para o seu próprio idioma, mas ele pode fazer coisas realmente incríveis.
Por exemplo, esse chefe foi feito em uma extensão (fortemente modificada) do BulletML for Unity3D (o autor desse padrão enviou esse vídeo e Misery é insano, além de bom 1 ). É a variação mais difícil desse inimigo e mostra o que o BulletML é capaz de fazer muito bem (e confira alguns dos outros chefes de Misery também, como o Wallmaster ).
Ou posso mostrar este exemplo, que é um padrão que escrevi enquanto trabalhava em uma expansão para The Last Federation , usando uma revisão mais antiga do sistema que é menos amigável ao mod e usa apenas variáveis AZ de um único caractere:
As balas verdes que produzem esses anéis são geradas por uma bala-mãe que gira em alta velocidade, mas elas não têm movimento. Eles causam dano massivo, mantendo o jogador a uma distância maior, restringindo-o a armas com menos danos e permitindo que defensores móveis assediem o jogador (o jogador venceu se a estrutura imóvel no meio fosse destruída).
Aqui está uma parte da sintaxe XML que cria essas bolhas:
Você pode ver alguns dos tiros roxos de "onda de gravidade" na captura de tela, que viajam quase instantaneamente da fonte (que gira) até a borda da bolha, e então gera o tiro verde de "barra curvada", que fica lá por 12 segundos antes desaparecendo. Os tiros azuis e amarelos que eu omiti, pois são muito mais complicados.
Um dos outros padrões (um projétil de artilharia ) na expansão foi realmente escrito por Misery, embora eu tenha feito algumas modificações. Inicialmente, é um tiro penetrante de baixo dano que voa a longo alcance e depois explode em uma enorme queima de fogos, causando muitos danos. Seu alcance máximo era muito maior do que o jogador poderia alcançar, forçando essencialmente o jogador a se envolver em curto alcance, o que foi vantajoso para os outros tipos de unidades de NPC devido ao efeito de espingarda (mais balas agrupadas em uma pequena zona).
O BulletML é fácil de trabalhar, geralmente, e pode fazer coisas incríveis. Os marcadores podem mudar de direção, mudar de velocidade, gerar outros padrões, morrer cedo, repetir a coleta de comandos em um loop, usar atrasos, alterar a imagem de sprite de bala, seguir o pai (ou não) ... E qualquer coisa que ele não suporte escreva nele.
Definitivamente, eu recomendaria se você estivesse fazendo um jogo de tiro sério. Você ainda precisaria calcular a matemática das coordenadas para obter as formas desejadas, como Charanor fala em sua resposta, mas um mecanismo de bala como o BulletML lhe dará muito mais flexibilidade que você gastará mais tempo projetando novos padrões do que descobrir como codificá-los.
fonte
Conforme indicado por Charanor, você pode usar uma matriz de pontos para definir sua forma e, em seguida, atualizar sua posição ao longo do tempo. Abaixo está um exemplo prático de como implementar uma forma de estrela ou uma forma personalizada usando pontos:
fonte