[2D] Que pensez vous de ce code d'affichage de sprite

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

[2D] Que pensez vous de ce code d'affichage de sprite

Message par Ar-S »

Salutation amis du week end (oui pas de client aujourd'hui alors c'est le week end)

Toujours dans ma 2D/3D, j'ai restructuré mon code avec procedures et structures.
Est-ce que vous trouvez l'agencement correcte ou y a t il plus simple (et efficace) ?

Si vous souhaitez le tester, voilà mon pack d'images contenant l'alphabet.

Voilà le code :

Code : Tout sélectionner


   ; ------------------------------------------------------------
  ;  Test Affichage Sprite3D pour futur Sinus ScrollText
  ;  Font PB 4.60 by Ar-S
   ; ------------------------------------------------------------
  
UsePNGImageDecoder()

Declare Creer_Sprite_Liste(message.s)

Global.i Width, Height, Depth, RefreshRate, X3D, Y3D
Global.c TailleAlph = 128
Global.s message, alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ-' " ; 29 Caractères avec l'espace à la fin  

; //////////////////////////////////////////////////////////////
; //////////////////////////////////////////////////////////////

; Pack images dispo ici : http://pb.ldvmultimedia.com/ARS_RESSOURCES.zip (à dézipper)

; ELEMENTS A MODIFIER - Chemin du dossier contenant les images 
DossierImage.s = "E:\MULTIMEDIA\PUREBASIC\4.40\_3D\ARS_RESSOURCES\"
MessageAafficher.s = "J'AIME PURE-BASIC"

; \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
; \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\





; Initialisation du tableau qui comportera le numéro 
; et les coordonnées des sprites

Structure ParamSP
  Num.i ; Numéro du sprite
  Xsp.i ; Position X
  Ysp.i ; position Y

  ; A venir
  Ang.i ; Rotation
  
EndStructure

Global Dim SpriteAlphabet.ParamSP(0) 







; ---------------------------------------
;- >> PROCESDURES <<
; ---------------------------------------

  ; *******************************************
  ;         [ Création des Sprites ] 
  ; *******************************************
