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