Texte et CanvasGadget

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: Texte et CanvasGadget

Message par G-Rom »

je te laisse finir l'alphabet... :mrgreen:

Code : Tout sélectionner

Structure text_matrice
  Array matrice.b(20) ; une lettre fait 4x5
                       ; on y accede en faisant x + 4 * y 
                       ; vu que l'on ne peut pas faire de multidimension
                       ; c'est la seule technique d'acces au élement valable
EndStructure


Global NewMap Letter.text_matrice()

Restore letter_space
For y = 0 To 4
  For x = 0 To 3
    Read.b Letter(" ")\matrice(x + 4 * y)
  Next
Next 

Restore letter_a
For y = 0 To 4
  For x = 0 To 3
    Read.b Letter("A")\matrice(x + 4 * y)
  Next
Next 

Restore letter_b
For y = 0 To 4
  For x = 0 To 3
    Read.b Letter("B")\matrice(x + 4 * y)
  Next
Next 

Restore letter_c
For y = 0 To 4
  For x = 0 To 3
    Read.b Letter("C")\matrice(x + 4 * y)
  Next
Next 



; Ecran virtuel
Global Dim IBM_SCREEN.i(80,24) ; l'index 0,0 n'est pas utilisé dans l'exemple !


; Quelques procedure de dessin pour l'écran virtuel 

; Affichage d'un simple pixel 
Procedure PutPixel(x,y,color)
  If (x > 0) And (x<=80) And (y > 0) And (y<=24)
    IBM_SCREEN(x,y) = color
  EndIf
EndProcedure

; Effacement de l'écran virtuel
Procedure ClearVirtualScreen(color=$0)
  For y = 1 To 24
    For x = 1 To 80
      IBM_SCREEN(x,y) = 0
    Next
  Next 
EndProcedure

; On trace une ligne horizontale :
Procedure DrawHLine(y,color)
  If y <= 24 And y > 0
    For x = 1 To 80
      IBM_SCREEN(x,y) = color
    Next 
  EndIf 
EndProcedure

; On trace une ligne horizontale en pointillié
Procedure DrawHLineDot(y,color)
  If y <= 24 And y > 0
    For x = 1 To 80 Step 2
      IBM_SCREEN(x,y) = color
    Next 
  EndIf 
EndProcedure

;une petite Procedure de rendu sur n'importe quoi , une image , une fenetre , un gadget , , un screen , un canvas...
Procedure RenderVirtualScreen(Output, OutputWidth, OutputHeight)
  w = OutputWidth  / 80
  h = OutputHeight / 24
  
  StartDrawing(Output)
    For y = 1 To 24
      For x = 1 To 80
        Box((x-1)*w, (y-1)*h, w,h,IBM_SCREEN(x,y))         
      Next
    Next 
  StopDrawing()
EndProcedure



Procedure DrawVirtualText(y,text.s,color.i=$FFFFFF)
  If y <= 24 And y > 0
    
    For i = 1 To Len(text)

    upperChar.s = UCase(Mid(text,i,1))
    ; On dessine le caractère
    For ty = 0 To 4
      For tx = 0 To 3
        Result.b = Letter(upperChar)\matrice(tx + 4 * ty)
        If Result = 1
          ; ATTENTION AU DEPASSEMENT , J'AI PAS FAIT LES TEST !!!!!!!
          IBM_SCREEN((tx+1)+(i*5),ty+y) = color
        EndIf   
      Next
    Next 
    Next 
    
  EndIf
EndProcedure




; Test

OpenWindow(0,0,0,640,480,"") ; fenetre de base
CanvasGadget(0,0,0,640,480)  ; la surface de rendu



Repeat
  event = WindowEvent()  
  If MyTimer < ElapsedMilliseconds()
    MyTimer = ElapsedMilliseconds() + 125
    
     ClearVirtualScreen() ; on efface l'écran virtuel

     DrawHLine(2,$FFFFFF) ; on trace une ligne horizontale
      DrawVirtualText(4,"BACA CACA")
     DrawHLine(10,$FFFFFF) ; on trace une ligne horizontale
     
     If dot = 0
       PutPixel(2,12,$FFFFFF)
       PutPixel(2,13,$FFFFFF)
       PutPixel(2,14,$FFFFFF)
       PutPixel(2,15,$FFFFFF)
       PutPixel(2,16,$FFFFFF)
     EndIf 
      
     RenderVirtualScreen(CanvasOutput(0),GadgetWidth(0),GadgetHeight(0)) ; on dessine le resultat sur le canvas.
     
     
     
     dot + 1
     dot%4
     
  EndIf 
