Dotmatrix Beispiel

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
gekkonier
Beiträge: 314
Registriert: 20.04.2007 09:06
Wohnort: Wien

Dotmatrix Beispiel

Beitrag von gekkonier »

Vielleicht kanns wer brauchen - wer grössere "Dotpixel" haben will oder den "Font" mit anderen Dimensionen haben will müsste halt die entsprechenden Stellen anpassen.

Beschreibung:
Dieses Beispiel zeigt die Möglichkeit numerische Werte in einer Art Dotmatrix (1 Dot = 1 Sprite) an der gewünschten Stelle in einem Screen anzuzeigen.

Anleitung:
Quelltext abspeichern, Ein PNG ins selbe Verzeichnis (8x8 Pixel) mit Namen "dot_8x8.png" - das sollte einen einzelnen Punkt darstellen!

Anmerkung:
Natürlich könnte man in Procedure DrawNumber(value.i, posx.i, posy.i) sich den Zwischenschritt mit dem ins temporäre Array kopieren ersparen, aber es läuft *g*

Screenshot vom Fenster:
Bild

Der Quelltext davon:

Code: Alles auswählen

; weil ich ein png als spritegrafik verwenden will
UsePNGImageDecoder()

Enumeration ;sprites
  #dotmatrixpic
EndEnumeration

; initstuff - fehlerbehandlung ist dein kaffee ;)
InitSprite()
InitKeyboard()
OpenWindow(0,0,0,200,200,"test")
OpenWindowedScreen(WindowID(0), 0,0,200,200,0,0,0)

