Pour finir d'ajouter mon grain de sel, voici le sujet original qui explique l'astuce qui permet de faire le flip avec transformsprite() :
https://www.purebasic.fr/english/viewto ... =3&t=43718
Pour ceux que ça intéresse, ça explique aussi comment gérer l'ordre d'affichage des sprites en utilisant le z, puisqu'à la base, nos sprites sont des faces 3D...
Et enfin, voici un code un peu amélioré grâce à Danilo et qui n'utilise plus du tout d'assembleur.
Code : Tout sélectionner
; ***********************************************************************
; Project : FLIP SPRITE
; ORIGINAL CODE FROM : Comtois/thyphoon/djes/danilo
; UPGRADED BY : microdevWeb/djes
; ***********************************************************************
If Not InitSprite()
MessageRequester("Game engine error", "Cannot run sprite engine", #PB_MessageRequester_Error)
End
EndIf
If Not InitKeyboard()
MessageRequester("Game engine error", "Cannot run keyboard engine", #PB_MessageRequester_Error)
End
EndIf
If Not InitSound()
MessageRequester("Game engine error", "Cannot init sound engine", #PB_MessageRequester_Error)
End
EndIf
If Not OpenWindow(0, 0, 0, 800, 600, "Flippy bird", #PB_Window_ScreenCentered|#PB_Window_SystemMenu)
MessageRequester("Window engine error", "Cannot open window", #PB_MessageRequester_Error)
End
EndIf
If Not OpenWindowedScreen(WindowID(0), 0, 0, 800, 600)
MessageRequester("Game engine error", "Cannot open window screen", #PB_MessageRequester_Error)
End
EndIf
Import ""
PB_Screen_Direct3DDevice.IDirect3DDevice9
EndImport
Enumeration D3DCULL
#D3DCULL_NONE = 1
#D3DCULL_CW = 2
#D3DCULL_CCW = 3
EndEnumeration
; From https://docs.microsoft.com/en-us/windows/desktop/direct3d9/d3drenderstatetype
#D3DRS_ZENABLE = 7
#D3DRS_CULLMODE = 22
Procedure SetCullMode(MODE)
; MODE 0 = OFF
; MODE 1 = ON
If PB_Screen_Direct3DDevice
If MODE
PB_Screen_Direct3DDevice\SetRenderState(#D3DRS_CULLMODE, #D3DCULL_CCW)
Else
PB_Screen_Direct3DDevice\SetRenderState(#D3DRS_CULLMODE, #D3DCULL_NONE)
EndIf
EndIf
EndProcedure
Procedure ZEnable(MODE)
; MODE 0 = OFF
; MODE 1 = ON
If PB_Screen_Direct3DDevice
If MODE
PB_Screen_Direct3DDevice\SetRenderState(#D3DRS_ZENABLE, 1)
Else
PB_Screen_Direct3DDevice\SetRenderState(#D3DRS_ZENABLE, 0)
EndIf
EndIf
EndProcedure
SetCullMode(#False)
ZEnable(#False)
; FLIP FUNCTION
Procedure flipSprite(sprite, vertical.b, horizontal.b)
Protected w = SpriteWidth(sprite),
h = SpriteHeight(sprite)
If vertical And horizontal
; X3 X4
; ---
; | /|
; |/ |
; ---
; x2 x1
TransformSprite(sprite, w, h, 0, h, 0, 0, w, 0)
ProcedureReturn
EndIf
If vertical
; X4 X3
; ---
; | /|
; |/ |
; ---
; x1 x2
TransformSprite(sprite, 0, h, w, h, w, 0, 0, 0)
ProcedureReturn
EndIf
If horizontal
; X2 X1
; ---
; | /|
; |/ |
; ---
; x3 x4
TransformSprite(sprite, w, 0, 0, 0, 0, h, w, h)
ProcedureReturn
EndIf
; default sprite vertices
; X1 X2
; ---
; | /|
; |/ |
; ---
; x4 x3
TransformSprite(sprite, 0, 0, w, 0, w, h, 0, h)
EndProcedure
#PB_SPRITE1 = 0
; load pureBasic Sprite
LoadSprite(#PB_SPRITE1, #PB_Compiler_Home + "examples/sources/Data/PureBasic.bmp")
Global gEvent, gExit.b, gHorizontal.b, gVertical.b, gKeyPushed.b
Repeat ; game loop
Repeat ; window loop
gEvent = WindowEvent()
If gEvent = #PB_Event_CloseWindow
gExit = #True ; exit to game loop
Break ; exit to window loop
EndIf
Until gEvent = 0
ExamineKeyboard()
If KeyboardPushed(#PB_Key_Escape)
gExit = #True ; exit to game loop
EndIf
If KeyboardPushed(#PB_Key_Right) And Not gKeyPushed
; reverse horizontal flip
gHorizontal = ~ gHorizontal
gKeyPushed = #True
EndIf
If KeyboardPushed(#PB_Key_Up) And Not gKeyPushed
; reverse vertical flip
gVertical = ~ gVertical
gKeyPushed = #True
EndIf
If KeyboardReleased(#PB_Key_All)
gKeyPushed = #False
EndIf
ClearScreen(0)
StartDrawing(ScreenOutput())
DrawText(0, 0, "Press Up and Right keys to flip")
StopDrawing()
flipSprite(#PB_SPRITE1, gVertical, gHorizontal)
DisplayTransparentSprite(#PB_SPRITE1, 100, 100)
FlipBuffers()
Until gExit
End