Si vous utilisez les DrawingSurfaces, vous serez souvent amenés à faire appel aux fonctions
GetPixel et
DrawingColor, par exemple pour dessiner quelque chose en fonction d'un sprite ou du décor de votre room. Il y a néanmoins une ou deux choses à prendre en compte pour éviter de se casser les dents avec la gestion assez particulière des couleurs dans AGS.
Première chose : l'utilisation des DrawingSurface ne permet d'accéder aux couleurs qu'en 16-bits. Ainsi, lorsque vous ajustez les couleurs RVB en faisant appel à
Game.GetColorFromRGB si vous passez les paramêtres 101, 102, 103, vous pouvez très bien remplacer chacune de ces valeurs par n'importe quelle nombre entre 100 et 103, vous obtiendrez le même résultat. Le code couleur renvoyé sera toujours une valeur située entre 0 et 65535. Il est donc possible que pour un jeu en 32 bits, deux pixels très légèrement différents renvoient le même code (je n'ai pas vérifié ce point précis, mais ça semblerait logique sinon cela signifierait que le jeu utilise des couleurs 16 bits). Qu'à cela ne tienne, ce sera généralement suffisant, même si c'est bien de garder en tête cette limitation.
Là où ça se corse, c'est que une couleur que vous aurez définie en utilisant
DrawingColor (ou
Clear) ne renverra pas toujours la même valeur quand vous voudrez la récupérer avec
GetPixel plus tard ! L'aide en ligne précise :
- Citation :
- Dans un jeu hautes-couleurs, les 32 premiers numéros de couleur ont un sens spécial, car AGS les utilise pour maintenir la compatibilité avec les jeux 8-bits. Ainsi, si vous dessinez sur la surface en utilisant une couleur bleu de numéro 0 à 31, vous obtiendrez un numéro différent lorsque vous appellerez GetPixel
Cette précision laisse entendre que la fonction
GetPixel ne renverra
jamais une valeur située entre 0 et 31. or, ce n'est pas le cas ! Bon, le noir renvoie 0 dans tous les cas, ça ça peut paraître logique, mais les valeurs 1 à 31 peuvent être renvoyées aussi... pour des couleurs qui ne sont pas numérotées de 1 à 31 dans la palette !! Ainsi, si vous passez 1 comme paramètre de DrawingColor, vous obitiendrez la couleur suivante :
Mais la fonction
GetPixel, elle, pour la même couleur, renverra 20 ! Valeur qui, une fois utilisée pour dessiner, donnera cette couleur-ci :
Fâcheux quand on essaye de concevoir des éléments graphiques automatisés... Le secret de cette usine à gaz, c'est que les valeurs 0 à 31 réservées aux couleurs 8-bits pour
DrawingColor sont reléguées en fin de tableau, aux emplacements 65536 à 65567, juste après le blanc qui est normalement la dernière couleur quand vous consultez la palette "colours" de l'arborescence (il est également bon à savoir que les valeurs
n suivantes seront aussi équivalentes à
n - 65536). Pour s'en sortir et enfin arriver à mettre d'accord ces deux satanées fonctions, il faudra donc simplement ajouter 65536 aux couleurs inférieures à 32 renvoyées par
GetPixel, de la façon suivante :
- Code:
-
DrawingSurface* surface = Room.GetDrawingSurfaceForBackground();
int couleur = surface.GetPixel(100, 100);
if (couleur < 32) couleur += 65536; //La condition est optionnelle, comme indiqué précédemment cela devrait fonctionner également pour les valeurs supérieures à 32.
surface.DrawingColor = couleur;
surface.DrawPixel(101, 101);
Ainsi vous devriez mettre fin au quiproquos entre ces deux fonctions ne parlant pas tout-à-fait la même langue.