2D gezeichnete Objekte "radieren"

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Benutzeravatar
Vermilion
Beiträge: 1846
Registriert: 08.04.2006 16:00
Computerausstattung: Apple iMac (2010) & HP Notebook
Wohnort: Heidekreis

2D gezeichnete Objekte "radieren"

Beitrag 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?
Bild

Immer die neueste PureBasic Version. Auf allem Betriebssystemen. Ich bin ein OS-Nomad!
sim0n
Beiträge: 131
Registriert: 12.09.2004 13:18
Kontaktdaten:

Beitrag 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
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Beitrag 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.
Zuletzt geändert von bobobo am 27.04.2006 12:08, insgesamt 1-mal geändert.
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Vermilion
Beiträge: 1846
Registriert: 08.04.2006 16:00
Computerausstattung: Apple iMac (2010) & HP Notebook
Wohnort: Heidekreis

Danke

Beitrag von Vermilion »

Eigentlich nur einzelne "Objekte", egal!
:D
Danke
Bild

Immer die neueste PureBasic Version. Auf allem Betriebssystemen. Ich bin ein OS-Nomad!
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Antworten