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

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Micheao
Messages : 533
Inscription : dim. 07/déc./2014 10:12
Localisation : Sud-Est

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

Message 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
Dernière modification par Micheao le mar. 22/sept./2015 19:07, modifié 1 fois.
Mesa
Messages : 1126
Inscription : mer. 14/sept./2011 16:59

Re: Probleme avec un bout de code

Message 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.
Micheao
Messages : 533
Inscription : dim. 07/déc./2014 10:12
Localisation : Sud-Est

Re: Probleme avec un bout de code

Message par Micheao »

Merci mesa pour ton aide j'en apprend tous les jours sur les sprites
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Probleme avec un bout de code

Message 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.
Configuration : Windows 11 Famille 64-bit - PB 6.20 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
TazNormand
Messages : 1297
Inscription : ven. 27/oct./2006 12:19
Localisation : Calvados (14)

Re: Probleme avec un bout de code

Message 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
Image
Image
Micheao
Messages : 533
Inscription : dim. 07/déc./2014 10:12
Localisation : Sud-Est

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

Message par Micheao »

Merci de votre aide c'est pas évident les sprites
Répondre