Until event = #PB_Event_CloseWindow







; Les lettres sont composé de 4x5 unités

DataSection 
  letter_space:
  Data.b 0,0,0,0
  Data.b 0,0,0,0
  Data.b 0,0,0,0
  Data.b 0,0,0,0
  Data.b 0,0,0,0
EndDataSection

DataSection 
  letter_a:
  Data.b 0,1,1,0
  Data.b 1,0,0,1
  Data.b 1,1,1,1
  Data.b 1,0,0,1
  Data.b 1,0,0,1
EndDataSection

DataSection 
  letter_b:
  Data.b 1,1,1,0
  Data.b 1,0,0,1
  Data.b 1,1,1,0
  Data.b 1,0,0,1
  Data.b 1,1,1,0
EndDataSection

DataSection 
  letter_c:
  Data.b 0,1,1,0
  Data.b 1,0,0,1
  Data.b 1,0,0,0
  Data.b 1,0,0,1
  Data.b 0,1,1,0
EndDataSection
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Texte et CanvasGadget

Message par Kwai chang caine »

Ouaaaouuhh !! ce code de ouf !!! 8O
Et ben j'risquait pas de le sortir celui la :oops:

Ayait..j'ai compris comment on écrit...

Code : Tout sélectionner

DrawVirtualText(4,"BACA CACA")
Trop fort le KCC :oops:

Mille merci mon bon GRom 8)
Tu crois que ça serait abuser, de te demander si c'est possible de resizer ce CanvasGadget avec la fenêtre afin que les caractères suivent comme dans le code de DOBRO
Car en fait c'est l'effet que je recherche, et je pensais apparemment a tort que ce serais plus fluide et plus simple a faire avec la 4.60 et son CanvasGadget :roll:

Edit:
J'ai du mal m'exprimer, en fait je voudrais que y'ai 80 caractères en colonne et 24 en ligne, comme dans les vieux IBM quoi
J'ai comme l'impression que dans ton code c'est les caractères qui font 80x24...me trompe-je ??? :|
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: Texte et CanvasGadget

Message par G-Rom »

Edit:
J'ai du mal m'exprimer, en fait je voudrais que y'ai 80 caractères en colonne et 24 en ligne, comme dans les vieux IBM quoi
J'ai comme l'impression que dans ton code c'est les caractères qui font 80x24...me trompe-je ???
:roll:

80x24 pixels ou caractère , c'est pas pareil...
sinon le code corrigé :

Code : Tout sélectionner

Structure text_matrice
  Array matrice.b(20) ; une lettre fait 4x5
                       ; on y accede en faisant x + 4 * y 
                       ; vu que l'on ne peut pas faire de multidimension
                       ; c'est la seule technique d'acces au élement valable
EndStructure


Global NewMap Letter.text_matrice()

Restore letter_space
For y = 0 To 4
  For x = 0 To 3
    Read.b Letter(" ")\matrice(x + 4 * y)
  Next
Next 

Restore letter_a
For y = 0 To 4
  For x = 0 To 3
    Read.b Letter("A")\matrice(x + 4 * y)
  Next
Next 

Restore letter_b
For y = 0 To 4
  For x = 0 To 3
    Read.b Letter("B")\matrice(x + 4 * y)
  Next
Next 

Restore letter_c
For y = 0 To 4
  For x = 0 To 3
    Read.b Letter("C")\matrice(x + 4 * y)
  Next
Next 

Restore letter_d
For y = 0 To 4
  For x = 0 To 3
    Read.b Letter("D")\matrice(x + 4 * y)
  Next
Next 


; Ecran virtuel
Global Dim IBM_SCREEN.i(80,24) ; l'index 0,0 n'est pas utilisé dans l'exemple !


; Quelques procedure de dessin pour l'écran virtuel 

; Affichage d'un simple pixel 
Procedure PutPixel(x,y,color)
  If (x > 0) And (x<=80) And (y > 0) And (y<=24)
    IBM_SCREEN(x,y) = color
  EndIf
EndProcedure

; Effacement de l'écran virtuel
Procedure ClearVirtualScreen(color=$0)
  For y = 1 To 24
    For x = 1 To 80
      IBM_SCREEN(x,y) = 0
    Next
  Next 
EndProcedure

