Derzeitigen DrawingBuffer zwischenspeichern

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Benutzeravatar
gnasen
Beiträge: 578
Registriert: 01.08.2007 14:28
Computerausstattung: PB 4.60

Derzeitigen DrawingBuffer zwischenspeichern

Beitrag von gnasen »

Hi,
ich habe ein kniffliges Problem in Bezug auf den Buffer. Mal eine Skizze:

usebuffer(sprite)
...zeichnezeichne...
--->ProcAufruf
--->storeBuffer = ?
--->usebuffer(VlltAnderesSprite)
--->...zeichnezeichne...
--->usebuffer(storeBuffer)
...zeichnezeichne
usebuffer(#pb_default)

So und dazu besser mal eine Erklärung :lol:
Also ich nutze eine Prozedur, welche UseBuffer() nutzt. Wenn ich allerdings vorher diesen Befehl schon genutzt habe, muss ich ja zwischenspeichern, wo UseBuffer() vorher hingezeigt hat.

Meine Annäherungsversuche mit DrawingBuffer() waren kläglich.

Vllt kennt ja jemand Rat.
pb 4.51
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7032
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag von STARGÅTE »

ungeprüft würde ich das so machen:

Code: Alles auswählen

Global NewList BufferElement()
Procedure OpenBuffer(Sprite)
 UseBuffer(Sprite)
 AddElement(BufferElement())
 BufferElement() = Sprite
EndProcedure
Procedure CloseBuffer()
 DeleteElement(BufferElement())
 If CountList(BufferElement())
  UseBuffer(BufferElement())
 Else
  UseBuffer(-1)
 EndIf
EndProcedure
So kannst du ein Buffer öffen, und danach wiederum noch einen, wenn du den inneren dann wieder schließt, wird wieder zum alten Buffer gesprungen, oder zu -1 wenn keiner mehr da ist.

EDIT:
Man könnte es auch mit Macros machen, sodass du weiter hin UseBuffer verwenden kannst, aber im Macro dann jedoch die Buffer-Aufruf-Reihenfolge gespeichert wird. danach könnte man dann eine neue Konstante einführen zB. #PB_OldBuffer = -2 was dann bedeutet das wieder zum letzteren Buffer gesprungen wird.

Also so: (code ungeprüft)

So kannst du wie gewohnt UseBuffer verwenden, und wenn du ihn nicht mehr brauchst, dann schießt du ihn mit UseBuffer(#PB_OldBuffer) was dann entweder zum Screen zurück geht (-1) oder zum letzteren Buffer

Code: Alles auswählen

Global NewList BufferElement() 

#PB_OldBuffer = -2

Procedure MyUseBuffer(Sprite)
 If Sprite = #PB_OldBuffer
  DeleteElement(BufferElement()) 
  If CountList(BufferElement()) 
   UseBuffer(BufferElement()) 
  Else 
   UseBuffer(-1) 
  EndIf 
 Else
  UseBuffer(Sprite) 
  AddElement(BufferElement()) 
  BufferElement() = Sprite 
 EndIf
EndProcedure 

Macro UseBuffer(Sprite)
 MyUseBuffer(Sprite)
EndMacro
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
gnasen
Beiträge: 578
Registriert: 01.08.2007 14:28
Computerausstattung: PB 4.60

Beitrag von gnasen »

als Workaround eine gute Idee (ich hatte jetzt immer den Buffer als Parameter an die Funktion übergeben, aber ist halt sehr beholfen).

Dennoch muss es doch eine Möglichkeit geben, den Buffer zu erhalten ala

Buffer = GetBuffer()
UseBuffer(Buffer)
pb 4.51
Antworten