Effet d'eau avec getdibits et setdibits

Description

Voilà un petit exemple des deux fonctions GetDiBits etSetDiBits qui permettent de transferer une série de bits de la mémoire à une image (tbitmap, timage,...)
dans l'exemple, on applique un effet d'eau sur une image de fond.
On peut par ailleurs déplacer les cailloux qui sont sous l'eau.
On vois donc la rapidité et la simplicité par rapport à scanline ou encore Pixels[]

Sinon, juste pour info, la bouton Tsunami, qui déclache une grosse vague ne marche pas toujours...
Je n'ai pas cherché à savoir pourquoi puisque le reste marche bien...

alors, si quelq'un a une solution, à bonne entendeur salut...

Conclusion :


Alors, ce code propose un exemple d'utilisation de deux fonctions, Getdibits et Setdibits. Pour l'effet d'eau, j'ai trouvé ça sur internet.

En gros, le principe tient en quelques points
1 - ne travailler que sur des valeurs en mémoire (tableaux) et n'afficher le résultat qu'une fois le traitement terminé.
2 - pour une rapidité d'affichage, transfert de l'image finale par setdibits, qui envoie d'un seul coup tous les octets de l'image. Donc, bien plus rapide qu'un scanline[n] ou encore un pixels[x,y]
3 - Donc, on charge les images et on transfert les octets de pixels vers une zone mémoire préalablement affecté (via getdibits). Une seule fois lors de la création de la fiche. Puis traitement direct en mémoire et affichage à chaque itération en transférant via setdibits

Pour l'effet en lui même, vous trouverez sûrement sur Internet des tas d'info dessus mais je vais résumer :
1 ? On a un buffer qui contient l'élévation de l'eau à l'instant T et T-1.
A chaque itération, on applique un effet dessus.
On fait une moyenne des élévations des 8 cases autour d?un point au temps T et on retranche l?élévation au temps T-1 de cette même case.
L?élévation ainsi calculée donnera la valeur à T+1.
Pour créer une vague, il suffit ) un instant donné, de mettre une forte élévation en un point et l?effet sur le buffer va se charger de propager l?onde.

2 ? dessin avec une texture de fond :
Pour chaque point de l?image (x,y), on calcule la déviation du à une vague en calculant la pente à cette endroit. Donc dx=buffer[x,y]- buffer[x+1,y] et dy=buffer[x,y]- buffer[x,y+1]
On placera comme couleur de pixel à l?endroit (x,y) le pixel de l?image originale (x+dx,y+dy)

Enfin, pour trouver les contours d?un caillou, je parcours le dessin de caillou et je repère les points qui sont dans le caillou et où un des quatre points adjacents sont en dehors.

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.