Effet d'eau avec getdibits et setdibits

Soyez le premier à donner votre avis sur cette source.

Vue 8 828 fois - Téléchargée 1 402 fois

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

Ajouter un commentaire

Commentaires

cs_mcapp
Messages postés
74
Date d'inscription
vendredi 3 novembre 2000
Statut
Membre
Dernière intervention
15 décembre 2011
-
OK ! Merci Barbichette !
Pb corrigé ! Je vais pouvoir apprécier la qualité de travail !
Merci !
cs_barbichette
Messages postés
243
Date d'inscription
lundi 30 octobre 2000
Statut
Membre
Dernière intervention
15 juillet 2013
-
dans les options de delphi, il doit y avoir un truc pour corriger ça.
Je ne sais plus où...
essaie déjà :
getmem(pointer(vagues),wi*he*2*2);
cs_mcapp
Messages postés
74
Date d'inscription
vendredi 3 novembre 2000
Statut
Membre
Dernière intervention
15 décembre 2011
-
bonjour,
j'ai "types incompatibles" ligne 215 !
cs_Forman
Messages postés
663
Date d'inscription
samedi 8 juin 2002
Statut
Membre
Dernière intervention
6 avril 2010
1 -
Ah oui: l'équivalent du malloc du C en Delphi c'est GetMem (peut être que le rapport est plus clair comme ça).
cs_Forman
Messages postés
663
Date d'inscription
samedi 8 juin 2002
Statut
Membre
Dernière intervention
6 avril 2010
1 -
Ben si quand même ça a à voir, si tu lis à partir de la 3° phrase:

"The changes in this release are as follows:
Fixes an fxkeyboard.cpp build problem on Windows and a sporadic core
dump due to SetDIBits() reacting poorly to malloc()-allocated memory.
It is now using VirtualAlloc() instead of malloc(), which gives whole
pages. "

ça veut dire qu'ils ont corrigé un bug dans leur programme en utilisant "VirtualAlloc() instead of malloc()"

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.