GrabSprite : Dessin d'un sprite dans un sprite

Sujets variés concernant le développement en PureBasic
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

GrabSprite : Dessin d'un sprite dans un sprite

Message par falsam »

Dans une des précédentes version de PureBasic, il était possible de dessiner un sprite dans un autre sprite avec la fonction UseBuffer(#Sprite).

Code : Tout sélectionner

...
UseBuffer(SpriteOutput)
DisplaySprite(...)
RotateSprite(...)
UseBuffer(-1) ;Retour au screen
...
Depuis DirectX8, Cette fonctionnalité ne pouvait plus fonctionner ce qui explique pourquoi cette fonction a disparu.

Alors comment dessiner un sprite dans un autre sprite ?
Nous allons utiliser la fonction GrabSprite() qui permet de capturer une zone de l'écran et crée un nouveau Sprite avec son contenu.
:arrow: https://www.purebasic.com/french/docume ... prite.html

Dans l'exemple qui suit nous allons :
- Afficher un fond pour notre sprite,
- Ajouter une caisse en rotation,
- Créer un sprite résultat,
- Effectuer une rotation de ce resultat.

Code : Tout sélectionner

EnableExplicit

Enumeration Window
  #mf
EndEnumeration

Global Event, LogoPB, Background, Box, Result
Global Assets.s = #PB_Compiler_Home + "Examples\3D\Data\"

InitSprite() 
InitKeyboard()

OpenWindow(#mf, 0, 0, 1024, 768, "", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(#mf), 0, 0, 1024, 768)

UseJPEGImageDecoder()
UsePNGImageDecoder()

; Chargement des sprites
LogoPB  = LoadSprite(#PB_Any, Assets + "PureBasic.bmp")
Background = LoadSprite(#PB_Any, Assets + "Textures\MRAMOR6X6.jpg")
Box = LoadSprite(#PB_Any, Assets + "Textures\Caisse.png")

Repeat  ;Evenement du jeu
  Repeat;Evenement window
    Event = WindowEvent()
    
    Select Event    
      Case #PB_Event_CloseWindow
        End
    EndSelect  
  Until Event=0
  
  ; Dessin de la caisse dans le backgroung 
  ; Rotation de la caisse
  DisplaySprite(Background, 0, 0) ;Image de fond
  DisplaySprite(Box, 416, 316)    ;Ajout de la caisse
  RotateSprite(Box, 0.5, #PB_Relative)
  GrabSprite(Result, 0, 0, SpriteHeight(Background), SpriteWidth(Background)) ;Résultat
  
  ; Rendu du jeu
  ClearScreen(RGB(87, 109, 131)) 
  DisplaySprite(Result, 212, 84) 
  RotateSprite(Result, 1, #PB_Relative)  
  DisplaySprite(LogoPB, 10, 10)
  
  If StartDrawing(ScreenOutput())
    DrawingMode(#PB_2DDrawing_Transparent)
    DrawText(20, ScreenHeight() - 40, "Esc : End of game", RGB(255, 255, 255))  
    StopDrawing()
  EndIf
  
  ExamineKeyboard()  
  
  FlipBuffers()  
Until KeyboardPushed(#PB_Key_Escape)
Peut être qu'il est possible de créer un include ou un module simulant UseBuffer() :wink:
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
Fig
Messages : 1176
Inscription : jeu. 14/oct./2004 19:48

Re: GrabSprite : Dessin d'un sprite dans un sprite

Message par Fig »

Malgré cette bonne solution, c'est une grande tristesse que cette fonction ne soit plus possible... :cry:
Il y a deux méthodes pour écrire des programmes sans erreurs. Mais il n’y a que la troisième qui marche.
Version de PB : 6.00LTS - 64 bits
Répondre