Je pense m'écrire un simple jeu 2D. Il ne brillera pas avec des graphismes ou un gameplay parfaits au début, mais je considérerais cela comme ma première étape dans le développement de jeux PC. Imaginez donc un jeu 2D simple basé sur des sprites (comme Heroes IV ou Startcraft BroodWar).
Je veux que le gameplay supporte jour / nuit avec les changements d'éclairage correspondants et en même temps, ce sera une folie de devoir créer des sprites pour chaque nuance d'éclairage. J'ai donc décidé que l'ajout d'un calque semi-transparent au-dessus d'autres objets serait suffisant.
Le problème avec cette solution est que si j'ai un objet source de lumière dans le jeu (comme le héros portant une torche ou un bâtiment en feu), il doit y avoir une zone plus claire autour, non? Puisque je mets ma couche semi-transparente sur tout, comment proposeriez-vous pour obtenir l'effet visuel torchligt que je veux? Peut-être redessiner ce calque en ajoutant des «espaces» ou des zones de couleurs différentes en fonction de l'effet d'éclairage?
Réponses:
Je ne sais pas dans quoi vous programmez, mais voici comment je l'ai géré dans XNA:
List<Light>
objet est créé / effacé.Light
objets sont ajoutés auList<Light>
.RenderTarget2D
.Light
s est itérée et dessinée par eux-mêmes enRenderTarget2D
utilisant une texture que j'ai faite qui ressemble à ceci:(Remarque: j'ai utilisé les valeurs R, G et B ici, mais vous devriez probablement utiliser le canal alpha dans votre texture réelle.)
Maintenant, il y a quelques choses à noter:
Concernant le point 4:
J'ai en fait deux shaders personnalisés, un pour dessiner les lumières sur la cible de rendu d'éclairage (étape 4) et un autre pour dessiner la cible de rendu des tuiles sur l'écran à l'aide de la cible de rendu d'éclairage (étape 5).
Le shader utilisé au point 4 me permet d'ajouter (ce que j'appelle) une valeur de "luminosité". Cette valeur est
float
multipliée par chaque pixel de la texture avant d'être ajoutée à la cible de rendu afin que je puisse essentiellement rendre les lumières plus claires ou plus sombres.À ce stade, je prends également en compte la valeur "d'échelle" de la lumière, ce qui signifie que je peux avoir des lumières grandes ou petites en utilisant une seule texture.
Concernant le point 5:
Considérez la cible de rendu d'éclairage comme ayant essentiellement une valeur pour chaque pixel de 0 (noir) à 1 (blanc). Le shader multiplie essentiellement cette valeur par rapport aux valeurs RVB d'un pixel de la cible de rendu de tuile pour créer l'image dessinée finale.
J'ai également un peu plus de code ici où je passe (au shader) une valeur à utiliser comme couleur de superposition jour / nuit. Il est également multiplié par les valeurs RVB et inclus dans les calculs de cible de rendu d'éclairage.
Maintenant, cela ne vous permettra pas de faire des choses comme bloquer la lumière autour des objets et ainsi de suite, mais, au moins pour mes besoins, c'est simple et fonctionne bien.
J'ai écrit des articles de blog plus détaillés ici et ici qui peuvent vous aider. Je n'ai pas le temps pour le moment, mais si vous voulez, je peux aller plus en détail ici sur gamedev.
Oh, et voici un coup d'oeil dans mon éditeur de carte:
la source
Draw
méthode des tuiles est l'endroit où vous découvrez si une tuile a des lumières ou non. Je ne passe pas en revue toutes les tuiles dessinées dans laUpdate
méthode, donc j'ajouterais des frais supplémentaires pour cela. De plus, XNA essaie de garantir qu'ilUpdate
sera appelé 60 fois par seconde afin qu'il puisse sacrifier lesDraw
appels pour cela, ce qui signifie que ce code serait en fait appelé moins souvent.Normalement, l'éclairage dans les jeux 2D se fait en ayant une carte normale pour tous vos sprites, puis calculez les effets d'éclairage 3D sur vos sprites 2D. Ceci est appelé vaguement "2.5D". Je ne recommanderais cependant pas de le faire dans votre premier jeu car c'est complexe.
Voici une superbe vidéo de quelqu'un qui a fait cela dans XNA: http://www.youtube.com/watch?v=-Q6ISVaM5Ww
Cela dit, il existe probablement des moyens de tricher et d'obtenir un système de pseudo-éclairage qui pourrait fonctionner avec diverses hypothèses.
la source
Il est difficile de suggérer une approche si vous n'êtes pas complètement précis sur l'effet que vous essayez d'obtenir. Des détails tels que si les lumières doivent être obstruées par l'environnement ou non, quel est le point de vue de votre jeu, dans quelle mesure la lumière doit-elle interagir avec l'environnement, etc.
Je laisserai tomber mes deux cents cependant. Voyez si ce tutoriel de Catalin Zima intitulé Dynamic 2D Shadows correspond à votre facture. Comme vous pouvez le voir, la lumière a un rayon et ne traverse pas d'obstacles. Vous pouvez animer un peu le rayon et la couleur pour la rapprocher d'une véritable torche.
Dans ce cas, la lumière agit comme une sorte de superposition au-dessus de votre scène, mais n'interagit pas avec elle dans la même mesure que dans l'exemple de John, bien qu'elle prenne en compte les obstacles.
Éditer
Catalin renvoie à un autre article qu'il a utilisé comme référence, mais le lien est rompu. Voici un lien mis à jour .
la source