Trouver des tuiles non fermées dans un jeu basé sur des tuiles

9

Je travaille sur un jeu basé sur des tuiles 2D, et en ce moment j'essaye d'obtenir un équivalent 2D de volumes d'ombre pour fonctionner. J'ai du mal à trouver les surfaces qui devraient projeter des ombres. À tout moment du jeu, je dois trouver les faces non fermées ou la tuile entière.

Ma question est, comment puis-je trouver ces tuiles / bords aussi rapidement que possible étant donné un point?

Image montrant la ligne de vue générale et les tuiles affectées

Ryan S
la source

Réponses:

2

Ce n'est pas une réponse complète, mais j'espère que cela vous aidera.

Votre carte / tuile est-elle statique ou dynamique? Si c'est statique, je vous encourage fortement à effectuer un traitement hors ligne et à précalculer autant que possible de cette façon. Vous pouvez le faire comme vous le souhaitez (raycasting ou quelque chose de plus intelligent), mais vous ne vous souciez pas vraiment de faire très vite car tout se passera hors ligne pendant que vous "cuire" vos niveaux. Vous pouvez soit pré-calculer exactement quelles tuiles sont visibles de chaque endroit, soit créer une sorte de régions plus grandes et toutes les tuiles potentiellement visibles de chaque région.

Ensuite, au moment de l'exécution, la requête pour les tuiles visibles doit être très simple et très rapide.

Bien sûr, si vous avez des niveaux créés dynamiquement, cela ne s'applique pas du tout :-)

Noel Llopis
la source
1

Vous pouvez voir comment j'ai implémenté cela pour un roguelike C # ici . Le code n'est pas hautement optimisé, mais il semble être assez rapide pour moi et (plus important encore) devrait être assez facile à lire. Il s'agit essentiellement d'un algorithme de projection d'ombres simple qui fonctionne un octant à la fois.

munificent
la source
0

Je ne sais pas sur quelle plate-forme vous êtes, mais je ne peux pas vraiment penser à une plate-forme qui ne serait pas assez rapide pour simplement développer un cercle autour de vos entités de diffusion de lumière (à moins qu'il y en ait beaucoup) et détecter si le La tuile sur le point d'être tracée dans votre algorithme de cercle est une tuile solide et donc un blocage de la lumière. À partir de là, ce serait un peu plus compliqué car il faudrait garder une trace des segments de cercle qui sont occlus ou non, mais ce serait ce que je ferais. Une autre option serait de lancer des rayons dans un cercle (encore une fois assez rapidement) dans l'espace de résolution des carreaux et d'arrêter chaque rayon lorsqu'il frappe une tuile solide.

Kaj
la source
Eh bien, je fais surtout des jeux Flash et Javascript, mais actuellement, je fais une sorte de méthode de force brute qui commence à s'embourber après un peu. Je pense que si je peux comprendre comment l'optimiser, je peux faire fonctionner ce jeu assez facilement.
Ryan S
Cela devrait être facilement réalisable en flash, peut-être que votre force brute pourrait être optimisée. De plus, en général, vous n'avez pas à le mettre à jour à chaque image, vous pouvez donc précalculer la situation suivante sur quelques images
Kaj