Page 1 sur 1

[RESOLU]Probleme avec un bout de code d'affichage de Sprite

Publié : lun. 21/sept./2015 16:52
par Micheao
Bonjour

j'ai essayé modifier le mini tuto de Taz j'ai juste rajouter une image de fond mon probleme c'est que l'image flash et le sprite n'est pas transparent
j'ai passé la journée a essayé de le mettre transparent j'ai pas reussi malgré je l'ai lu doc

ce que je veux faire c'est mettre ce fond et que le texte defile sans le cadre autour de lui bréve qu'il soit transparent merci si tu peux m'aider

https://www.dropbox.com/s/kutwnjka5kzcl ... e.zip?dl=0

merci de votre aide

Re: Probleme avec un bout de code

Publié : lun. 21/sept./2015 18:26
par Mesa
Il ne faut pas mettre une image de fond en sprite, mais la dessiner sur le screen avec StartDrawing(ScreenOutput()).

Il faut vraiment comprendre qu'un sprite doit être une petite image même si on a la possibilité de créer de gros sprites car cette image sera stockée dans la mémoire de la carte graphique. Pour ne pas aller au devant de problèmes, il faut voir un sprite comme un personnage, c'est à dire une petite image qui sera traitée et affichée souvent et rapidement.

Avec le code ci-dessous, je n'ai pas de scintillement, tout est ok et fluide.

Code : Tout sélectionner

InitKeyboard()
InitMouse()
InitSprite()
UseJPEGImageDecoder()
Enumeration 
  #Fond
EndEnumeration
; taille de notre écran graphique
Global scrW.i=800 ; largeur en pixels
Global scrH.i=600 ; hauteur en pixels

