[R] Rotation image, GDIPlus

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
Avatar du membre
matwachich
Membre émérite
Membre émérite
Messages : 986
Enregistré le : lun. 19 oct. 2009 04:04
Localisation : Algérie
Status : Hors ligne

[R] Rotation image, GDIPlus

#1

Message par matwachich »

Je fais appel à vous, chers Autoitien(ne)s!
Un problème de GDIPlus, car je développe ces jours-ci un moteur d'affichage 2D.

Au fait, mon moteur est basé sur les Images de GDIPlus, je les charge et je les colle sur le graphique de la fenêtre.

J'aimerai pourvoir faire tourner ces images (sprites), pour ne pas avoir à créer des sprites sheet énormes contenant toutes les direction de mon personnage!

Je tâtonne du coté des Matrice (_GDIPlus_MatrixCreate), mais le problème c'est que si je fais un MatrixRotate, bah le positionnement du sprite est faussé, car le repère à tourné lui aussi.
J'ai essayé d'ajouter MatrixTranslate, croyant que ça contrera le décalage de MatrixRotate, sans succès.

Je vous donne mon script d'exemple, sur lequel je fais mes tests.
Une idée???
► Afficher le texte
Modifié en dernier par matwachich le lun. 16 mai 2011 16:27, modifié 1 fois.
Sortons VW du coté obscure! - La curiosité est un vilain défaut! Cliquez ici
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2284
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: [..] Rotation image, GDIPlus

#2

Message par jchd »

Je suis une quiche en GDI plus ou pas, mais voici comment je tourne les images qu'il me faut tourner.
C'est un extrait de code brut de décoffrage, je te laisse zieuter l'aide de chaque fonction, t'es un grand garçon.

Code : Tout sélectionner

[spoiler=]Global Enum _
    $RotateNoneFlipNone = 0, _
    $Rotate180FlipXY    = $RotateNoneFlipNone, _
    $Rotate90FlipNone   = 1, _
    $Rotate270FlipXY    = $Rotate90FlipNone, _
    $Rotate180FlipNone  = 2, _
    $Rotate270FlipNone  = 3, _
    $RotateNoneFlipX    = 4, _
    $Rotate180FlipY     = $RotateNoneFlipX, _
    $Rotate90FlipX      = 5, _
    $Rotate270FlipY     = $Rotate90FlipX, _
    $Rotate180FlipX     = 6, _
    $RotateNoneFlipY    = $Rotate180FlipX, _
    $RotateNoneFlipXY   = $Rotate180FlipX, _
    $Rotate90FlipY      = 7, _
    $Rotate270FlipX     = $Rotate90FlipY, _
    $Rotate90FlipXY     = $Rotate90FlipY
    Local $hImage = _GDIPlus_ImageLoadFromFile($sFileName)
    DllCall($ghGDIPDll, "int", "GdipImageRotateFlip", "hwnd", $hImage, "long", $Rotate90FlipNone)
    Local $iIW = _GDIPlus_ImageGetWidth($hImage)
    Local $iIH = _GDIPlus_ImageGetHeight($hImage)
    Local $Result = _GDIPlus_BitmapLockBits($hImage, 0, 0, $iIW, $iIH, $GDIP_ILMREAD, $GDIP_PXF24RGB)
    ;Get the returned values of _GDIPlus_BitmapLockBits
    Local $Scan0 = DllStructGetData($Result, "Scan0")
[/spoiler]
Pour la suite, j'ai besoin ici d'une structure pour accéder aux rangées de pixels RGB dans une structure, mais vois comment tu emploies le graphique pour tes propres besoins.

Maintenant si tu as vraiment besoin d'une fonction la plus générique possible pour la transformation de tes sprites, tu es en effet contraint de te farcir le calcul de la matrice idoine. C'est de la géométrie 2D bête.
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
Avatar du membre
matwachich
Membre émérite
Membre émérite
Messages : 986
Enregistré le : lun. 19 oct. 2009 04:04
Localisation : Algérie
Status : Hors ligne

Re: [..] Rotation image, GDIPlus

#3

Message par matwachich »

Merci pour la réponse.
J'ai déjà vu la fonction GdipImageRotateFlip, et c'est pas ce que je cherche, elle ne me permet pas de faire une rotation à angle libre.
J'ai pensé à utilisé la fonction _GDIPlus_DrawImagePoints, mais je pense que ça sera lent.
Ce que j'aurai aimé, c'est d'exploiter les matrice, mais quand je fait une rotation à ma matrice, toutes les coordonnées sont faussées.

Je vais essayé tout de même d'exploiter _GDIPlus_DrawImagePoints
Sortons VW du coté obscure! - La curiosité est un vilain défaut! Cliquez ici
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2284
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: [..] Rotation image, GDIPlus

#4

Message par jchd »

