Je fais un simple jeu de tir fixe, similaire à "Galaga" ,) dans le cadre d'une présentation que je fais. Je me demande quelles stratégies et structures de données les gens utiliseraient-ils pour suivre les projectiles, comme les lasers tirés du vaisseau spatial. Une implémentation très simple que j'ai utilisée auparavant est de représenter chaque projectile comme un point et de vérifier les collisions avec tous les objets de la scène.
Cependant, cela semble coûteux, dans les grandes scènes avec de nombreux projectiles; Je me demande quels autres types de stratégies ou d'implémentations sont utilisés pour ce type de cas d'utilisation. À quoi servent les jeux comme le FPS pour suivre les projectiles (balles, obus de char, etc.)?
game-design
design-patterns
Polaris878
la source
la source
Réponses:
Pour les projectiles très rapides (comme les lasers ou les balles), vous pouvez utiliser un Ray .
Un rayon a un point de départ et un point d'arrivée. Une structure de données (très minimale) pour un rayon est:
Ressemble à ça:
(Vous pouvez également mettre en cache le vecteur de direction et la longueur, mais j'ai utilisé un defn très simple ci-dessus).
Si le rayon est un faisceau laser qui se déplace à la vitesse de la lumière, vous persisterez simplement (comme commençant à la buse du pistolet et se terminant quelque part sur un mur) pendant quelques images. Tout ce qui coupe le rayon de chaque image subit des dommages.
Si le rayon est un projectile plus lent (comme une balle, par exemple), la distance parcourue par la balle sur un pas de temps est modélisée par le rayon. Le point de départ est l'endroit où le rayon se trouve au début de l'image, et le point d'arrivée est l'endroit où le rayon sera une fois l'image terminée. Tout ce qui gêne le rayon de la balle est endommagé par la balle.
Les rayons peuvent être efficacement entrés en collision avec des sphères, des aabbes, des coques convexes, etc. Consultez mon projet Hullinator pour un programme de course réel (CTRL + Click to fire rayons)
la source
L'utilisation d'un rayon fonctionne bien pour les projectiles se déplaçant instantanément tels que les balles. Pour les projectiles qui ont une vitesse plus lente comme le type que vous utiliserez pour votre jeu spatial, il est logique de simplement suivre leur position dans le monde du jeu comme vous le feriez pour n'importe quelle autre entité. Ce que je fais souvent est d'avoir une classe de base appelée Entité qui contient les propriétés de tout objet de jeu durable - position, rotation, boîte de collision, etc. l'entité super classe, pas chaque type individuel d'entité.
Pour augmenter les performances, il est très courant de conserver un pool pour tous les objets que vous créerez et détruirez souvent. Lorsque vous avez besoin d'un nouveau projectile que vous tirez de ce pool, modifiez le nouveau projectile selon vos besoins et renvoyez-le dans le pool lorsqu'il est expiré.
la source
Lorsque vous souhaitez optimiser la détection des collisions, vous pouvez stocker tous les objets de jeu dans un arbre à deux ou trois dimensions . Cette structure de données rend très efficace la récupération de tous les objets dans une certaine zone.
Les arbres binaires ont cependant l'inconvénient de dégénérer facilement lorsque des objets sont ajoutés, supprimés et changent de position, vous devrez donc l'équilibrer automatiquement .
Un compromis qui serait plus facile à mettre en œuvre mais pas aussi efficace serait d'utiliser une approche basée sur des blocs. Divisez le terrain de jeu en cubes et gardez une trace des objets qui touchent chaque cube. Lorsque vous recherchez des collisions avec un objet, il vous suffit de le comparer aux listes d'objets des cubes qu'il touche (remplacez "cube" par "rectangle" pour un jeu 2D).
la source