Page 1 sur 1

Fenetre de Texte - Retour à la ligne

Publié : mar. 26/août/2008 12:35
par Kayne
Bonjour à tous,
Pour un programme j'ai fait un script qui me permet d'ajouter du texte sur un sprite et le texte est censé aller à la ligne tout seul quand sa longeur est trop grande pour la largeur du sprite. Mais il y a beaucoup de bugs j'aimerais savoir ce qui ne va pas avec cette partie retour à la ligne ...

Code : Tout sélectionner

Procedure TexteFenetre(Fenetreid,text$)
  TexteId = Fenetreid+100
  ;chargement des polices
  LoadFont(2,"Courrier News",8)
  
  largeur = SpriteWidth(Fenetreid)-10
  hauteur = SpriteHeight(Fenetreid)-10
  CreateSprite(Textid,largeur+10,hauteur+10)
  StartDrawing(SpriteOutput(Textid))
    For i = 30 To (hauteur+10)
      couleur.f = 100+(i/(hauteur+10)*155) 
      If couleur>255:couleur = 255:EndIf
      Line(0,i,largeur+10,0,RGB(255,couleur,couleur))
    Next i
    FrontColor(RGB(50,0,0))
    DrawingMode(1)
    DrawingFont(FontID(2))
    texte$ = text$ + " "
    largeurTexte = TextWidth(texte$)
    nombre_ligne = Int(largeurTexte/largeur)+1
    nombre_car = Int(Len(texte$)/nombre_ligne)+1
    For i = 1 To nombre_ligne
      If Right(ajout$+Mid(texte$,(i-1)*nombre_car+1,nombre_car),1) =" "
        DrawText(5,30+i*20,ajout$+Mid(texte$,(i-1)*nombre_car+1,nombre_car))
        ajout$ = ""
      Else
        nombre_mots = CountString(ajout$+Mid(texte$,(i-1)*nombre_car+1,nombre_car)," ")+1
        rejet$ = StringField(ajout$+Mid(texte$,(i-1)*nombre_car+1,nombre_car),nombre_mots," ")
        DrawText(5,30+i*20,Left(ajout$+Mid(texte$,(i-1)*nombre_car+1,nombre_car),Len(Mid(texte$,(i-1)*nombre_car+1,nombre_car))-Len(rejet$)))
        ajout$ = rejet$
      EndIf
    Next
  StopDrawing()
EndProcedure

Publié : jeu. 30/oct./2008 12:27
par Ollivier
Visiblement, tu « pipes » un peu trop les écarts (tu testes des valeurs arbitraires en pixels sans en déterminer les calculs, ce qui est concrètement viable, mais pas très souple dès que tu changes le moindre paramètre, par exemple, la hauteur de la police)

Voici une méthode de départ:
(Le but est d'afficher un paragraphe dans un rectangle, donc commencer sans les sprites)

- Trace un rectangle (300 par 100 pixels)
- Affiche-y le paragraphe (texte) mot à mot en vérifiant que le prochain mot ne dépasse pas les 300 pixels.
- Si dépassement, alors remise à la ligne suivante

Voici un exemple de procédure de découpage Mot à mot :

Code : Tout sélectionner

Procedure.S MAM(Texte.S)
   Protected Mot.S
   Protected LTexte.L
   Protected i.L
   Protected Cara.S
   Static PtrTexte.L
   Mot = ""
   LTexte = Len(Texte)
   If LTexte = 0
      PtrTexte = 1
   Else
      If PtrTexte <= LTexte
         For i = PtrTexte To LTexte
            Cara = Mid(Texte, i, 1)
            If Cara = " "
               Break
            Else
               Mot = Mot + Cara
            EndIf
         Next i
         PtrTexte = i + 1
      EndIf
   EndIf
ProcedureReturn Mot
EndProcedure
La sortie MAM() est dépourvue de caractère (chaîne vide "") s'il n'y a plus de mots à lire. Sinon, elle contient chaque mot respectif à chacun de ses appels. Pour revenir en début de phrase, il faut faire un appel initial MAM("").

Exemple :

Code : Tout sélectionner

   Define Chaine.S
   Define Mot.S
   Chaine = "C'est donc OK Chorale..."
   MAM("")
   Repeat
      Mot = MAM(Chaine)
      If Mot: Debug Mot: EndIf
   Until Mot = ""
Devrait afficher :

Code : Tout sélectionner

C'est
donc
OK
Chorale...
ça devrait te permettre de faciliter les choses pour la fabrication des sprites après...

Publié : ven. 31/oct./2008 19:29
par Le Soldat Inconnu
voila une autre méthode, tu donnes la longueur en pixel a laquelle le texte doit être coupé

voir ici
http://www.purebasic.fr/french/viewtopic.php?t=7760