Procedure Charge_Sprite(ImgPath.s,NbrDeSprite.i)

  
  verif = 0
  For Sprite = 1 To NbrDeSprite
    ;Sprite3D = Sprite
    If LoadSprite(Sprite, ImgPath+Str(Sprite)+".png", #PB_Sprite_Texture|#PB_Sprite_AlphaBlending)
      CreateSprite3D(Sprite, Sprite)
      verif + 1 
      Debug "Chargement sprite : "+Str(Sprite) + " OK" ;- test
    Else
      Debug "Erreur de chargement du sprite : "+Str(Sprite) ;- test
    EndIf  
  Next
  
  Sprite3DQuality(1) ; 1 = #PB_Sprite3D_BilinearFiltering
  
  
  ; Si tout les chargements se sont bien passés, on retourne le nombre de sprites à afficher
  ; Si non on retourne 0
  If verif = NbrDeSprite
    ProcedureReturn verif
  Else
    ProcedureReturn 0
  EndIf
  
EndProcedure 

  ; *******************************************
  ;  [ Redimension et Remplissage du Tableau ] 
  ; *******************************************
Procedure Creer_Sprite_Liste(message.s)

  message = UCase(message)
  LngMess.i = Len(message)
  
  TailleTableau = LngMess-1
  ; Redimension du tableau (-1 car commence à 0)
  Redim SpriteAlphabet.ParamSP(TailleTableau) 
  
  
  Debug ""
  Debug "TailleTableau : "+ Str(TailleTableau) + " (de 0 à "+Str(TailleTableau) + " ce qui équivaut à "+Str(LngMess)+ " caractères.)"   ;-TESTTTTT
  Debug ""
  
  
  X3D = 0 ; (Width / 2) - (TailleAlph / 2) ; pour centrer
  Y3D = 0 ; (Height / 2) - (TailleAlph / 2) ; pour centrer
  
  For L = 1 To LngMess
    Lettre.s = Mid(message,L,1)
    
    Debug ""
    Debug Lettre ;-TEST LETTRE
    
    For AL = 1 To Len(alphabet)
      LettreAlph.s = Mid(alphabet,AL,1)
      If LettreAlph = Lettre
        
        SpriteAlphabet(L-1)\Num = AL
        SpriteAlphabet(L-1)\Xsp = X3D
        SpriteAlphabet(L-1)\Ysp = Y3D
        
        Debug "Sprite " + Str(L) + "  -   Pos : "+Str(SpriteAlphabet(L-1)\Num)+ " dans l'alphabet"
        Debug "Position X : "+Str(SpriteAlphabet(L-1)\Xsp)
        Debug "position Y : "+Str(SpriteAlphabet(L-1)\Ysp)
        
        If X3D >= Width - TailleAlph
          Y3D + TailleAlph
          X3D = 0
          
          If Y3D > Height - TailleAlph
            Y3D = 0
            X3D = 0
          EndIf
          
        ElseIf X3D <= Width - TailleAlph
          X3D + TailleAlph
        EndIf
        
      EndIf
    Next
    
  Next
  
  ProcedureReturn TailleTableau
  
EndProcedure
  
  
  
; ---------------------------------------
;- >> PROGRAMME <<
; ---------------------------------------  
  
If InitEngine3D()
  
  InitSprite()
  InitSprite3D()
  InitKeyboard()
  
  ExamineDesktops()
  ExamineScreenModes()
  
  Width      = DesktopWidth(0)
  Height      = DesktopHeight(0)
  Depth      = DesktopDepth(0)
  RefreshRate  = DesktopFrequency(0)
  
  ;Dimension et données concernant le logo
  
  
  ;- Ouverture Screen
  If OpenScreen(Width, Height, Depth, "Ar-S TEST Font", #PB_Screen_WaitSynchronization, RefreshRate) = 1
    
    
    NBR = Charge_Sprite(DossierImage, 29)
    Debug "Nombre de sprite chargés : " +Str(NBR)   
    
    If NBR <> 0
      
      LNG = Creer_Sprite_Liste(MessageAafficher)
      Debug "LNG  : " + Str(LNG)
      
    EndIf
    
    RenderWorld()
    
    
    ; ---------------------------------------
    ;- >> BOUCLE <<
    ; ---------------------------------------
    
    Repeat
      
      ExamineKeyboard()
      
      FlipBuffers()
      ClearScreen(0)
      
      
      
      ;- Mouvement du Logo
      If Start3D()
          
          
          For i = 0 To LNG
            
            DisplaySprite3D(SpriteAlphabet(i)\Num, SpriteAlphabet(i)\Xsp, SpriteAlphabet(i)\Ysp, 255)
            
            
          Next
          
        EndIf
        
        
      Stop3D() 
      
      
      
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
    
  Else
    MessageRequester("Error", "The 3D Engine can't be initialized",0)
  EndIf
  
  End
  
Else
  
  MessageRequester ("Erreur", "impossible d'ouvrir la fenêtre",#MB_OK)
  End
EndIf    
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
Cool Dji
Messages : 1126
Inscription : ven. 05/sept./2008 11:42
Localisation : Besançon
Contact :

Re: [2D] Que pensez vous de ce code d'affichage de sprite

Message par Cool Dji »

C'est fait exprès le clignotement ? c'est le debug peut-être...
Tant que ça marche :D
Only PureBasic makes it possible
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: [2D] Que pensez vous de ce code d'affichage de sprite

Message par Ar-S »

Clignotement ? 8O mais quel clignotement ?
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
jbernard13
Messages : 1501
Inscription : dim. 18/avr./2004 15:04
Localisation : sud de la france

Re: [2D] Que pensez vous de ce code d'affichage de sprite

Message par jbernard13 »

bonsoir Ar-S

j'ai aucun clignoitement c'est trop cool ton texte
Jbernard13
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: [2D] Que pensez vous de ce code d'affichage de sprite

Message par G-Rom »

tu devrais prendre en compte la largeur de chaque lettre ;)

ps: c'est quoi ton pseudo sous bf3 ? :mrgreen:
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: [2D] Que pensez vous de ce code d'affichage de sprite

Message par Ar-S »

G-Rom a écrit :tu devrais prendre en compte la largeur de chaque lettre ;)
Pour que l'espacement soit moins important ?
G-Rom a écrit : ps: c'est quoi ton pseudo sous bf3 ? :mrgreen:
megabuz
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: [2D] Que pensez vous de ce code d'affichage de sprite

Message par G-Rom »

Pour que l'espacement soit moins important ?
Oui.

J'avais déjà codé un .pbi qui gerait les polices bitmap , elle incluait cette fonction avec prise en compte de l'alpha.
le principe est simple , à cause du canal alpha ( je parle de ca , il y a au moins un an...) je créait un sprite temporaire
avec un fond mauve $FF00FF , je collais ma lettre par dessus, puis j'avais quatre variables : minX , maxX , minY, maxY
les variable mini etait fixé à la taille du sprite , les max à 0

pour chercher les valeurs mini je parcourais les pixels de gauche à droite , dès que je tombait sur un pixel qui n'était pas de couleur $FF00FF et que la position du pixel était plus petit que minX, minX devenais égale à la position du pixel, idem pour les valeurs max ( de droite à gauche ) et idem pour les Y...

ensuite , ayant mes min/max , on peut définir la taille de la lettre au pixel près :

TailleX = MaxX - MinX
TailleY = MaxY - MinY

Chaque lettre était dans une structure qui contenait ces infos , au moment de l'affichage , y avait plus qu'a répercuté et le tour est joué ;)
Avatar de l’utilisateur
case
Messages : 1546
Inscription : lun. 10/sept./2007 11:13

Re: [2D] Que pensez vous de ce code d'affichage de sprite

Message par case »

Ar-S a écrit :[
G-Rom a écrit : ps: c'est quoi ton pseudo sous bf3 ? :mrgreen:
megabuz
muab

je joue pas souvent...
ImageImage
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: [2D] Que pensez vous de ce code d'affichage de sprite

Message par G-Rom »

case a écrit :
Ar-S a écrit :[
G-Rom a écrit : ps: c'est quoi ton pseudo sous bf3 ? :mrgreen:
megabuz
muab

je joue pas souvent...

C'est quand que je vous colle une bastos dans la tête à tout les deux ? :mrgreen:
Répondre