Comment faire un draw_getpixel() plus rapide sans avoir à afficher des trucs à l'écran?Je viens de faire un petit pack de scripts permettant de choper directement la couleur d'un pixel à l'intérieur d'un fichier bmp 24 bit classique.
Il me semble avoir déjà vu ça quelquepart sous forme de DLL, mais je trouvais intéressant de le refaire purement en gml... et ça marche :p
Le principal avantage, c'est surtout que c'est pas mal plus rapide que la fonction de base de GM (voir screens).
Réalisé dans une room à 900fps, avec pour seul différence, la méthode de récupation de couleur:
Un des autres avantages qui me vient juste à l'esprit, c'est qu'il est possible de choper la couleur de quelquechose sans avoir à l'afficher à l'écran, et ça, c'est quand même vachement plus propre.
J'ai essayé de simplifier au maximum l'utilisation des scripts. En gros, voilà la marche à suivre :
Au début de la room, il faut 'charger' le bmp :
- Code:
-
my_bmp = bmp_open('nomDuBMP.bmp')
Quand on veux une couleur.... on la cherche, pardi!
- Code:
-
color = bmp_get_color(my_bmp,x,y)
Et quand on a fini (fin de la room, fin du jeu...)
- Code:
-
bmp_close(my_bmp)
J'ai aussi prévu des fonctions supplémentaires, pour ceux qui veulent vraiment fouiner dans le bmp :
bmp_get_offset(bmp) : retourne à quel index commence le data field (la première adresse où se trouve les infos couleurs dans le bmp)
bmp_get_width(bmp) : retourne la largeur (en pixels) du bmp
bmp_get_height(bmp) : je vous laisse deviner
bmp_read(bmp,index,length) : retourne un nombre, correspondant à la chaine hexa commencant en 'index', sur une longueur de 'length' bytes.
C'est fonction est relativement pratique, car gm donne un integer quand on lit un byte, qu'il faut passer en hexa, retourner (spécial dédicace à little endian), et assembler les différends bytes (toujours en hexa inversé, vous suivez?), puis tout remettre en nombre décimal.
Ah oui, un
lien de téléchargement.
Dans le zip, il y a un .exe et un gmk de démonstration, un fichier bmp et les deux screens ci dessus.
Ah oui : si vous dézippez pas, ça marchera pas : faut avoir accès au bmp pour... lire dans le bmp.