; On trace une ligne horizontale :
Procedure DrawHLine(y,color)
  If y <= 24 And y > 0
    For x = 1 To 80
      IBM_SCREEN(x,y) = color
    Next 
  EndIf 
EndProcedure

; On trace une ligne horizontale en pointillié
Procedure DrawHLineDot(y,color)
  If y <= 24 And y > 0
    For x = 1 To 80 Step 2
      IBM_SCREEN(x,y) = color
    Next 
  EndIf 
EndProcedure

;une petite Procedure de rendu sur n'importe quoi , une image , une fenetre , un gadget , , un screen , un canvas...
Procedure RenderVirtualScreen(Output, OutputWidth, OutputHeight)
  w.f = OutputWidth  / 80
  h.f = OutputHeight / 24
  
  StartDrawing(Output)
    For y = 1 To 24
      For x = 1 To 80
        Box((x-1)*w, (y-1)*h, w,h,IBM_SCREEN(x,y))         
      Next
    Next 
  StopDrawing()
EndProcedure



Procedure DrawVirtualText(y,text.s,color.i=$FFFFFF)
  If y <= 24 And y > 0
    
    For i = 1 To Len(text)

    upperChar.s = UCase(Mid(text,i,1))
    ; On dessine le caractère
    For ty = 0 To 4
      For tx = 0 To 3
        Result.b = Letter(upperChar)\matrice(tx + 4 * ty)
        If Result = 1
          ; ATTENTION AU DEPASSEMENT , J'AI PAS FAIT LES TEST !!!!!!!
          IBM_SCREEN((tx+1)+(i*5),ty+y) = color
        EndIf   
      Next
    Next 
    Next 
    
  EndIf
EndProcedure




; Test

OpenWindow(0,0,0,640,480,"",#PB_Window_SystemMenu  | #PB_Window_SizeGadget) ; fenetre de base
CanvasGadget(0,0,0,640,480)  ; la surface de rendu



Repeat
  event = WindowEvent()  
  
  
  
  If event = #PB_Event_SizeWindow
    ResizeGadget(0,0,0,WindowWidth(0),WindowHeight(0))
  EndIf 
  
  
  
  
  
  If MyTimer < ElapsedMilliseconds()
    MyTimer = ElapsedMilliseconds() + 125
    
     ClearVirtualScreen() ; on efface l'écran virtuel

     DrawHLine(2,$FFFFFF) ; on trace une ligne horizontale
      DrawVirtualText(4,"BACA CACA")
      DrawVirtualText(12,"ADADA")
     DrawHLine(10,$FFFFFF) ; on trace une ligne horizontale
     
     If dot = 0
       PutPixel(7*5,12,$FFFFFF)
       PutPixel(7*5,13,$FFFFFF)
       PutPixel(7*5,14,$FFFFFF)
       PutPixel(7*5,15,$FFFFFF)
       PutPixel(7*5,16,$FFFFFF)
     EndIf 
      
     RenderVirtualScreen(CanvasOutput(0),GadgetWidth(0),GadgetHeight(0)) ; on dessine le resultat sur le canvas.
     
     
     
     dot + 1
     dot%4
     
  EndIf 
Until event = #PB_Event_CloseWindow







; Les lettres sont composé de 4x5 unités

DataSection 
  letter_space:
  Data.b 0,0,0,0
  Data.b 0,0,0,0
  Data.b 0,0,0,0
  Data.b 0,0,0,0
  Data.b 0,0,0,0
EndDataSection

DataSection 
  letter_a:
  Data.b 0,1,1,0
  Data.b 1,0,0,1
  Data.b 1,1,1,1
  Data.b 1,0,0,1
  Data.b 1,0,0,1
EndDataSection

DataSection 
  letter_b:
  Data.b 1,1,1,0
  Data.b 1,0,0,1
  Data.b 1,1,1,0
  Data.b 1,0,0,1
  Data.b 1,1,1,0
EndDataSection

DataSection 
  letter_c:
  Data.b 0,1,1,0
  Data.b 1,0,0,1
  Data.b 1,0,0,0
  Data.b 1,0,0,1
  Data.b 0,1,1,0
EndDataSection


DataSection 
  letter_d:
  Data.b 1,1,1,0
  Data.b 1,0,0,1
  Data.b 1,0,0,1
  Data.b 1,0,0,1
  Data.b 1,1,1,0
EndDataSection







Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Texte et CanvasGadget

Message par Kwai chang caine »

80x24 pixels ou caractère , c'est pas pareil...
Excuse moi :oops:
C'est pour ça que quand je voyais ces gros carrés blancs..je comprenais pas grand chose..remarque..y'a pas besoin que y'ai des gros carrés blancs :oops:

Trop cool...c'est exactement ça !!!! :D
Enfin presque, les caracteres sont un peu grand, mais ça tu l'a compris :oops:
Et quand je resize ça me laisse des traces de petites barres :(
Peut etre ma machine a une carte vidéo de dauble, car je ne joue jamais alors j'ai une vieille carte qui a au moins 5 ans
Image
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: Texte et CanvasGadget

Message par G-Rom »

c'est normal les carré, va dans la procedure de rendu , passe les tailles des cubes et les position en float. ;)
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Texte et CanvasGadget

Message par Backup »

.......
Dernière modification par Backup le dim. 08/janv./2012 13:35, modifié 1 fois.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Texte et CanvasGadget

Message par Backup »

pardon code ci dessus réédité ;)
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Texte et CanvasGadget

Message par Backup »

...
Dernière modification par Backup le mar. 19/août/2014 10:42, modifié 1 fois.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Texte et CanvasGadget

Message par Backup »

code réédité
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Texte et CanvasGadget

Message par Kwai chang caine »

G-Rom a écrit :c'est normal les carré, va dans la procedure de rendu , passe les tailles des cubes et les position en float. ;)
Je vais essayé merci 8)

