Quais são as contas por trás do laser roxo 'Raiden 2'?

15

O caminho do laser é afetado pela entrada do usuário e pelos inimigos presentes na tela. Aqui está um vídeo, às 5:00 minutos, o laser em questão é mostrado: Raiden II (PS) - 1 Loop Clear - Parte 2

ATUALIZAR

Aqui está um teste usando o Inkscape, a nave está no fundo, os 4 primeiros inimigos são alvos do plasma. Parece haver um tipo de padrão. Mudei a nave primeiro, depois a manivela para formar um ângulo de 45 °, enquanto tentava ajustar a curva, encontrei um padrão de manoplas paralelas e continuei até chegar ao último inimigo. insira a descrição da imagem aqui

Atualização, 26/05/2012 : iniciei um projeto XNA usando beziers, ainda há algum trabalho necessário, atualizará a pergunta na próxima semana. Fique ligado !

insira a descrição da imagem aqui

Atualização: 30/5/2012 : Parece realmente que eles estão usando curvas de Bézier, acho que vou conseguir replicar / imitar um plasma desse tipo. Há dois novos tópicos que descobri desde a última vez: comprimento do arco , fenômeno de Runge , o primeiro deve ajudar a ter um movimento linear possível sobre uma curva de Bézier; o segundo deve ajudar a otimizar o número de vértices. Da próxima vez vou colocar um vídeo para que você possa ver o progresso 8-)

Aybe
fonte
2
Bem, é algum tipo de spline. Possivelmente curva de Bézier . Não tenho certeza se esta pergunta é respondida por alguém que não seja o desenvolvedor original. Se você está tentando recriar esse efeito, deve nos mostrar o que tem e nos dizer o que não está funcionando.
MichaelHouse
2
Não faço ideia, mas tem uma quantidade considerável de radical.
Hackworth
11
Tendo jogado uma quantidade não saudável de Raiden, tenho minhas dúvidas de que a pasta de dente seja qualquer tipo de curva fechada. Sempre parecia manter uma boa quantidade de memória. Suspeito que esteja fazendo algum tipo de percurso com um raio de curva obrigatório.
@ Byte56: Devs / fãs do Shmup são dedicados, eu ficaria surpreso se isso não estiver documentado / com engenharia reversa em algum lugar até agora.
3
Parece que ele coloca segmentos um de cada vez saindo do navio, com uma curva máxima, e cada segmento se volta para os inimigos, se houver algum por perto ou na direção do movimento do navio.
21912 Kevin Reid

Respostas:

6

Acabei de criar algo que pode ajudá-lo. Foi em resposta a ajudar alguém nos fóruns do GLBasic.

Aqui está o link do fórum com a minha sugestão: Random Textured Rolling Hills

Isso está escrito em GLBasic, mas eu tentei facilitar a leitura, por isso deve ser facilmente convertido para qualquer idioma.

Para usá-lo para suas necessidades, você precisará gerar seus dados / pontos do spline. Substitua os pontos 'hill' no meu exemplo pelos pontos spline. Você só precisará adicionar um efeito de animação / oscilação de alguma forma. Talvez uma mudança aleatória de textura.

A verdadeira 'mágica' acontece na minha função 'AddPoint':

FUNCTION AddPoint: h AS THillPoint
    DIMPUSH self.points[], h

    // Is this the very first data point?
    IF LEN(self.points[]) = 1
        self.points[0].pu.Set(0, self.points[0].pm.y - self.texture_ht_up)
        self.points[0].pd.Set(0, self.points[0].pm.y + self.texture_ht_dn)
        RETURN
    ENDIF

    ALIAS h0 AS self.points[-2]  // Reference to the 2nd last point
    ALIAS h1 AS self.points[-1]  // Reference to the last point
    LOCAL angle#
    LOCAL v1 AS TVector
    LOCAL v0 AS TVector

    // Calculate 'p2' of HillPoint - form rectangle with previous point
    angle = ATAN(h1.pm.y - h0.pm.y, h1.pm.x - h0.pm.x)  -90// Angle of the two points

    v1.x = COS(angle) * self.texture_ht_up + h1.pm.x
    v1.y = SIN(angle) * self.texture_ht_up + h1.pm.y
    v0.x = COS(angle) * self.texture_ht_up + h0.pm.x
    v0.y = SIN(angle) * self.texture_ht_up + h0.pm.y
    h0.pu = h0.pu.AverageWith(v0)
    h1.pu.Copy(v1)

    v1.x = COS(angle) * -self.texture_ht_dn + h1.pm.x
    v1.y = SIN(angle) * -self.texture_ht_dn + h1.pm.y
    v0.x = COS(angle) * -self.texture_ht_dn + h0.pm.x
    v0.y = SIN(angle) * -self.texture_ht_dn + h0.pm.y
    h0.pd = h0.pd.AverageWith(v0)
    h1.pd.Copy(v1)
ENDFUNCTION

É aqui que calculo os quads / polígonos finais que plotam o sprite ao longo da linha.

Aqui estão os resultados finais: insira a descrição da imagem aqui

E com a estrutura de arame dos polígonos ativada: insira a descrição da imagem aqui

Doug.McFarlane
fonte
11
Ótimo, vou olhar para ele. BTW, o link que você deu está quebrado.
Aybe
3
O link não parece ser quebrado para mim ...
doppelgreener
Acabei de verificar o link Random Textured Rolling Hills agora, isso me traz um erro 404.
Aybe
11
Esquisito. Ainda funciona para mim. Mas aqui está o link subjacente: glbasic.com/forum/index.php?topic=8118
Doug.McFarlane
Quebrado para mim, tentei a home page, mostra 'Funciona!' e é isso ... estranho.
Aybe