Fenetre de Texte - Retour à la ligne

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Kayne
Messages : 157
Inscription : sam. 06/oct./2007 18:33
Contact :

Fenetre de Texte - Retour à la ligne

Message 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
__________________________________________

Débutant les tutoriels de mon site sont la pour vous n'hésitez pas à aller les voir: http://tripamort.free.fr/
__________________________________________
Kayne - Webmaster de http://tripamort.free.fr/
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message 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...
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message 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
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Répondre