Überlagertes Zeichnen, Objekte vor Hintergrund bewegen

Für allgemeine Fragen zur Programmierung mit PureBasic.
SMaag
Beiträge: 150
Registriert: 08.05.2022 12:58

Überlagertes Zeichnen, Objekte vor Hintergrund bewegen

Beitrag von SMaag »

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.
Zuletzt geändert von SMaag am 26.11.2022 23:55, insgesamt 1-mal geändert.
Benutzeravatar
juergenkulow
Beiträge: 188
Registriert: 22.12.2016 12:49
Wohnort: :D_üsseldorf-Wersten

Re: Überlagetes Zeichnen, Vector Drawing

Beitrag von juergenkulow »

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
SMaag
Beiträge: 150
Registriert: 08.05.2022 12:58

Re: Überlagetes Zeichnen, Vector Drawing

Beitrag von SMaag »

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?
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Überlagertes Zeichnen, Objekte vor Hintergrund bewegen

Beitrag von mk-soft »

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
SMaag
Beiträge: 150
Registriert: 08.05.2022 12:58

Re: Überlagertes Zeichnen, Objekte vor Hintergrund bewegen

Beitrag von SMaag »

@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).
stevie1401
Beiträge: 659
Registriert: 19.10.2014 15:51
Kontaktdaten:

Re: Überlagertes Zeichnen, Objekte vor Hintergrund bewegen

Beitrag von stevie1401 »

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

Code: Alles auswählen

 canvasImage = GetGadgetAttribute(#canvasgadget, #PB_Canvas_Image)
..bekomme ich nur die ImageID, mit der ich nichts anfangen kann.
Ich kann sie leider nicht für grabimage() benutzen.
Hat jemand einen Tip?
Ich programmiere nur noch mit Linux.
Linux Mint 21.x
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
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

Beitrag von NicTheQuick »

mk-soft hat geschrieben: 27.11.2022 01:06 Man kann nur übermalen. Also den Bereich hinter den bewegten Objekt neu zeichnen.
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.
Bild
SMaag
Beiträge: 150
Registriert: 08.05.2022 12:58

Re: Überlagertes Zeichnen, Objekte vor Hintergrund bewegen

Beitrag von SMaag »

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()

Antworten