G-Rom a écrit :Sans avoir testé , ce code à un problème :
Code : Tout sélectionner
DisplaySprite3D(\sprite, \x,\y)
If \miror = -1
mirrorSprite3D_H(\sprite, \miror)
EndIf
Tu l'affiches , et ensuite , si il le faut, te le flip.
mais tu ne peut pas voir le résultat , puisque qu'il est déjà affiché

Ta macro mirrorSprite3D_H() devrais pouvoir remettre en l'état un sprite aussi.
Code : Tout sélectionner
If \miror = -1
mirrorSprite3D_H(\sprite, -1) ; CE SPRITE EST "FLIPPE"
else
mirrorSprite3D_H(\sprite, 0) ; LUI EST NORMAL ( ON LE REMET CORRECTEMENT )
EndIf
; ON AFFICHE LE RESULTAT
DisplaySprite3D(\sprite, \x,\y)
ah oui, effectivement, il faut faire l'opération avant d el'affciher,c 'est logique

.
Mais cela dit, j'ai toujours un problème.
voici le code corrigé :
Code : Tout sélectionner
;Eléments Windows
Enumeration
#WINDOW
#text
EndEnumeration
Enumeration
#player
#pnj
EndEnumeration
#window = 0
#ScreenW = 1024
#ScreenH = 768
ShowCursor_(1)
Global inscreen = 1
Global D3Ddevice_interface9.IDirect3DDevice9
;{*************************** Structures *********************************
Structure s_pnj
sprite.i
x.f
y.f
miror.i
sprite3D.i
EndStructure
Global Dim pnj.s_pnj(10)
For i = 0 To 10
pnj(i)\y = Random(640)
pnj(i)\x = Random(480)
pnj(i)\sprite=#pnj
pnj(i)\sprite3D = i
u = 1+Random(1)
If u =1
pnj(i)\miror = -1
ElseIf u = 2
pnj(i)\miror = 1
EndIf
Debug pnj(i)\miror
Next i
;}
;{ ************************ Declaration ***********************************
Declare gestion_souris()
Declare Affichage()
;}
Macro mirrorSprite3D_H(idsprite, MirrorMode)
If MirrorMode = -1 ; miror horizontal
TransformSprite3D(idsprite, SpriteWidth(idsprite), 0, 0, 0, 0, SpriteHeight(idsprite), SpriteWidth(idsprite), SpriteHeight(idsprite))
EndIf
EndMacro
;{ ************************ initialisation ********************************
InitSprite() : InitMouse() : InitKeyboard() : InitSprite3D()
UsePNGImageDecoder()
;}
;{ ************************ openWindow ************************************
;OpenScreen(DesktopWidth(0), DesktopHeight(0), DesktopDepth(0),"")
OpenWindow(#window, 0, 0,#ScreenW, #ScreenH, "miror" , #PB_Window_SystemMenu|#PB_Window_BorderLess |#PB_Window_ScreenCentered )
OpenWindowedScreen( WindowID (#window),0,0, #ScreenW,#ScreenH, 1, 0,0)
;}
Start3D()
!extrn _PB_Screen_Direct3DDevice
!MOV dword EAX, [_PB_Screen_Direct3DDevice]
!MOV dword [v_D3Ddevice_interface9],EAX
D3Ddevice_interface9\SetRenderState(22,1)
Stop3D()
LoadSprite(1, "data\tree\tree4.png",#PB_Sprite_AlphaBlending|#PB_Sprite_Texture )
For i =0 To 10
CreateSprite3D(i,1)
Next i
;{ ************************ boucle ***************************************
Repeat
Event= WindowEvent ()
ExamineMouse() : ExamineKeyboard()
gestion_souris()
Affichage()
FlipBuffers()
ClearScreen(RGB(125,125,125))
;ElapsedMilliseconds()
Until Event= #PB_Event_CloseWindow Or KeyboardPushed ( #PB_Key_Escape )
;}
Procedure gestion_souris()
mx = WindowMouseX(#window):my = WindowMouseY(#window)
If inscreen = 1
If mx> #ScreenW-2 Or my> #ScreenH-2 Or mx<1 Or my<1
inscreen = 0
ReleaseMouse(1)
EndIf
ElseIf mx <#ScreenW-1 And my < #ScreenH-1 And mx > 0 And my > 0
ReleaseMouse(0)
MouseLocate(mx,my)
inscreen = 1
EndIf
EndProcedure
Procedure Affichage()
Start3D()
For i = 0 To 10
With pnj(i)
If \miror = -1
mirrorSprite3D_H(\sprite, -1)
Else
mirrorSprite3D_H(\sprite, 0)
EndIf
DisplaySprite3D(\sprite3D, \x,\y)
EndWith
Next i
Stop3D()
EndProcedure
Et bien il n'y a qu'un seul sprite qui est affiché en miroir, au lieu de tous ceux qui ont le paramètre \miror =-1 (on le voit grâce au debug)
C'est étrange, non ?
Si je n'effectue pas la macro (le miroir) sur le \sprite3D, mais sur le \sprite, là ce sont tous les arbres qui sont en miroir

.
Bon, ça c'est logique car l'opération se fait alors sur le sprite2D d'origine (pas sur les sprite3D "copies")
Encore quelque chose que je n'arrive pas à résoudre