; unten in der datasection trage dein 8x8 pix für einen dot ein
CatchSprite(#dotmatrixpic, ?dotmatriximage)


; die dotmatrix ist ein array mit den Zahlen 0 bis 9
; eine zahl ist 3 breit, und 5 hoch bei 10 ziffern muss die matrix also 30 breit sein
Global Dim dotmatrix.i(30,5)

; einlesen ins array
Restore dotmatrixdata
For y = 0 To 4
  For x = 0 To 29
    Read dotmatrix(x,y)
  Next
Next

; das wird verwendet um die uebergebene nummer an posx und posy anzuzeigen
; das png, welches als sprite verwendet wird sollte 8x8 pixel haben.
; andere bildgroessen lassen sich leicht dynamisieren, indem du die entsprechenden
; positionierung umschreibst, ich beschränke mich auf einen 8x8 "bildpunkt"
Procedure DrawNumber(value.i, posx.i, posy.i)
  
  ; helferleins
  valuestr.s = Str(value)
  valuelen.i = Len(valuestr)
  outputmatrixdimension = valuelen * 4

  ; hier erstelle ich ein array mit den notwendigen dimension
  Dim outputmatrix(outputmatrixdimension, 4)
  
  ; hier kopiere ich die "buchstaben" aus der dotmatrixdata in meine outputmatrix
  For valuepos = 0 To valuelen - 1
    dotmatrixoffset = Val(Mid(valuestr, valuepos+1, 1)) * 3
    For innerpos = 0 To 2
      For y = 0 To 4
        outputmatrix(valuepos*3 + valuepos + innerpos, y) = dotmatrix(dotmatrixoffset + innerpos, y)
      Next
    Next
  Next
  
  ; hier wird die outputmatrix an der gewünschten Stelle ausgegeben
  For y = 0 To 4
    For x = 0 To outputmatrixdimension
      If outputmatrix(x,y) = 1
        DisplaySprite(#dotmatrixpic, x*8+posx, y*8+posy)
      EndIf
    Next
  Next
  
EndProcedure

; mainloop
Repeat
  ; windowevents wollen abgefragt werden, sonst schmiert das ab!
  Repeat
    event=WindowEvent()
    Select event
      Case #PB_Event_Gadget
        If EventGadget() = 0
          End
        EndIf
      Case #PB_Event_CloseWindow
        End
    EndSelect
  Until event=0
  ExamineKeyboard()
  ; hier die zeichenroutinen
  ClearScreen(RGB(0,0,0))
  ; und hier zeigen wir unseren supertollen highscore endlich an ;)
  DrawNumber(345,20, 20)
  DrawNumber(915, 20, 80)
  FlipBuffers()
  Delay(1)
Until KeyboardPushed(#PB_Key_Escape)

DataSection
; die Ziffern 0 bis 9
dotmatrixdata:
Data.l 1,1,1, 0,0,1, 1,1,1, 1,1,1, 1,0,1, 1,1,1, 1,1,1, 1,1,1, 1,1,1, 1,1,1
Data.l 1,0,1, 0,0,1, 0,0,1, 0,0,1, 1,0,1, 1,0,0, 1,0,0, 0,0,1, 1,0,1, 1,0,1
Data.l 1,0,1, 0,0,1, 1,1,1, 1,1,1, 1,1,1, 1,1,1, 1,1,1, 0,0,1, 1,1,1, 1,1,1
Data.l 1,0,1, 0,0,1, 1,0,0, 0,0,1, 0,0,1, 0,0,1, 1,0,1, 0,0,1, 1,0,1, 0,0,1
Data.l 1,1,1, 0,0,1, 1,1,1, 1,1,1, 0,0,1, 1,1,1, 1,1,1, 0,0,1, 1,1,1, 1,1,1
dotmatriximage:
IncludeBinary "dot_8x8.png"
EndDataSection
Edit: FlipBuffers() im Code vergessen >_<
Benutzeravatar
WPö
Moderator
Beiträge: 669
Registriert: 27.05.2008 12:44
Wohnort: Oberland
Kontaktdaten:

Re: Dotmatrix Beispiel

Beitrag von WPö »

Jaaa, sehr schön das Ganze. Kann man alternativ mit DrawImage oder so machen, weil ich glaube, allzuviele Sprites belasten die Grafikkarte zu sehr. Möglich, daß ich mich täusche. Dieses Wissen stammt noch aus meiner Amiga-Zeit. Naja, bei Grafikkarten von mehr als 128kB sollte es keine Probleme geben. Inzwischen haben wir da tlw. die 4000fache Menge.

Gruß - WPo
Ich glaube nur der Statistik, die ich selbst gefälscht habe!
Meine Netzpräsenz: WPö.de
PB5.31 auf LMDE und Pentium T7200 2,00GHz, 4GB DDR2, ATI X1400.
Benutzeravatar
gekkonier
Beiträge: 314
Registriert: 20.04.2007 09:06
Wohnort: Wien

Re: Dotmatrix Beispiel

Beitrag von gekkonier »

Stimmt schon, aber in Zeiten wo Diablo2 (Spriteorgie ohne Ende) auf allen Rechnern läuft sollte das kein Problem sein *g*
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Re: Dotmatrix Beispiel

Beitrag von Kaeru Gaman »

@gekkonier

nice! :allright:


@WPo

hier ist nur ein Sprite drin, dafür sollte doch genug Platz sein?
und gerade wenn man ein Bild tausend mal darstellen will, nimmt man Sprites statt Images.

Hier stellt sich lediglich die Frage, ob man auf Image oder auf Screen arbeiten will.
Screen ist schneller, Animiertes Image passt besser in Window-GUIs.
Images auf Screen darstellen kann man komplett vergessen, viel zu langsam.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
WPö
Moderator
Beiträge: 669
Registriert: 27.05.2008 12:44
Wohnort: Oberland
Kontaktdaten:

Re: Dotmatrix Beispiel

Beitrag von WPö »

Jupp. Hab mich nur seit Amiga-Zeiten nicht mehr mit dem Thema beschäftigt. Danke!
Gruß - WPo
Ich glaube nur der Statistik, die ich selbst gefälscht habe!
Meine Netzpräsenz: WPö.de
PB5.31 auf LMDE und Pentium T7200 2,00GHz, 4GB DDR2, ATI X1400.
tinux
Beiträge: 12
Registriert: 06.12.2006 02:29
Wohnort: Bayern
Kontaktdaten:

Re: Dotmatrix Beispiel

Beitrag von tinux »

Dot_Matrix 5x7

Code: Alles auswählen

EnableExplicit

Procedure Dot_Matrix(text.s,x,y,dot_w_h,LEDColorOn,LEDColorOff)
  
  Define s,i,t,f,h,hh,a,Matrix,dot_farbe,dot_x,dot_y
  
  Dim zeichen.s(Len(text.s))
  Dim mask.s(Len(text.s))
  
  For s = 1 To Len(text.s)
    zeichen.s(s) = Mid(text.s,s,1)
    
    If zeichen.s(s) = "" : mask.s(s)="00000000000000000000000000000000000" : EndIf
    If zeichen.s(s) = "!" : mask.s(s)="00100001000010000100001000000000100" : EndIf
    ;If zeichen.s(s) = Chr(34) : mask.s(s)="01010010100101000000000000000000000" : EndIf
    If zeichen.s(s) = "#" : mask.s(s)="01010010101111101010111110101001010" : EndIf
    If zeichen.s(s) = "$" : mask.s(s)="00100011111010001110001011111000100" : EndIf
    If zeichen.s(s) = "%" : mask.s(s)="11000110010001000100010001001100011" : EndIf
    If zeichen.s(s) = "&" : mask.s(s)="01100100101010001000101011001001101" : EndIf
    If zeichen.s(s) = "'" : mask.s(s)="01100001000100000000000000000000000" : EndIf
    If zeichen.s(s) = "(" : mask.s(s)="00010001000100001000010000010000010" : EndIf
    If zeichen.s(s) = ")" : mask.s(s)="01000001000001000010000100010001000" : EndIf
    If zeichen.s(s) = "*" : mask.s(s)="00000001001010101110101010010000000" : EndIf
    If zeichen.s(s) = "+" : mask.s(s)="00000001000010011111001000010000000" : EndIf
    If zeichen.s(s) = "," : mask.s(s)="00000000000000000000011000010001000" : EndIf
    If zeichen.s(s) = "-" : mask.s(s)="00000000000000011111000000000000000" : EndIf
    If zeichen.s(s) = "." : mask.s(s)="00000000000000000000011000110000000" : EndIf
    If zeichen.s(s) = "/" : mask.s(s)="00000000010001000100010001000000000" : EndIf
    
    If zeichen.s(s) = "0" : mask.s(s)="01110100011001110101110011000101110" : EndIf
    If zeichen.s(s) = "1" : mask.s(s)="00100011000010000100001000010001110" : EndIf
    If zeichen.s(s) = "2" : mask.s(s)="01110100010000100010001000100011111" : EndIf
    If zeichen.s(s) = "3" : mask.s(s)="01110100010000100110000011000101110" : EndIf
    If zeichen.s(s) = "4" : mask.s(s)="00010001100101010010111110001000010" : EndIf
    If zeichen.s(s) = "5" : mask.s(s)="11111100001000011110000010000111110" : EndIf
    If zeichen.s(s) = "6" : mask.s(s)="01110100001000011110100011000101110" : EndIf
    If zeichen.s(s) = "7" : mask.s(s)="11111100010000100010001000010000100" : EndIf
    If zeichen.s(s) = "8" : mask.s(s)="01110100011000101110100011000101110" : EndIf
    If zeichen.s(s) = "9" : mask.s(s)="01110100011000101111000011000101110" : EndIf
    
    If zeichen.s(s) = ":" : mask.s(s)="00000011000110000000011000110000000" : EndIf
    If zeichen.s(s) = ";" : mask.s(s)="00000011000110000000011000010001000" : EndIf
    If zeichen.s(s) = "<" : mask.s(s)="00010001000100010000010000010000010" : EndIf
    If zeichen.s(s) = "=" : mask.s(s)="00000000001111100000111110000000000" : EndIf
    If zeichen.s(s) = ">" : mask.s(s)="01000001000001000001000100010001000" : EndIf
    If zeichen.s(s) = "?" : mask.s(s)="01110000010000100010001000000000100" : EndIf
    If zeichen.s(s) = "@" : mask.s(s)="01110100011001110101101111000001110" : EndIf
    
    If zeichen.s(s) = "A" : mask.s(s)="01110100011000110001111111000110001" : EndIf
    If zeichen.s(s) = "B" : mask.s(s)="11110100011000111110100011000111110" : EndIf
    If zeichen.s(s) = "C" : mask.s(s)="01110100011000010000100001000101110" : EndIf
    If zeichen.s(s) = "D" : mask.s(s)="11100100101000110001100011001011100" : EndIf
    If zeichen.s(s) = "E" : mask.s(s)="11111100001000011110100001000011111" : EndIf
    If zeichen.s(s) = "F" : mask.s(s)="11111100001000011110100001000010000" : EndIf
    If zeichen.s(s) = "G" : mask.s(s)="01110100011000010111100011000101111" : EndIf
    If zeichen.s(s) = "H" : mask.s(s)="10001100011000111111100011000110001" : EndIf
    If zeichen.s(s) = "I" : mask.s(s)="01110001000010000100001000010001110" : EndIf
    If zeichen.s(s) = "J" : mask.s(s)="00111000100001000010000101001001100" : EndIf
    If zeichen.s(s) = "K" : mask.s(s)="10001100101010011000101001001010001" : EndIf
    If zeichen.s(s) = "L" : mask.s(s)="10000100001000010000100001000011111" : EndIf
    If zeichen.s(s) = "M" : mask.s(s)="10001110111010110101100011000110001" : EndIf
    If zeichen.s(s) = "N" : mask.s(s)="10001100011100110101100111000110001" : EndIf
    If zeichen.s(s) = "O" : mask.s(s)="01110100011000110001100011000101110" : EndIf
    If zeichen.s(s) = "P" : mask.s(s)="11110100011000111110100001000010000" : EndIf
    If zeichen.s(s) = "Q" : mask.s(s)="01110100011000110001101011001001101" : EndIf
    If zeichen.s(s) = "R" : mask.s(s)="11110100011000111110101001001010001" : EndIf
    If zeichen.s(s) = "S" : mask.s(s)="01111100001000001110000010000111110" : EndIf
    If zeichen.s(s) = "T" : mask.s(s)="11111001000010000100001000010000100" : EndIf
    If zeichen.s(s) = "U" : mask.s(s)="10001100011000110001100011000101110" : EndIf
    If zeichen.s(s) = "V" : mask.s(s)="10001100011000110001100010101000100" : EndIf
    If zeichen.s(s) = "W" : mask.s(s)="10001100011000110101101011010101010" : EndIf
    If zeichen.s(s) = "X" : mask.s(s)="10001100010101000100010101000110001" : EndIf
    If zeichen.s(s) = "Y" : mask.s(s)="10001100011000101010001000010000100" : EndIf
    If zeichen.s(s) = "Z" : mask.s(s)="11111000010001001110010001000011111" : EndIf
    
    If zeichen.s(s) = "a" : mask.s(s)="00000000000111000001011111000101111" : EndIf
    If zeichen.s(s) = "b" : mask.s(s)="10000100001011011001100011000111110" : EndIf
    If zeichen.s(s) = "c" : mask.s(s)="00000000000111010000100001000101110" : EndIf
    If zeichen.s(s) = "d" : mask.s(s)="00001000010110110011100011000101111" : EndIf
    If zeichen.s(s) = "e" : mask.s(s)="00000000000111010001111111000001110" : EndIf
    If zeichen.s(s) = "f" : mask.s(s)="00110010010100011100010000100001000" : EndIf
    If zeichen.s(s) = "g" : mask.s(s)="00000011111000110001011110000101110" : EndIf
    If zeichen.s(s) = "h" : mask.s(s)="10000100001011011001100011000110001" : EndIf
    If zeichen.s(s) = "i" : mask.s(s)="00100000000110000100001000010001110" : EndIf
    If zeichen.s(s) = "j" : mask.s(s)="00010000000011000010000101001001100" : EndIf
    If zeichen.s(s) = "k" : mask.s(s)="10000100001001010100110001010010010" : EndIf
    If zeichen.s(s) = "l" : mask.s(s)="01100001000010000100001000010001110" : EndIf
    If zeichen.s(s) = "m" : mask.s(s)="00000000000101010101101011010110101" : EndIf
    If zeichen.s(s) = "n" : mask.s(s)="00000000001011011001100011000110001" : EndIf
    If zeichen.s(s) = "o" : mask.s(s)="00000000000111010001100011000101110" : EndIf
    If zeichen.s(s) = "p" : mask.s(s)="00000000001111010001111101000010000" : EndIf
    If zeichen.s(s) = "q" : mask.s(s)="00000000000111010010011100001000011" : EndIf
    If zeichen.s(s) = "r" : mask.s(s)="00000000001011011001100001000010000" : EndIf
    If zeichen.s(s) = "s" : mask.s(s)="00000000000111010000011100000111110" : EndIf
    If zeichen.s(s) = "t" : mask.s(s)="01000010001110001000010000100100110" : EndIf
    If zeichen.s(s) = "u" : mask.s(s)="00000000001000110001100011001101101" : EndIf
    If zeichen.s(s) = "v" : mask.s(s)="00000000001000110001100010101000100" : EndIf
    If zeichen.s(s) = "w" : mask.s(s)="00000000001000110001101011010101010" : EndIf
    If zeichen.s(s) = "x" : mask.s(s)="00000000001000101010001000101010001" : EndIf
    If zeichen.s(s) = "y" : mask.s(s)="00000000001000110001011110000101110" : EndIf
    If zeichen.s(s) = "z" : mask.s(s)="00000000001111100010001000100011111" : EndIf
    
    If zeichen.s(s) = "§" : mask.s(s)="01111100000111010001011100000111110" : EndIf
    If zeichen.s(s) = "Ä" : mask.s(s)="01010000000111010001111111000110001" : EndIf
    If zeichen.s(s) = "ä" : mask.s(s)="01010000000111000001011111000101111" : EndIf
    If zeichen.s(s) = "Ö" : mask.s(s)="01010000000111010001100011000101110" : EndIf
    If zeichen.s(s) = "ö" : mask.s(s)="00000010100000001110100011000101110" : EndIf
    If zeichen.s(s) = "Ü" : mask.s(s)="01010000001000110001100011000101110" : EndIf
    If zeichen.s(s) = "ü" : mask.s(s)="01010000001000110001100011001101101" : EndIf
    If zeichen.s(s) = "ß" : mask.s(s)="01110100011111010001110011011010000" : EndIf
    
  Next
  
  Matrix=CreateImage(0,dot_w_h*(6*Len(text.s)),dot_w_h*8)
  StartDrawing(ImageOutput(0))
  BackColor(RGB(0,0,0))
  
  For i=1 To 35*Len(text.s)
    hh+1
    If Val(Mid(mask.s(h+1), hh, 1)) = 1
      dot_farbe=LEDColorOn
    Else
      dot_farbe=LEDColorOff
    EndIf
    
    Box(((dot_x+t*dot_w_h)+a)+(dot_w_h/2), (dot_y+f*dot_w_h)+(dot_w_h)/2, dot_w_h-2, dot_w_h-2 , dot_farbe)
    
    If i % 5 = 0 : t-5 : f+1 : EndIf
    
    t+1
    
    If i % 35 = 0 : h+1 :hh=0: f=0 : t=0 : a+(dot_w_h*6) : EndIf
    
  Next
  
  StopDrawing()
  
  StartDrawing(WindowOutput(0))
  DrawImage(Matrix, x, y, ImageWidth(0), ImageHeight(0))
  StopDrawing()
  
EndProcedure

ExamineDesktops()

If OpenWindow(0, DesktopWidth(0)/2, DesktopHeight(0)/2, 430, 150, "Dot Matrix", #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget|#PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar | #PB_Window_Invisible) 
  SetWindowColor(0, RGB(0,0,0))
  HideWindow(0, 0)
  Repeat 
    Dot_Matrix(FormatDate(" %dd.%mm.%yyyy ", Date()),0,0,6,$00ff00,$003000)
    Dot_Matrix(FormatDate("  %hh:%ii:%ss  ", Date()),0,50,6,$0000ff,$000030)
    Dot_Matrix(FormatDate("Hello World!", Date()),0,100,6,RGB(255,255,0),RGB(30,30,0))
    Delay(1) 
  Until  WindowEvent() = #PB_Event_CloseWindow 
EndIf 
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Dotmatrix Beispiel

Beitrag von NicTheQuick »

Also diese String-Masken mag ich ja überhaupt nicht. Wie wäre es, wenn du das einfach immer in Quads reinpackst? 35 Bit passen da dann ja mehr als locker rein. Speicher sparst du gleich auch noch und anstatt mühsam mit 'Mid()' da durch zu rennen, kannst du einfach locker shiften und mit & das unterste Bit auslesen.

Außerdem wäre statt den tausenden Ifs ein Select-Block viel einfacher in der Art:

Code: Alles auswählen

Select Asc(zeichen.s)
  Case 'a': blablubb
  Case 'b': blablubb
  ...
  Default: k.a.
EndSelect
Das sähe nicht nur schön aus, das wäre sogar gleich auch noch einfacher. :)

Wie du auch mit Pointern über Strings laufen kannst, kannst du dir dann ja bei Gelegenheit auch mal anschauen. :wink:
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Dotmatrix Beispiel

Beitrag von STARGÅTE »

@NicTheQuick:
Wir denken auf der selben Ebene ^^

wollte ihm auch schon den Code umschreiben, und BitMasken nutzen, war aber zu faul die Masken alle umzuconvertieren.
Wenn man diese dann noch in eine DataSection packt, kann man sich die komplette Select/If Sache sparen.
Weil man dann den Character direkt als Addition*8 für die Maske nutzen kann.

Hier mal die "Übersetzung", habe jedoch nur Ascii 32 bis 64 übersetzt ^^:

Code: Alles auswählen

EnableExplicit

Structure QuadArray : q.q[0] : EndStructure
Structure CharArray : c.c[0] : EndStructure

Procedure DrawLED(Text$, x, y, Size, LEDColorOn, LEDColorOff)

  Protected *Mask.QuadArray = ?Mask-8*32
  Protected Index.i, Bit.i, Asc.i, Shift.i = 1
  Protected *Char.CharArray = @Text$
  Protected Color.i, ImageID.i
   
  ImageID = CreateImage(0, Size*6*Len(Text$), Size*8)
  StartDrawing(ImageOutput(0))
    BackColor(RGB(0,0,0))
    While *Char\c[Index]
      Asc = *Char\c[Index]
      For Bit = 0 To 34
        If *Mask\q[Asc] & $400000000>>Bit
          Color = LEDColorOn
        Else
          Color = LEDColorOff
        EndIf
        Box(Shift+(Bit%5)*Size, Int(Bit/5)*Size+1, Size-2, Size-2, Color)
      Next
      Index + 1
      Shift + 6*Size
    Wend
  StopDrawing()
  StartDrawing(WindowOutput(0))
    DrawImage(ImageID, x, y, ImageWidth(0), ImageHeight(0))
  StopDrawing()
  FreeImage(0)
  
EndProcedure

ExamineDesktops()

If OpenWindow(0, DesktopWidth(0)/2, DesktopHeight(0)/2, 430, 150, "Dot Matrix", #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget|#PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar | #PB_Window_Invisible) 
  SetWindowColor(0, RGB(0,0,0))
  HideWindow(0, 0)
  Repeat 
    DrawLED(FormatDate(" %dd.%mm.%yyyy ", Date()),0,0,6,$00ff00,$003000)
    DrawLED(FormatDate("# %hh:%ii:%ss #", Date()),0,50,6,$0000ff,$000030)
    Delay(10) 
  Until  WindowEvent() = #PB_Event_CloseWindow 
EndIf 

DataSection
  Mask:
  Data.q $000000000,$108421004,$294A00000,$295F57D4A,$11F4717C4,$632222263,$32544564D,$308800000
  Data.q $088842082,$208210888,$009575480,$0084F9080,$000003088,$0000F8000,$000003180,$002222200
  Data.q $3A33AE62E,$11842108E,$3A211111F,$3A213062E,$08CA97C42,$7E10F043E,$3A10F462E,$7E2111084
  Data.q $3A317462E,$3A317862E,$018C03180
EndDataSection
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Christian H
Beiträge: 134
Registriert: 18.10.2005 10:22
Wohnort: Welschbillig

Re: Dotmatrix Beispiel

Beitrag von Christian H »

STARGÅTE hat geschrieben:Hier mal die "Übersetzung", habe jedoch nur Ascii 32 bis 64 übersetzt ^^:
Habe ein wenig an der "Übersetzung" gearbeitet:

Code: Alles auswählen

If OpenWindow(0, 0, 0, 1000, 200, "Dot Matrix", #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget|#PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar | #PB_Window_Invisible)
  SetWindowColor(0, RGB(0,0,0))
  HideWindow(0, 0)
  Repeat
    DrawLED(FormatDate(" %dd.%mm.%yyyy ", Date()),0,  0,6,$00ff00,$003000)
    DrawLED(FormatDate("# %hh:%ii:%ss #", Date()),0, 50,6,$0000ff,$000030)
    DrawLED("@ABCDEFGHIJKLMNOPQRSTUVWXYZ"        ,0,100,6,RGB(255,255,0),RGB(30,30,0))
    DrawLED("@abcdefghijklmnopqrstuvwxyz"        ,0,150,6,RGB(255,255,0),RGB(30,30,0))
    Delay(50)
  Until  WindowEvent() = #PB_Event_CloseWindow
EndIf

DataSection
  Mask:
  Data.q $000000000,$108421004,$294A00000,$295F57D4A,$11F4717C4,$632222263,$32544564D,$308800000
  Data.q $088842082,$208210888,$009575480,$0084F9080,$000003088,$0000F8000,$000003180,$002222200
  Data.q $3A33AE62E,$11842108E,$3A211111F,$3A213062E,$08CA97C42,$7E10F043E,$3A10F462E,$7E2111084
  Data.q $3A317462E,$3A317862E,$018C03180,$018C03088,$088882082,$001F07C00,$208208888,$382111004
  Data.q $3A33ADE0E
  Data.q $3A318FE31,$7A31F463E,$3A308422E       ;ABC
  Data.q %11100100101000110001100011001011100 ;D
  Data.q %11111100001000011110100001000011111 ;E
  Data.q %11111100001000011110100001000010000
  Data.q %01110100011000010111100011000101111
  Data.q %10001100011000111111100011000110001
  Data.q %01110001000010000100001000010001110
  Data.q %00111000100001000010000101001001100
  Data.q %10001100101010011000101001001010001
  Data.q %10000100001000010000100001000011111
  Data.q %10001110111010110101100011000110001
  Data.q %10001100011100110101100111000110001
  Data.q %01110100011000110001100011000101110
  Data.q %11110100011000111110100001000010000
  Data.q %01110100011000110001101011001001101
  Data.q %11110100011000111110101001001010001
  Data.q %01111100001000001110000010000111110
  Data.q %11111001000010000100001000010000100
  Data.q %10001100011000110001100011000101110
  Data.q %10001100011000110001100010101000100
  Data.q %10001100011000110101101011010101010
  Data.q %10001100010101000100010101000110001
  Data.q %10001100011000101010001000010000100
  Data.q %11111000010001001110010001000011111 ;Z
  Data.q %11100100001000010000100001000011100 ; [
  Data.q %00000100000100000100000100000100000 ; \
  Data.q %00111000010000100001000010000100111 ; ]
  Data.q %00100010101000100000000000000000000 ; ^
  Data.q %00000000000000000000000000000011111 ;_
  Data.q %00100000100000000000000000000000000 ; `
  ;       11111222223333344444555556666677777
  Data.q %00000000000111000001011111000101111 ;a
  Data.q %10000100001011011001100011000111110
  Data.q %00000000000111010000100001000101110
  Data.q %00001000010110110011100011000101111
  Data.q %00000000000111010001111111000001110
  Data.q %00110010010100011100010000100001000
  Data.q %00000011111000110001011110000101110
  Data.q %10000100001011011001100011000110001
  Data.q %00100000000110000100001000010001110
  Data.q %00010000000011000010000101001001100
  Data.q %10000100001001010100110001010010010
  Data.q %01100001000010000100001000010001110
  Data.q %00000000000101010101101011010110101
  Data.q %00000000001011011001100011000110001
  Data.q %00000000000111010001100011000101110
  Data.q %00000000001111010001111101000010000
  Data.q %00000000000111010010011100001000011
  Data.q %00000000001011011001100001000010000
  Data.q %00000000000111010000011100000111110
  Data.q %01000010001110001000010000100100110
  Data.q %00000000001000110001100011001101101
  Data.q %00000000001000110001100010101000100
  Data.q %00000000001000110001101011010101010
  Data.q %00000000001000101010001000101010001
  Data.q %00000000001000110001011110000101110
  Data.q %00000000001111100010001000100011111 ;z
EndDataSection
Gruß Christian
tinux
Beiträge: 12
Registriert: 06.12.2006 02:29
Wohnort: Bayern
Kontaktdaten:

Re: Dotmatrix Beispiel

Beitrag von tinux »

Danke für die Tipps und Beispiele!

Code: Alles auswählen

EnableExplicit

Procedure DrawLED(Text$, x, y, Size, LEDColorOn, LEDColorOff)
  
  Structure QuadArray : q.q[0] : EndStructure
  Structure CharArray : c.c[0] : EndStructure
  
  Protected *Mask.QuadArray = ?Mask-8*32
  Protected Index.i, Bit.i, Asc.i, Shift.i = 1
  Protected *Char.CharArray = @Text$
  Protected Color.i, ImageID.i
   
  ImageID = CreateImage(0, Size*6*Len(Text$), Size*8)
  StartDrawing(ImageOutput(0))
    BackColor(RGB(0,0,0))
    While *Char\c[Index]
      Asc = *Char\c[Index]
      For Bit = 0 To 34
        If *Mask\q[Asc] & $400000000>>Bit
          Color = LEDColorOn
        Else
          Color = LEDColorOff
        EndIf
        Box(Shift+(Bit%5)*Size, Int(Bit/5)*Size+1, Size-1, Size-1, Color)
      Next
      Index + 1
      Shift + 6*Size
    Wend
  StopDrawing()
  StartDrawing(WindowOutput(0))
    DrawImage(ImageID, x, y, ImageWidth(0), ImageHeight(0))
  StopDrawing()
  FreeImage(0)
  
DataSection
  Mask:
  Data.q 0         ,$108421004,$294A00000,$295F57D4A,$11F4717C4,$632222263,$32544564D,$308800000 ; 32-
  Data.q $088842082,$208210888,$009575480,$0084F9080,$000003088,$0000F8000,$000003180,$002222200 ; 40-
  Data.q $3A33AE62E,$11842108E,$3A211111F,$3A213062E,$08CA97C42,$7E10F043E,$3A10F462E,$7E2111084 ; 48-
  Data.q $3A317462E,$3A317862E,$018C03180,$18C03088 ,$88882082 ,$1F07C00  ,$208208888,$382111004 ; 56-
  Data.q $3A33ADE0E,$3A318FE31,$7A31F463E,$3A308422E,$72518C65C,$7E10F421F,$7E10F4210,$3A30BC62F ; 64-
  Data.q $4631FC631,$38842108E,$1C4210A4C,$4654C5251,$42108421F,$4775AC631,$4639ACE31,$3A318C62E ; 72-
  Data.q $7A31F4210,$3A318D64D,$7A31F5251,$3E107043E,$7C8421084,$46318C62E,$46318C544,$4631AD6AA ; 80-
  Data.q $462A22A31,$463151084,$7C227221F,$188421086,$1041041  ,$30842108C,$115100000,$1F        ; 88-
  Data.q $10400000 ,$E0BE2F   ,$4216CC63E,$E8422E   ,$42D9C62F ,$E8FE0E   ,$1928E2108,$1F18BC2E  ; 96-
  Data.q $4216CC631,$100C2108E,$80610A4C ,$4212A6292,$30842108E,$AAD6B5   ,$16CC631  ,$E8C62E    ; 104-
  Data.q $1E8FA10  ,$E93843   ,$16CC210  ,$E8383E   ,$211C42126,$118C66D  ,$118C544  ,$118D6AA   ; 112-
  Data.q $1151151  ,$118BC2E  ,$1F1111F  ,0         ,0         ,0         ,0         ,0          ; 120-
  Data.q 0         ,0         ,0         ,0         ,0         ,0         ,0         ,0          ; 128-
  Data.q 0         ,0         ,0         ,0         ,0         ,0         ,0         ,0          ; 136-
  Data.q 0         ,0         ,0         ,0         ,0         ,0         ,0         ,0          ; 144-
  Data.q 0         ,0         ,0         ,0         ,0         ,0         ,0         ,0          ; 152-
  Data.q 0         ,0         ,0         ,0         ,0         ,0         ,0         ,$3E0E8B83E ; 160-
  Data.q 0         ,0         ,0         ,0         ,0         ,0         ,0         ,0          ; 168-
  Data.q 0         ,0         ,0         ,0         ,0         ,0         ,0         ,0          ; 176-
  Data.q 0         ,0         ,0         ,0         ,0         ,0         ,0         ,0          ; 184-
  Data.q 0         ,0         ,0         ,0         ,$280E8FE31,0         ,0         ,0          ; 192-
  Data.q 0         ,0         ,0         ,0         ,0         ,0         ,0         ,0          ; 200-
  Data.q 0         ,0         ,0         ,0         ,0         ,0         ,$280E8C62E,0          ; 208-
  Data.q 0         ,0         ,0         ,0         ,$28118C62E,0         ,0         ,$3A3E8E6D0 ; 216-
  Data.q 0         ,0         ,0         ,0         ,$280E0BE2F,0         ,0         ,0          ; 224-
  Data.q 0         ,0         ,0         ,0         ,0         ,0         ,0         ,0          ; 232-
  Data.q 0         ,0         ,0         ,0         ,0         ,0         ,$1407462E ,0          ; 240-
  Data.q 0         ,0         ,0         ,0         ,$28118C66D,0         ,0         ,0          ; 248-255
EndDataSection  
  
EndProcedure

ExamineDesktops()

If OpenWindow(0, DesktopWidth(0)/2, DesktopHeight(0)/2, 430, 160, "Dot Matrix", #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget|#PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar | #PB_Window_Invisible)
  SetWindowColor(0, RGB(0,0,0))
  HideWindow(0, 0)
  Repeat
    DrawLED(FormatDate(" %dd.%mm.%yyyy ", Date()),0,0,6,$00ff00,$003000)
    DrawLED(FormatDate("# %hh:%ii:%ss #", Date()),0,50,6,$0000ff,$000030)
    DrawLED("@ABCDEFGHIJKLMNOPQRSTUVWXYZ",0,100,2,$ffff00,$303000)
    DrawLED("@abcdefghijklmnopqrstuvwxyz",0,120,2,$ffff00,$303000)
    DrawLED("§ÄäÖöÜüß",0,140,2,$ffff00,$303000)
    Delay(50)
  Until  WindowEvent() = #PB_Event_CloseWindow
EndIf

Gruß tinux
Antworten