Laisse tomber les machins compliqués.
Essaye ça et ajuste pour obtenir l'effet souhaité.
► Afficher le texte
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
Avatar du membre
matwachich
Membre émérite
Membre émérite
Messages : 986
Enregistré le : lun. 19 oct. 2009 04:04
Localisation : Algérie
Status : Hors ligne

Re: [..] Rotation image, GDIPlus

#5

Message par matwachich »

C'est parfait!!!
Il y avait un autre problème, c'est que la matrice est appliqué à toutes les images que je colle dans le buffer, mais j'ai trouvé la solution:
Il suffit de créer un autre buffer!

Comme cela:
► Afficher le texte
Reste à savoir si créer à chaque fois un nouveau buffer pour chaque sprite ne sera pas trop lourd???
Je sais, je sais tlem, je vais testé! mais si quelqu'un a déjà la réponse...

En tout cas, si c'est trop lourd, je vais créer 2 types de sprites:
- ceux qui tournent, qui auront leur propre buffer
- ceux qui ne tournent pas, qui seront collés sur le buffer principal

Merci!
Sortons VW du coté obscure! - La curiosité est un vilain défaut! Cliquez ici
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2284
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: [R] Rotation image, GDIPlus

#6

Message par jchd »

Des plans superposés à un décor ? Mais c'est ainsi que Walt Disney travaillait :D
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
Avatar du membre
matwachich
Membre émérite
Membre émérite
Messages : 986
Enregistré le : lun. 19 oct. 2009 04:04
Localisation : Algérie
Status : Hors ligne

Re: [R] Rotation image, GDIPlus

#7

Message par matwachich »

Ok!
Mais j'aimerai reformuler ma question:
- Est ce que, si je fais ça:

Code : Tout sélectionner

$hGraphic = _GDIPlus_GraphicsCreateFromHWND($hWnd)
$hBitmap = _GDIPlus_BitmapCreateFromGraphics($width, $height, $hGraphic)
$hBufferPrincipal = _GDIPlus_ImageGetGraphicsContext($hBitmap)

...

$hBufferDeSprite1 = _GDIPlus_ImageGetGraphicsContext($hBitmap)
$hBufferDeSprite2 = _GDIPlus_ImageGetGraphicsContext($hBitmap)
$hBufferDeSprite3 = _GDIPlus_ImageGetGraphicsContext($hBitmap)
$hBufferDeSprite4 = _GDIPlus_ImageGetGraphicsContext($hBitmap)
$hBufferDeSprite5 = _GDIPlus_ImageGetGraphicsContext($hBitmap)
$hBufferDeSprite6 = _GDIPlus_ImageGetGraphicsContext($hBitmap)
...
$hBufferDeSpriteX = _GDIPlus_ImageGetGraphicsContext($hBitmap)
 
Ca ne va pas alourdir le script???
En sachant que la création d'un Buffer de Sprite n'est faite qu'une seul fois, lors de la création du sprite, et pas à chaque 'collage' du sprite sur l'écran.

PS: Je rappel que c'est pour pouvoir faire tourner un sprite indépendamment des autres éléments de la scène
Sortons VW du coté obscure! - La curiosité est un vilain défaut! Cliquez ici
Avatar du membre
Yogui
Niveau 9
Niveau 9
Messages : 689
Enregistré le : ven. 18 avr. 2008 17:29
Status : Hors ligne

Re: [R] Rotation image, GDIPlus

#8

Message par Yogui »

j'arrive un peu après la guerre mais le sujet avait déjà été abordé ici :

http://autoitscript.fr/forum/viewtopic.php?f=3&t=5491

au pire ça peu aider un peu ;)
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2284
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: [R] Rotation image, GDIPlus

#9

Message par jchd »

Si chaque buffer ne fait que la taille du sprite, je ne vois pas de problème. Après ça sera à toi de gérer correctement l'ordre des plans pour que le rendu final soit conforme à ce que tu souhaites.

J'ai vu une fois un "package" physiks (je crois, ou un nom approchant) venant du forum allemand, qui fait une animation (2D) époustouflante (pour de l'AutoIt). Si je retrouve le lien je te le poste.
Tiens, voilà déjà un lien sur un fil gavé de GDI AutoIt, dont le phusic engine cité.
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
Avatar du membre
matwachich
Membre émérite
Membre émérite
Messages : 986
Enregistré le : lun. 19 oct. 2009 04:04
Localisation : Algérie
Status : Hors ligne

Re: [R] Rotation image, GDIPlus

#10

Message par matwachich »

c'est peut être ça le phisik engin
Quand au lien sur le forum anglais, j'ai déjà téléchargé plus de la moitié des script, c'est justement eux qui m'ont pousser à éplucher de plus près GDI+!
Sortons VW du coté obscure! - La curiosité est un vilain défaut! Cliquez ici
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2284
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: [R] Rotation image, GDIPlus

#11

Message par jchd »

Oui c'est bien ça. (En allemand, un y se prononce u)
La motié de tout ça ! Gourmand, va !
Bonne chasse, il y a de quoi faire.
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
Répondre