Seite 1 von 1

2D gezeichnete Objekte "radieren"

Verfasst: 25.04.2006 18:26
von Vermilion
Also, ich öffne einen Bildschirm ( OpenScreen(...) ), dann führe ich simple Zeichenoperationen (innerhalb vom StartDrawing(ScreenOutput() und StopDrawing() Bereich) aus, wie Box(x,y,Height,Width etc.), nun Stelle ich mir die Frage, wie kann ich die Box die ich gezeichnet habe wieder verschwinden lassen?

Verfasst: 25.04.2006 18:55
von sim0n
Wenn du den ganzen Bildschirm löschen möchtest, dann mit

Code: Alles auswählen

ClearScreen(R, G, B)
Oder möchtest du nur, dass das eine vorher gezeichneten Elemente auf dem Bildschirms gelöscht wird?

mfg sim0n

Verfasst: 25.04.2006 19:55
von bobobo
Nur um Schwierigkeiten vorzubeugen.

Im "D-Drawing gibt es keine "Elemente" die ansprechbar wären außer den
"Mal-Untergründen" (ScreenOutput(),Spriteoutput(),....)

Das Übermalen mit den benötigten Elemente nach einem Clearscreen(...)
ist hier der richtige Weg.

Übrigens solltest Du im 2d-Fall in ein Image malen und dieses auf einem ImageGadget darstellen (so möglich).

Machst Du das ganze per Sprites (also mit 3D,) dann sind die Sprites
natürlich einzeln als "Elemente" ansprechbar, verschiebbar,löschbar,...

Zuende gedacht (auch unter Berücksichtigung des folgenden Beitrags)
sind beide Methoden vom Aufbau der Bildelemente eigentlich nicht so
sehr unterschiedlich (Die benutzten Ressourcen mal außen vor
gelassen). In 3D MUSST Du den screen flippen .. in 2D allerdings musst
Du nur dann ein neues Bild zeichnen wenn es auch nötig (der Bildinhalt
hat sich geändert) ist.

Verfasst: 25.04.2006 20:29
von Kaeru Gaman
dazu kommt:
bei nem screen im gegensatz zu nem window, musst du jeden frame neu zeichnen.
d.h. wenn du später etwas weglassen willst, dann entscheidest du, was du nicht neuzeichnest

Danke

Verfasst: 27.04.2006 18:15
von Vermilion
Eigentlich nur einzelne "Objekte", egal!
:D
Danke

Verfasst: 27.04.2006 18:31
von Kaeru Gaman
> beide Methoden vom Aufbau der Bildelemente eigentlich nicht so sehr unterschiedlich

das stimmt. bei nem screen wärs das regelmäßige flipping, bei nem fensterhintergrund ein refresh-ereignis. wenn auf ein Image gezeichnet wird, eben dort die veränderung.

grundsätzlich, um es nochmal zu wiederholen, musst du weg von der 'objekt' vorstellung.
wenn du ne box zeichnest, werden auf dem zeichenhintergrund die pixel gesetzt und fertig.
nicht die box ist ein objekt, sondern die gesamte zeichenfläche,
die durch den zeichenvorgang gleichsam ihre textur ändert.


also, wenn du bei der 'objekt' vorstellung bleiben willst,
kannst du z.b. eine liste erstellen, in der du alle zeichnungselemente speicherst.
bei einer bilderneuerung kannst du dann die komplette zeichenfläche löschen, und eine box neuzeichnen.


das löschen einer einzelnen box ist durch überzeichnen in der hintergrundfarbe möglich, dadurch werden aber auch andere elemente, die sich überschneiden, entsprechend "beschnitten".

(ich bastel mal fix nen code zur verdeutlichung, edit kommt glei)

[edit]
voila:

Code: Alles auswählen

OpenWindow(0, 0,0, 400,300, #PB_Window_ScreenCentered | #PB_Window_SystemMenu , "DrawDemo" )
    CreateGadgetList(WindowID(0))
        ButtonGadget(1,  20,20,160,20, "Off")
        ButtonGadget(2, 220,20,160,20, "On")

StartDrawing(WindowOutput())
Box(0,0,400,300,RGB(128,128,128))
Circle(150,120,60,RGB(255,0,0))
Box(150,100,100,100,RGB(0,255,255))
Box(220,150,100,100,RGB(0,255,0))
StopDrawing()

Repeat

    WinEventID = WindowEvent()

If WinEventID = #PB_Event_Gadget
    Select EventGadgetID()
        Case 1
            StartDrawing(WindowOutput())
                Box(150,100,100,100,RGB(128,128,128))
            StopDrawing()
        Case 2
            StartDrawing(WindowOutput())
                Box(150,100,100,100,RGB(0,255,255))
            StopDrawing()
    EndSelect
EndIf

Until WinEventID = #PB_Event_CloseWindow