Überlagertes Zeichnen, Objekte vor Hintergrund bewegen
Überlagertes Zeichnen, Objekte vor Hintergrund bewegen
Es geht um die Technik von überlagertem Zeichnen mit der VectorDrawing Bibliothek.
Also Hintergrund und Vordergrundzeichnung.
Wenn man über einen Bild oder Zeichnung (Hintergrund) Auswahlrechtecke usw darüberlegen und bearbeiten will (Vordergrund)
Ich hab dazu 3 mögliche Szenarien im Kopf
1. Ich zeichne alles in ein "Bild" bzw. Canvas und zeichne praktisch bei allen Änderungen im Vordergrund alles neu!
das dürfte die denkbar langsamste alternative sein.
2. Man nutzt den Alpha Kanal (Standard bei Vectordrawing)
- erstellt einen Hintergrundlayer dort ist das eigentliche Bild drin
- ein Vordergrundlayer mit allen Pixels Alpha=0 (voll transparent) die gezeichneten Objekte bekommen Alpha= 255 (intransparent)
die Grafikkarte setzt das dann zu einem Anzeigebild zusammen. Den Hintergrund muss ich erst wieder bearbeiten, wenn Elemente
vom Vordergrund in den Hintergrund übernommen werden.
3. Man nutzt die Spritefunktionen mit FlipBuffers(), erzeugt sich zusätzlich eine Schattenkopie was als Hintergrund fungieren soll und
kopiert diesen immer wieder um.
Da das alles mit Sicherheit schon perfekt gelöst ist und wahrscheinlich in fertigen Befehlen steckt, interessiert mich wie man das
macht. Einfaches zeichnen mit 2D oder Vectorbiliothek ist kein Problem, dass muss hier nicht neu erklärt werden.
Also Hintergrund und Vordergrundzeichnung.
Wenn man über einen Bild oder Zeichnung (Hintergrund) Auswahlrechtecke usw darüberlegen und bearbeiten will (Vordergrund)
Ich hab dazu 3 mögliche Szenarien im Kopf
1. Ich zeichne alles in ein "Bild" bzw. Canvas und zeichne praktisch bei allen Änderungen im Vordergrund alles neu!
das dürfte die denkbar langsamste alternative sein.
2. Man nutzt den Alpha Kanal (Standard bei Vectordrawing)
- erstellt einen Hintergrundlayer dort ist das eigentliche Bild drin
- ein Vordergrundlayer mit allen Pixels Alpha=0 (voll transparent) die gezeichneten Objekte bekommen Alpha= 255 (intransparent)
die Grafikkarte setzt das dann zu einem Anzeigebild zusammen. Den Hintergrund muss ich erst wieder bearbeiten, wenn Elemente
vom Vordergrund in den Hintergrund übernommen werden.
3. Man nutzt die Spritefunktionen mit FlipBuffers(), erzeugt sich zusätzlich eine Schattenkopie was als Hintergrund fungieren soll und
kopiert diesen immer wieder um.
Da das alles mit Sicherheit schon perfekt gelöst ist und wahrscheinlich in fertigen Befehlen steckt, interessiert mich wie man das
macht. Einfaches zeichnen mit 2D oder Vectorbiliothek ist kein Problem, dass muss hier nicht neu erklärt werden.
Zuletzt geändert von SMaag am 26.11.2022 23:55, insgesamt 1-mal geändert.
- juergenkulow
- Beiträge: 188
- Registriert: 22.12.2016 12:49
- Wohnort: :D_üsseldorf-Wersten
Re: Überlagetes Zeichnen, Vector Drawing
Code: Alles auswählen
; DrawVectorImage oder VectorSourceImage in Eventschleife
If CreateImage(1, 400, 200,32,RGBA($cf,$ff,$ff,$c0))
StartVectorDrawing(ImageVectorOutput(1))
alpha = 255
For angle = 20 To 361 Step 20
VectorSourceColor(RGBA(255,0,0,alpha))
x = 200 + 100*Cos(Radian(angle))
y = 100 + 75*Sin(Radian(angle))
AddPathCircle(x,y, 10)
FillPath()
alpha - 15
Next
StopVectorDrawing()
EndIf
LoadFont(0, "Arial", 15, #PB_Font_Bold)
Text$ = "Der schnelle braune Fuchs springt über den faulen Hund."
If OpenWindow(0, 0, 0, 400, 200, "DrawVectorImage", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
CanvasGadget(0, 0, 0, 400, 200)
Repeat
If StartVectorDrawing(CanvasVectorOutput(0))
DrawVectorImage(ImageID(1))
If WindowMouseX(0)>=0 And WindowMouseY(0)>=0
MovePathCursor(WindowMouseX(0),WindowMouseY(0))
Else
MovePathCursor(0, 0)
EndIf
VectorFont(FontID(0), 14)
VectorSourceColor(RGBA($A5,$2A,$2A , $ff))
DrawVectorText(Text$)
StopVectorDrawing()
EndIf
Event = WaitWindowEvent()
Until Event = #PB_Event_CloseWindow
CloseWindow(0)
EndIf
If OpenWindow(0, 0, 0, 400, 200, "AddPathBox VectorSourceImage", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
CanvasGadget(0, 0, 0, 400, 200)
Repeat
If StartVectorDrawing(CanvasVectorOutput(0))
AddPathBox(0, 0, 400, 200)
VectorSourceImage(ImageID(1), $ff, 400, 200)
FillPath()
If WindowMouseX(0)>=0 And WindowMouseY(0)>=0
MovePathCursor(WindowMouseX(0),WindowMouseY(0))
Else
MovePathCursor(0, 0)
EndIf
VectorFont(FontID(0), 14)
VectorSourceColor(RGBA($A5,$2A,$2A , $ff))
DrawVectorText(Text$)
StopVectorDrawing()
EndIf
Event = WaitWindowEvent()
Until Event = #PB_Event_CloseWindow
CloseWindow(0)
EndIf
Bitte stelle Deine Fragen, denn den Erkenntnisapparat einschalten entscheidet über das einzig bekannte Leben im Universum.
Jürgen Kulow Wersten :D_üsseldorf NRW D Europa Erde Sonnensystem Lokale_Flocke Lokale_Blase Orion-Arm
Milchstraße Lokale_Gruppe Virgo-Superhaufen Laniakea Sichtbares_Universum
Jürgen Kulow Wersten :D_üsseldorf NRW D Europa Erde Sonnensystem Lokale_Flocke Lokale_Blase Orion-Arm
Milchstraße Lokale_Gruppe Virgo-Superhaufen Laniakea Sichtbares_Universum
Re: Überlagetes Zeichnen, Vector Drawing
Ich seh schon, die Frage ist missverständlich gestellt. Ich muss das nochmal neu ansetzen.
Es geht im Grundsatz darum, Objekte vor einem Hintergrund zu bewegen.
Die Frage ist, muss dass auf einer Ebene, einem Screen alles zusammen immer komplett neu gezeichnet werden oder
gibt es eine Möglichkeit, das auf 2 Ebenen zu trennen und man zeichnet nur zyklisch in den Vordergrund und die
Grafikkarte setzt das überlagert zusammen?
Es geht im Grundsatz darum, Objekte vor einem Hintergrund zu bewegen.
Die Frage ist, muss dass auf einer Ebene, einem Screen alles zusammen immer komplett neu gezeichnet werden oder
gibt es eine Möglichkeit, das auf 2 Ebenen zu trennen und man zeichnet nur zyklisch in den Vordergrund und die
Grafikkarte setzt das überlagert zusammen?
Re: Überlagertes Zeichnen, Objekte vor Hintergrund bewegen
Man kann nur übermalen. Also den Bereich hinter den bewegten Objekt neu zeichnen.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Re: Überlagertes Zeichnen, Objekte vor Hintergrund bewegen
@mk-soft
Danke! Das wollte ich wissen. Bevor ich irgendwas anfange.
Dann bin ich also state of the art, wenn man alles neu zeichnet.
Ein Geschwindigkeits- und Flackerproblem sollte es dann auch nicht geben
(zumindest wenn man mit FlipBuffers arbeitet).
Danke! Das wollte ich wissen. Bevor ich irgendwas anfange.
Dann bin ich also state of the art, wenn man alles neu zeichnet.
Ein Geschwindigkeits- und Flackerproblem sollte es dann auch nicht geben
(zumindest wenn man mit FlipBuffers arbeitet).
-
- Beiträge: 659
- Registriert: 19.10.2014 15:51
- Kontaktdaten:
Re: Überlagertes Zeichnen, Objekte vor Hintergrund bewegen
Da das auch gerade mein Thema ist, hatte ich folgende Idee:
Bevor ich etwas zeichne, möchte ich den Hintergrund speichern, damit ich ihn zum "löschen" bzw. Übermalen benutzen kann.
Also ich möchte beispielweise vom meinem Canvasimage das Teilbild 100,100,600,300 speichern, um es später benutzen zu können.
Aber wie mache ich das?
Wie bekomme ich das IMage, welches im Canvasgadget ist zu fassen?
Mit
..bekomme ich nur die ImageID, mit der ich nichts anfangen kann.
Ich kann sie leider nicht für grabimage() benutzen.
Hat jemand einen Tip?
Bevor ich etwas zeichne, möchte ich den Hintergrund speichern, damit ich ihn zum "löschen" bzw. Übermalen benutzen kann.
Also ich möchte beispielweise vom meinem Canvasimage das Teilbild 100,100,600,300 speichern, um es später benutzen zu können.
Aber wie mache ich das?
Wie bekomme ich das IMage, welches im Canvasgadget ist zu fassen?
Mit
Code: Alles auswählen
canvasImage = GetGadgetAttribute(#canvasgadget, #PB_Canvas_Image)
Ich kann sie leider nicht für grabimage() benutzen.
Hat jemand einen Tip?
Ich programmiere nur noch mit Linux.
Linux Mint 21.x
Linux Mint 21.x
- NicTheQuick
- Ein Admin
- Beiträge: 8679
- Registriert: 29.08.2004 20:20
- Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti - Wohnort: Saarbrücken
- Kontaktdaten:
Re: Überlagertes Zeichnen, Objekte vor Hintergrund bewegen
Bist du sicher?
Kann man nicht mit DrawingMode(#PB_2DDrawing_AlphaBlend) und DrawImage() zwei transparente Images übereinander legen? So kann man sich doch ganz einfach verschiedene Layer als Images generieren und immer übereinander zeichnen?
Ich hab es jetzt (noch) nicht ausprobiert, weil mir die Zeit fehlt, aber laut Hilfe müsste das doch klappen.
Re: Überlagertes Zeichnen, Objekte vor Hintergrund bewegen
Canvas in Image sichern!
Code: Alles auswählen
Define temp_image
; Canvas in Image kopierern
StartDrawing(CanvasOutput(1))
temp_image=GrabDrawingImage(#PB_Any,0,0,OutputWidth(),OutputHeight())
StopDrawing()