Page 1 sur 2

Méthode "Font Tiles PNG" vers Sprite3D pour créer du texte.

Publié : mer. 15/févr./2012 12:02
par Ar-S
Bonjour neigeux.
M'étant mis à la 2D et autres effets de particules depuis peu, j'aimerai savoir quelle est selon vous la méthode la plus efficace pour créer texte graphique à partir d'une planche .png

Voilà une représentation de la planche
Image

- L'image réelle fait 1024x512
- Les lettres sont dans des cases de 128x128
- Le fond est complètement transparent

A la manière de ce qu'avait fait Taznorman dans ce topic

Seulement je voudrais utiliser les Sprite3D vu la fluidité de ces derniers.

Ma question est :
- Dois-je créer un grand sprite3D à partir d'un grand sprite (de la taille de ma planche) ?
Si oui comment faire un genre de grabsprite() sur ce sprite3D ?

ou

- Dois-je créer un grand sprite() de la taille de ma planche puis créer autant de sprite que de lettres (128x128) puis créer autant de sprite3D ?
ça me parait bien contraignant.

ou

y'a t il d'autres solutions ?

D'avance merci.

Re: Méthode "Font Tiles PNG" vers Sprite3D pour créer du tex

Publié : mer. 15/févr./2012 12:15
par Backup
tu charge ton sprite geant !
puis tu utilise ClipSprite(#Sprite, x, y, Largeur, Hauteur)

cela reviens a avoir un petit sprite piqué sur le gros , mais sans en creer un
il s'agit toujours du Sprite Geant, mais clippé :)
la taille sera donc, bien la taille d'une lettre :)

ensuite tu crees le sprite 3d avec ..

Re: Méthode "Font Tiles PNG" vers Sprite3D pour créer du tex

Publié : mer. 15/févr./2012 12:50
par Ar-S
sur le principe ça me parait bien, mais que fait on avec LoadTexture ?
Vu que la texture est en fait la planche elle même ?
Je vois pas trop comment la "caler" sur un sprite qui a été grabbé

Re: Méthode "Font Tiles PNG" vers Sprite3D pour créer du tex

Publié : mer. 15/févr./2012 13:00
par Backup
ben avant de faire clipsprite(#sprite

tu fait ton LoadSprite(#Sprite, NomFichier$ ,#PB_Sprite_Texture )

du coup #sprite est texturé pour la 3D

donc ton #sprite du clipsprite le sera aussi :)
plus qu'a faire

CreateSprite3D(#Sprite3D, #Sprite)

en clair :

Code : Tout sélectionner

#Sprite=1
#Sprite3D=1

LoadSprite(#Sprite, NomFichier$ ,#PB_Sprite_Texture ) ; tu charge le mega sprite
ClipSprite(#Sprite, x, y, x+12, y+24) ; tu le reduit une lettre = 12 par 24..par ex
CreateSprite3D(#Sprite3D, #Sprite) ; tu fait ton sprite 3d

Re: Méthode "Font Tiles PNG" vers Sprite3D pour créer du tex

Publié : mer. 15/févr./2012 13:04
par Backup
j'ai reedité mon message le dernier

Re: Méthode "Font Tiles PNG" vers Sprite3D pour créer du tex

Publié : mer. 15/févr./2012 14:28
par Ar-S
J'ai essayé avec uniquement la première ligne pour tester mais ça chie.
Je me retrouve avec des sprite3D de la taille de mon sprite non clippé.
L'affichage est du coup tout superposé.

Code : Tout sélectionner

  
   ; ------------------------------------------------------------
  ;  Test Font PB 4.60 by Ar-S
  ; ------------------------------------------------------------
  
UsePNGImageDecoder()
  

  ; --- Sprites ----
Enumeration
  #S1 
EndEnumeration
  
Enumeration 1
  ;Sprite 3D
  #S3D_A
  #S3D_B
  #S3D_C
  #S3D_D
  #S3D_E
  #S3D_F
  #S3D_G
  #S3D_H
  #S3D_I
  #S3D_J
  #S3D_K
  #S3D_L
  #S3D_M
  #S3D_N
  #S3D_O
  #S3D_P
  #S3D_Q
  #S3D_R
  #S3D_S
  #S3D_T
  #S3D_U
  #S3D_V
  #S3D_W
  #S3D_X
  #S3D_Y
  #S3D_Z
EndEnumeration


Global.i Width, Height, Depth, RefreshRate
Global TailleAlph.i = 128
ClipX = 0
ClipY = 0

If InitEngine3D()
  
  Add3DArchive("Datas", #PB_3DArchive_FileSystem)
  
  InitSprite()
  InitSprite3D()
  InitKeyboard()
  
  ExamineDesktops()
  ExamineScreenModes()
  
  Width      = DesktopWidth(0)
  Height      = DesktopHeight(0)
  Depth      = DesktopDepth(0)
  RefreshRate  = DesktopFrequency(0)
  
  
  Result = OpenScreen(Width, Height, Depth, "Ar-S TEST Font", #PB_Screen_WaitSynchronization, RefreshRate)
  
  Debug Result
  
  ARSfont = LoadSprite(#S1, "datas\ARS_LettresRED.png", #PB_Sprite_Texture|#PB_Sprite_AlphaBlending)
  If ARSfont = 0
    Debug "Erreur loadsprite 3D"
  EndIf
  
  For CLIP = 1 To 8 ; (1ere ligne)
    ClipSprite(#S1, ClipX, ClipY, TailleAlph, TailleAlph)
    CreateSprite3D(CLIP, #S1)
    ClipX + TailleAlph
  Next  
  
  
  Sprite3DQuality(1)
  
  
  ;Dimension et données concernant le logo
  X3D = 0 ; (Width / 2) - (TailleAlph / 2)
  Y3D = 0 ; (Height / 2) - (TailleAlph / 2)
  SP = 1
  
  ;----------
  
  
  Repeat
    FlipBuffers()
    ClearScreen(0)
    
    ExamineKeyboard()
    RenderWorld()
    
    ;- Mouvement du Logo
    If Start3D()
        
        
        For SP = 1 To 8 ; teste avec la ligne 1
          DisplaySprite3D(SP, X3D, Y3D,255)
          X3D + TailleAlph
          
        Next
        
        
      Stop3D()
      
      
    EndIf
    
  Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  
Else
  MessageRequester("Error", "The 3D Engine can't be initialized",0)
EndIf
  
End

Re: Méthode "Font Tiles PNG" vers Sprite3D pour créer du tex

Publié : mer. 15/févr./2012 14:35
par Backup
dans ce cas ,utilise Grabsprite en lieu et place de ClipSprite ;)

Re: Méthode "Font Tiles PNG" vers Sprite3D pour créer du tex

Publié : mer. 15/févr./2012 14:37
par Cool Dji
Salut Ar-S,

Pour ça, je charge la planche complete sous forme d'image puis avec grabimage je créé des sprites puis createsprite3D.

Code : Tout sélectionner

LoadImage(0,"Data/Editeur/police.bmp")

For j =0 To 46:GrabImage(0,1,j*6,0,6,7)
    CreateSprite(j,6,7,#PB_Sprite_Texture)
    TransparentSpriteColor(j, 0)
    StartDrawing(SpriteOutput(j))
    DrawImage(ImageID(1),0,0)
    StopDrawing()
    CreateSprite3D(j, j)
Next
Edit : Dobro a été plus rapide :D

Re: Méthode "Font Tiles PNG" vers Sprite3D pour créer du tex

Publié : mer. 15/févr./2012 14:42
par Ar-S
Ok je vais tester..
Merci

Re: Méthode "Font Tiles PNG" vers Sprite3D pour créer du tex

Publié : mer. 15/févr./2012 15:01
par Ar-S
Bon nouveau soucis, avec ce code.
mon PNg a un fond transparent, il faut donc que j'utilise l'option #PB_Sprite_AlphaBlending au lieu de #PB_Sprite_texture
Et la doc dit "Il n'est pas possible d'utiliser SpriteOutput() (et par conséquent les fonctions de dessin 2D) avec un sprite du type #PB_Sprite_Alpha."
il me semble que ça foire aussi avec #PB_Sprite_AlphaBlending non ?

C'est en train de m'irriter. Je crois que je vais finir par créer x images différentes pour chaque sprite.

Re: Méthode "Font Tiles PNG" vers Sprite3D pour créer du tex

Publié : mer. 15/févr./2012 17:28
par Backup
Ar-S a écrit : C'est en train de m'irriter. Je crois que je vais finir par créer x images différentes pour chaque sprite.
c'est cool , tu amene de l'eau a mon moulin,lorsque je dis que Pb est bancale ! :)

Re: Méthode "Font Tiles PNG" vers Sprite3D pour créer du tex

Publié : mer. 15/févr./2012 18:28
par Ar-S
Dobro a écrit :
Ar-S a écrit : C'est en train de m'irriter. Je crois que je vais finir par créer x images différentes pour chaque sprite.
c'est cool , tu amene de l'eau a mon moulin,lorsque je dis que Pb est bancale ! :)
Pour sa défense je suis bancale aussi :wink:
Et puis les Sprite3D c'est pas si vieux.

Re: Méthode "Font Tiles PNG" vers Sprite3D pour créer du tex

Publié : mer. 15/févr./2012 19:01
par Ar-S
Bon j'arrive à charger tous mes sprites en sprite3d mais lors du display() j'ai un clignotement tout moche.

Donc comme je l'ai dit plus haut j'ai créé 28 images de 128 x 128 (1.png, 2.png, 3.png etc...)
contenant les lettres de A à Z ainsi que l'apostrophe et le symbole "moins"

Code : Tout sélectionner


   ; ------------------------------------------------------------
  ;  Test Font PB 4.60 by Ar-S
  ; ------------------------------------------------------------
  
UsePNGImageDecoder()
  

    ;Sprite 3D
Enumeration 1
  
  #S3D_A
  #S3D_B
  #S3D_C
  #S3D_D
  #S3D_E
  #S3D_F
  #S3D_G
  #S3D_H
  #S3D_I
  #S3D_J
  #S3D_K
  #S3D_L
  #S3D_M
  #S3D_N
  #S3D_O
  #S3D_P
  #S3D_Q
  #S3D_R
  #S3D_S
  #S3D_T
  #S3D_U
  #S3D_V
  #S3D_W
  #S3D_X
  #S3D_Y
  #S3D_Z
  #S3D_Tiret
  #S3D_Apos
  
EndEnumeration


Global.i Width, Height, Depth, RefreshRate
Global TailleAlph.i = 128

If InitEngine3D()
  
  Add3DArchive("Datas", #PB_3DArchive_FileSystem)
  
  InitSprite()
  InitSprite3D()
  InitKeyboard()
  
  ExamineDesktops()
  ExamineScreenModes()
  
  Width      = DesktopWidth(0)
  Height      = DesktopHeight(0)
  Depth      = DesktopDepth(0)
  RefreshRate  = DesktopFrequency(0)
  
  ;Dimension et données concernant le logo
  X3D = 0 ; (Width / 2) - (TailleAlph / 2)
  Y3D = 0 ; (Height / 2) - (TailleAlph / 2)
  SP = 1 ; numéro du 1er sprite
  
  Result = OpenScreen(Width, Height, Depth, "Ar-S TEST Font", #PB_Screen_WaitSynchronization, RefreshRate)
  
  Debug Result
  
  For Sprite = #S3D_A To #S3D_Apos
    Sprite3D = Sprite
    LoadSprite(Sprite, "E:\MULTIMEDIA\****\ARS_RESSOURCES\"+Str(Sprite)+".png", #PB_Sprite_Texture|#PB_Sprite_AlphaBlending)
    CreateSprite3D(Sprite3D, Sprite)
  Next

  Sprite3DQuality(1) ; 1 = #PB_Sprite3D_BilinearFiltering
  
  ;----------
  
  
  Repeat
    
    FlipBuffers()
    ;ClearScreen(0)
    
    ExamineKeyboard()
    RenderWorld()
    
    ;- Mouvement du Logo
    If Start3D()
        
        If SP < 29
          
           DisplaySprite3D(SP, X3D, Y3D, 255)
            
            If X3D > Width - TailleAlph
              X3D = 0
              Y3D + TailleAlph
            EndIf
            
            If Y3D > (Height - TailleAlph)
              Y3D = 0
              
            EndIf
            
            
            X3D + TailleAlph
            
            Debug "Y3D : " + Str(Y3D) + " Sprite : "+ Str(SP)
  
            SP + 1
        
        EndIf
          
        
        
      Stop3D() 
      
      
    EndIf
    
    
  Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  
Else
  MessageRequester("Error", "The 3D Engine can't be initialized",0)
EndIf
  
End

Re: Méthode "Font Tiles PNG" vers Sprite3D pour créer du tex

Publié : mer. 15/févr./2012 19:29
par Cool Dji
Là, je mange et après je poste un exemple avec une routine qui décrypte les textes et pointe sur les bons sprites.
J'utilise le même système pour des textes en 3d avec des caractères en . mesh

Re: Méthode "Font Tiles PNG" vers Sprite3D pour créer du tex

Publié : mer. 15/févr./2012 22:06
par Cool Dji
Hop,

Voici l'ébauche de mon nouvel éditeur 3D dans lequel il y a des affichages de textes en 2D et en 3D
J'ai repris et combiné diverses sources du forum, de PB...

J'espère que ça pourra aider :D

http://xdji.free.fr/Telechargement/Base3D.zip

pour bouger : fleches du clavier
pour entrer dans l'éditeur : shift gauche appuyé => dans ce cas, l'écran de jeu est bloqué
pour bouger le scale sur (x,y et z) en même temps controle gauche appuyé

Textes en 3D
- Chargement des mesh (1 par lettre) les mesh sont dans Data/Mesh/letter
ligne 307
- construction du texte (1 entity par caractère sauf espace)
ligne 321


Textes en 2D

- chargement du fichier et création des sprites pour les lettres (le fichier image est dans Data/Editeur)
ligne 252
- Procédures affichage de textes
lignes 92 et 105 (algo à refaire sur le principe de l'algo des textes 3D)
- Appel d'une procédure (AffT3d) dans la boucle
ligne 424