Quels sont les calculs derrière le laser violet «Raiden 2»?

15

Le chemin du laser est affecté par l'entrée de l'utilisateur et les ennemis présents sur l'écran. Voici une vidéo, à 5:00 minutes le laser en question est montré: Raiden II (PS) - 1 Loop Clear - Part 2

MISE À JOUR

Voici un test utilisant Inkscape, le vaisseau est en bas, les 4 premiers ennemis sont ciblés par le plasma. Il semble y avoir une sorte de schéma. J'ai d'abord déplacé le navire, puis la poignée pour former un angle de 45 °, puis en essayant de s'adapter à la courbe, j'ai trouvé un modèle de poignées parallèles et j'ai continué jusqu'à ce que j'atteigne le dernier ennemi. entrez la description de l'image ici

Mise à jour, 26/05/2012 : J'ai commencé un projet XNA en utilisant des béziers, il y a encore du travail à faire, mettra à jour la question la semaine prochaine. Restez à l'écoute !

entrez la description de l'image ici

Mise à jour: 30/05/2012 : Il semble vraiment qu'ils utilisent des courbes de Bézier, je pense que je vais pouvoir répliquer / imiter un plasma d'une telle qualité. Il y a deux nouveaux sujets que j'ai découverts depuis la dernière fois: la longueur de l'arc , le phénomène de Runge , le premier devrait aider à avoir un mouvement linéaire possible sur une courbe de Bézier, le second devrait aider à optimiser le nombre de sommets. La prochaine fois, je mettrai une vidéo pour que vous puissiez voir les progrès 8-)

Aybe
la source
2
Eh bien, c'est une spline en quelque sorte. Probablement courbe de Bézier . Je ne sais pas si cette question peut être répondue par quelqu'un d'autre que les développeurs d'origine. Si vous essayez de recréer cet effet, vous devez nous montrer ce que vous avez et nous dire ce qui ne fonctionne pas.
MichaelHouse
2
Aucune idée, mais il y a une bonne quantité de radicaux.
Hackworth
1
Ayant joué une quantité malsaine de Raiden, je doute que le dentifrice soit une courbe de forme fermée. Cela semblait toujours garder une bonne quantité de mémoire. Je soupçonne qu'il fait une sorte de chemin avec un rayon de virage obligatoire.
@ Byte56: Les développeurs / fans de Shmup sont dédiés, je serais surpris si cela n'était pas documenté / rétro-conçu quelque part maintenant.
3
On dirait qu'il place les segments un à la fois en sortant du navire, avec un coude maximum, et chaque segment se tourne vers les ennemis s'il y en a à proximité ou dans le sens du mouvement du navire.
Kevin Reid,

Réponses:

6

Je viens de créer quelque chose qui pourrait vous aider. C'était en réponse pour aider quelqu'un sur les forums GLBasic.

Voici le lien du forum avec ma suggestion: Random Textured Rolling Hills

Ceci est écrit en GLBasic, mais j'ai essayé de le garder facile à lire, donc il devrait être facilement converti dans n'importe quelle langue.

Pour l'utiliser pour vos besoins, vous devez générer vos données / points de spline. Remplacez les points «colline» dans mon exemple par vos points splines. Vous auriez seulement besoin d'ajouter un effet d'animation / scintillement d'une manière ou d'une autre. Peut-être un changement de texture aléatoire.

La vraie «magie» se produit dans ma fonction «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

C'est là que je calcule les quads / polygones finaux qui tracent le sprite le long de la ligne.

Voici les résultats finaux: entrez la description de l'image ici

Et avec le filaire des polygones activé: entrez la description de l'image ici

Doug.McFarlane
la source
1
Super je vais le regarder. BTW, le lien que vous avez donné est rompu.
Aybe
3
Le lien ne semble pas être rompu pour moi ...
doppelgreener
Je viens de vérifier le lien Random Textured Rolling Hills en ce moment, cela m'apporte une erreur 404.
Aybe
1
Bizarre. Cela fonctionne toujours pour moi. Mais voici le lien sous-jacent: glbasic.com/forum/index.php?topic=8118
Doug.McFarlane
Cassé pour moi, j'ai essayé la page d'accueil, ça montre 'Ça marche!' et c'est tout ... bizarre.
Aybe