@DOBRO
C'est super net, mais par rapport a ton code de DOS on a perdu l'effet que je cherche le resizing :(
En plus, ça scintille Blanc/noir chez moi au resizing 8O
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Texte et CanvasGadget

Message par Backup »

Kwai chang caine a écrit :
G-Rom a écrit :c'est normal les carré, va dans la procedure de rendu , passe les tailles des cubes et les position en float. ;)
Je vais essayé merci 8)

@DOBRO
C'est super net, mais par rapport a ton code de DOS on a perdu l'effet que je cherche le resizing :(
En plus, ça scintille Blanc/noir chez moi au resizing 8O
non retest le dernier code ... (élargi la fenetre horizontalement )

le seul probleme il faut avoir le rapport pixel---taille de fonte :)
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Texte et CanvasGadget

Message par Kwai chang caine »

@DOBRO
Ah oui excuse moi, j'avais pas vu :oops:
Mais ça reste quand meme moins parfait que ton code en 4.51

En fait c'est exactement ce que je recherchais, sauf que les caractères sont un peu petits, mais peut être que j'arriverais a les agrandir
Et surtout qu'il me semble que ton code occupe bien la machine
Je suis en train de voir si je peux l'adapter a ce que je cherche a faire....un vrai faux ecran d'IBM :mrgreen:
Dernière modification par Kwai chang caine le dim. 08/janv./2012 13:49, modifié 1 fois.
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Texte et CanvasGadget

Message par Kwai chang caine »

GRom a écrit :c'est normal les carré, va dans la procedure de rendu , passe les tailles des cubes et les position en float. ;)
J'ai éssayé de faire ça, j'sais pas si c'est ce que tu voulais dire ?? :roll:
Il me semble que ça va un peu mieux, mais en bougeant pas mal par moment y'a encore des petites barres chez moi :roll:

J'ai pas pu passer les x et y en float, il veut pas pour un For/next :?

Code : Tout sélectionner

;une petite Procedure de rendu sur n'importe quoi , une image , une fenetre , un gadget , , un screen , un canvas...
Procedure RenderVirtualScreen(Output.f, OutputWidth.f, OutputHeight.f)
  w.f = OutputWidth  / 80
  h.f = OutputHeight / 24
   
  StartDrawing(Output)
    For y = 1 To 24
      For x = 1 To 80
        Box((x-1)*w, (y-1)*h, w,h,IBM_SCREEN(x,y))         
      Next
    Next
  StopDrawing()
EndProcedure
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Texte et CanvasGadget

Message par Backup »

...
Dernière modification par Backup le mar. 19/août/2014 10:43, modifié 1 fois.
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: Texte et CanvasGadget

Message par G-Rom »

J'ai pas pu passer les x et y en float, il veut pas pour un For/next
Code:

Remplace :
Box((x-1)*w, (y-1)*h, w,h,IBM_SCREEN(x,y))

par :
PosX.f = (x-1)*w
PosY.f = (y-1)*h
Box(PosX, PosY, w,h,IBM_SCREEN(x,y))
Répondre