; variables de déplacement
x.i=scrW + 64 ; positions x correspond à largeur de notre écran + largeur du sprite
y.i=Int(scrH/2) ; position y correspond au milieu vertical de notre écran graphique
If OpenScreen(scrW,scrH,32,"Tuto simpliste") 
  ; on va déplacer notre sprite grace à x et y
  ;  LoadSprite(#Fond,"Fond.jpg")
  ;  DisplaySprite(#Fond,0,0) 
  
  
  ;<===========================================================>
  fond=LoadImage(0,"Fond.jpg")
  ;<===========================================================>
  
  ; création du sprite
  CreateSprite(0,225,64,#PB_Sprite_AlphaBlending) 
  StartDrawing(SpriteOutput(0))
  DrawingMode(#PB_2DDrawing_AlphaChannel) 
  Box(0,0,225,64,RGBA(0,0,0,0))
  DrawingMode(#PB_2DDrawing_AlphaBlend) 
  ;#PB_2DDrawing_AlphaClip pour faire un "trou" dans l'image de fond
  DrawText(5,10,"Test de Sprite",RGBA(255,255,255,255),RGBA(0,0,0,0)); 
  DrawingMode(#PB_2DDrawing_Default )
  StopDrawing()
  
  ; on boucle jusqu'à ce que l'utilisateur clique sur le bouton gauche ou appuie sur la touche escape
  Repeat
    ; on efface l'écran avec un fond noir
    ;ClearScreen(RGB(0,0,0))
    
    ;<===========================================================>
    StartDrawing(ScreenOutput())
    DrawImage(ImageID(0),0,0)
    StopDrawing()
    ;<===========================================================> 
    
    ; on examine les entrées clavier et souris
    ExamineKeyboard()
    ExamineMouse()
    
    ; on affiche notre sprite   
    DisplayTransparentSprite(0, X, Y, 255)
    
    ;DisplaySprite(0,x,y)  
    ; on décrémente x pour faire défiler vers la droite
    x-2; plus x est petit plus le scroll est lent, et donc plus x est grand plus c'est rapide
    
    ; on inverse les buffers
    FlipBuffers()
  Until KeyboardPushed(#PB_Key_Escape) Or MouseButton(#PB_MouseButton_Left)
  ; on décrémente x pour faire défiler vers la droite
  x-2; plus x est petit plus le scroll est lent, et donc plus x est grand plus c'est rapide
  
  ; on teste si notre sprite est sorti de l'écran par la droite
  ; c'est à dire position 0 moins taille du sprite (0-64 => -64)
  ; si c'est le cas on remet x à scrW+taille du sprite (1024+64=>1088)
  If x<-0
    x=scrW-12
  EndIf
EndIf

End
[Edition] J'ai ajouté la transparence

M.

Re: Probleme avec un bout de code

Publié : lun. 21/sept./2015 18:44
par Micheao
Merci mesa pour ton aide j'en apprend tous les jours sur les sprites

Re: Probleme avec un bout de code

Publié : lun. 21/sept./2015 19:10
par falsam
@Mesa : Pas top ton code. Ca scintille.

@Micheao.
■ Ton titre Problème avec un bout de code n'est pas très explicite.

Modifie ton titre par Problème d'affichage de sprite. Au moins on sait dans quel domaine nous allons opérer.

■ Quelques erreurs dans ce code.
- 0 et #Fond ont le même identifiant. Si tu Debug #Fond, tu auras la valeur 0 tout comme ton sprite 0.
- Si tu crées des sprites transparents alors tu dois aussi activer le décodeur adéquates. UsePNGImageEncoder()
- L'affichage des sprites doit se faire dans la boucle événementielle et non pas avant la boucle.
- Utilises DisplayTransparentSprite() pour afficher un sprite transparent.

J'ai enlevé ce qui ne servait à rien, ajouté la constante #SpriteTest, et mis dans l'ordre la séquence d'affichage.
Tu regarderas bien la manière de créer un sprite transparent.

Code : Tout sélectionner

InitKeyboard()
InitMouse()
InitSprite()

UseJPEGImageDecoder()
UsePNGImageEncoder()

Enumeration 
  #Fond
  #SpriteTest
EndEnumeration

; taille de notre écran graphique
Global scrW.i=800 ; largeur en pixels
Global scrH.i=600 ; hauteur en pixels

; variables de déplacement
x.i=scrW + 64 ; positions x correspond à largeur de notre écran + largeur du sprite
y.i=Int(scrH/2) ; position y correspond au milieu vertical de notre écran graphique

If OpenScreen(scrW, scrH, 32, "Tuto simpliste") 
  
  LoadSprite(#Fond,"Fond.jpg")
  
  ; création du sprite
  CreateSprite(#SpriteTest, 225, 64, #PB_Sprite_AlphaBlending)
  
  ; Dessin dans le sprite
  StartDrawing(SpriteOutput(#SpriteTest))
  
    ;Important : Dessin du fond transparent (Couleur RGBA Obligatoire) 
    ;Le dernier parametre de RGBA définit la transparence (0 -> 255)
    DrawingMode(#PB_2DDrawing_AllChannels)
    Box(0, 0, 225, 64, RGBA(0, 0, 0, 0))
  
    ;Dessin du texte avec fond transparent (Couleur RGBA Obligatoire) 
    DrawText(5,10,"Test de Sprite", RGBA(255, 255, 255, 255),  RGBA(255, 255, 255, 0)) 
  StopDrawing()
  
  ; on boucle jusqu'à ce que l'utilisateur clique sur le bouton gauche ou appuie sur la touche escape
  Repeat
    ;Affichage des sprites 
    DisplaySprite(#Fond, 0, 0)   
    DisplayTransparentSprite(#SpriteTest, x, y, 255)      
       
    ; on décrémente x pour faire défiler vers la droite
    x-2; plus x est petit plus le scroll est lent, et donc plus x est grand plus c'est rapide
    If x < 0 
      x = ScreenWidth()
    EndIf
    
    ; on inverse les buffers
    FlipBuffers()
    ClearScreen(RGB(0, 0, 0))
    ExamineKeyboard()
    ExamineMouse()
  Until KeyboardPushed(#PB_Key_Escape) Or MouseButton(#PB_MouseButton_Left)
EndIf
Plus de scintillement de sprite.

Re: Probleme avec un bout de code

Publié : lun. 21/sept./2015 19:18
par TazNormand
Sans utiliser le décodeur PNG, Falsam, tu peux aussi juste préciser la couleur de transparence de ton sprite avec

Code : Tout sélectionner

TransparentSpriteColor(#sprite,color)
Sinon, même remarque que Mesa : le sprite en fond c'est pas l'idéal.

En tous cas, continue, même si ta "démo" ne révolutionne pas le genre, elle aura au moins le mérite de fêter l'anniversaire de PureBasic :D

Re: Probleme avec un bout de code d'affichage de Sprite

Publié : lun. 21/sept./2015 20:54
par Micheao
Merci de votre aide c'est pas évident les sprites