PureBasic: Zeichnen

Aus Wikibooks

Es ist möglich Formen und Linien zu zeichnen. Dies ist z.B. nützlich, wenn man ein Simulationsprogramm programmerien will oder einen Funktionsplotter. Plakativ soll hier zweidimensional gezeichnet werden, in der PureBasic-Vollversion ist es auch möglich 3D-Objekte zu erstellen.

; Listing 46: Zeichnen

Procedure.f turn_x(x.f, y.f, degree.f)
  ProcedureReturn Cos(Radian(degree))*x-Sin(Radian(degree))*y
EndProcedure

Procedure.f turn_y(x.f,y.f,degree.f)
  ProcedureReturn Sin(Radian(degree))*x+Cos(Radian(degree))*y
EndProcedure

x1.f=100
y1.f=100
x2.f=140
y2.f=140
x3.f=100
y3.f=140
degree.f = 1

OpenWindow(0,0,0,400,400,"Umkehrungen",#PB_Window_SystemMenu|#PB_Window_ScreenCentered) 

AddWindowTimer(0,0,10)
Repeat
  Select WindowEvent()
    Case #PB_Event_CloseWindow
      
      End
      
    Case #PB_Event_Timer
      
      StartDrawing(WindowOutput(0))
      
      Box(0,0,400,400)
      LineXY(x1+200,y1+200,x2+200,y2+200,RGB(0,0,0))
      LineXY(x1+200,y1+200,x3+200,y3+200,RGB(0,0,0))
      LineXY(x2+200,y2+200,x3+200,y3+200,RGB(0,0,0))
      LineXY(x1+200,y1+200,200,200,RGB(0,0,0))
      Circle(200,200,2,RGB(0,0,0))
      
      x1_new.f=turn_x(x1,y1,degree)
      y1_new.f=turn_y(x1,y1,degree)
      x2_new.f=turn_x(x2,y2,degree)
      y2_new.f=turn_y(x2,y2,degree)
      x3_new.f=turn_x(x3,y3,degree)
      y3_new.f=turn_y(x3,y3,degree)
      
      x1=x1_new
      y1=y1_new
      x2=x2_new
      y2=y2_new
      x3=x3_new
      y3=y3_new
      
      StopDrawing()
      
  EndSelect
  
ForEver

Dieses Programm öffnet ein Fenster, in welchem in der Mitte ein Kreis gezeichnet wird (Circle()), von dem eine Linie ausgeht, an der ein Dreieck hängt (LineXY()). Die Linie und das Dreieck drehen sich nun im Uhrzeigersinn.

Mit StartDrawing() wird ausgesagt, dass nun begonnen werden soll etwas zu zeichnen. Das Argument ist dabei die Form der Ausgabe, in diesem Fall ein Fenster. WindowOutput() muss wiederum als Argument die Fensternummer übergeben werden, die zur Zeichenausgabe dienen soll. Für StartDrawing() gibt es noch weitere Argumente, um z.B. eine Ausgabe zu drucken. Wenn fertig gezeichnet wurde und man noch andere Dinge im Programm ausführen will, sollte man StopDrawing() ausführen, da damit nicht mehr benötigte Rechnerressourcen freigegeben werden. Mit Circle() wird wie gesagt ein Kreis gezeichnet, wobei die ersten beiden Argumente die x- bzw. die y-Position darstellen und die anderen Argumente den Radius und die Farbe in RGB-Schreibweise. Letzteres heißt, dass die erste Zahl den Rot-, die zweite den Grün- und die letzte den Blauanteil der Farbe darstellt. In der Referenz ist eine Farbtabelle enthalten, über die man die Werte für bestimmte Farben herausfinden kann. Bei der x-y-Position wird 200 hinzuaddiert, weil die Prozeduren zum Drehen des Zeigers, diesen um die linke obere Fensterecke drehen. Mit LineXY() werden die Linien gezeichnet, wobei man jeweils zwei Punkte, die verbunden werden sollen, mit x-y-Koordinate angeben muss. Zusätzlich muss wieder die Farbe für die Linien angegeben werden. Darunter werden die Punkte, die verbunden werden sollen, gedreht. Die Prozeduren basieren hierbei auf Vektorrechnung. Die neuen Werte müssen zuerst in Zwischenvariablen gespeichert werden, da sowohl für die neue x-, als auch für die neue y-Koordinate, die alten Koordinaten benötigt werden. Mit Box() wird der gesamte bisher gezeichnete Inhalt übermalt, in dem über alles ein großes Viereck gelegt wird, da sonst die alten Linien immer noch sichtbar wären.

Farben[Bearbeiten]

Auch das Benutzen von Farben ist ohne weiteres möglich.

; Listing 47: Farben

OpenWindow(0,0,0,400,400,"Farben",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)

rot   = RGB(255,  0,  0)
gruen = RGB(  0,255,  0)
blau  = RGB(  0,  0,255)
gelb  = RGB(255,255,  0)

Repeat
  Select WindowEvent()
    Case #PB_Event_CloseWindow
      End
    Case #PB_Event_Repaint
      
      StartDrawing(WindowOutput(0))
      
      Box(  0,  0,200,200,rot)
      Box(200,  0,200,200,gruen)
      Box(  0,200,200,200,blau)
      Box(200,200,200,200,gelb)
      
      StopDrawing()
      
  EndSelect
  
ForEver

Dieses Programm öffnet ein Fenster, in dem vier Quadrate in verschiedenen Farben gezeichnet werden.

Zunächst werden die Werte der vier Farben rot,grün,blau und gelb über die Funktion RGB() in den Variablen gespeichert. Diese werden Benutzt um den Boxen einen Farbwert zuzuweisen. Alternativ können die RGB-Werte, wie im vorhergehenden Beispiel, auch direkt als letzter Parameter der Zeichenfunktion (hier: Box()) geschrieben werden.

Die Farben können alternativ auch als Hexadezimalzahl oder als Dezimalzahl geschrieben werden.

blau = RGB(0,0,255)
blau = $FF0000
blau = 16711680

Jede dieser drei Zeilen bewirkt das selbe. Die Dezimalschreibweise ist nicht geläufig, da aus ihr nicht auf Anhieb abzulesen ist welche Farbe hinter der Zahl steckt. Einfacher ist es bei rot, die den Dezimalwert 255 hat. Die Funktion RGB() geht grob nach folgender Rechnung vor:

Rückgabewert = Rot + 2^8 * Grün + 2^16 * Blau