BackBuffer() und CLS frage

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

f-code

Betreff: BackBuffer() und CLS frage

BeitragFr, März 17, 2006 12:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo ihr BB Profis Very Happy

Ich versuche wieder in BB etwas zu machen, bin aber schon mal an etwas gestossen das ich iergendwie nicht verstehe.

Ich mach mal ein Beispiel:
(ist nur ein Beispiel. Ich habe noch kein spiel oder ähnliches..)

Ich programmiere ein Weltraumshooter in 2D. Da zeichne ich plots die von rechts nach links fliegen. Ein Raumschiff das mit der maus gesteuert wird ist auch dabei, gegner sollten auch noch kommen und iergendwie hätte ich noch gerne ein paar anzeigen etc....

Jetzt kommt mein problem. Ich zeichne alles immer in den BackBuffer und mittels Flip wechsle ich das soeben gezeichnete in den FrontBuffer.
Wenn ich nun etwas weg haben möchte dann lösche ich es ja mit dem Befehl CLS. Aber das löscht normalerweise den gesamten Bildschirm.

Gibt es eine möglichkeit das ich auch nur bestimmte objekte löschen kann? Oder vielleicht gibts eine möglichkeit das ich objekte anstatt ins Backbuffer direkt auf einem anderen buffer zeichnen könnte und dann immer nur das jeweilige buffer ansprechen.

Ist n bisse'l kompliziert geschrieben ich weiss Rolling Eyes

Aber danke schon mal im voraus Wink
http://www.f-code.ch/ Schaut doch mal vorbei
 

Dreamora

BeitragFr, März 17, 2006 12:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Du kannst statt dem Backbuffer auch einen ImageBuffer ansprechen und diesen dann jeweils in den Backbuffer zeichnen.
musste halt einfach alles 2x zeichnen Wink
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
 

Roseman

BeitragFr, März 17, 2006 12:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn du für deine "plots" vorher ein eigenes Image erstellst, welches größer ist als dein Ausgabebildschirm, dann kannst du damit den Hintergrund scrollen.
Ich denke mal, daß diese Sache das ist, worums dir am meisten geht.

Also entweder vorher in nen Imagebuffer den Hintergrund zeichnen, oder direkt mit nem Malprogramm ein Hintergrundbild entwerfen.
Das dann im Hintergrund scrollen lassen.

Alternativ kannst du deine Pünktchen auch als eigene Objekte behandeln (Sei es mithilfe von Arrays oder Types), und dann bei jedem Frame die Koordinaten verändern.
Obwohl man damit recht einfach soetwas wie ParalaxScrolling hinbekommt, würd ich persöhnlich aber aus Performancegründen davon abraten.

Mfg
Roseman
 

ke^kx

BeitragFr, März 17, 2006 12:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn ich dich richtig verstanden habe: Immer wenn du irgendetwas am Bildschrim verändert haben möchtest, musst du nur die Position, an der du es zeichnest verändern. Wenn du es z.B. garnicht zeichnen möchtest, lässt du halt einfach das DrawImage oder Plot weg... ich weiß, ist nciht so gut erklärt^^ Guck dir am besten mal Rob's Tutorial auf Robsite an. Da ist das alles sehr gut erklärt.

Jiriki
http://i3u8.blogspot.com
Asus Striker II
Intel Core2Quad Q9300 @ 2,5 GHz (aber nur zwei Kerne aktiv aufgrund der Instabilität -.-)
Geforce 9800 GTX
2GB RAM

f-code

BeitragFr, März 17, 2006 14:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke für die antworte. Wink Das sollte schon mal helfen mit dem Imagebuffer.....

Ich habe schon Réne's buch gelesen und auch die Robsite ist so eine seite die ich täglich besuche Smile

Ich glaube einfach das ich das ganze mit den buffer nicht mal verstehe!

Muss man wirklich immer alles löschen und wieder neu zeichnen?

Wie macht ihr das wenn ihr das Spiel und GUI und vielleicht noch eine lauftschrift zeigen müssen? Backbuffer und alles immer neu zeichnen ?
http://www.f-code.ch/ Schaut doch mal vorbei
 

ke^kx

BeitragFr, März 17, 2006 14:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Z.B. ein sich bewegender Gegenstand wird in jedem Schleifendurchlauf neu auf den Bakbuffer gezeichnet, bloß halt immer 1, 2 oder 3 (oder mehr^^) Pixel weiter in der Richtung, in der er sich bewegt. Der Backbuffer ist dabei eigentlich nur dafür da, dass es nicht flimmert.

Jiriki
http://i3u8.blogspot.com
Asus Striker II
Intel Core2Quad Q9300 @ 2,5 GHz (aber nur zwei Kerne aktiv aufgrund der Instabilität -.-)
Geforce 9800 GTX
2GB RAM
 

Dreamora

BeitragFr, März 17, 2006 16:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Den Backbuffer musst du in jedem Fall löschen.

Aber ich erkläre das glaub Mal kurz, wofür die Buffer da sind:

FrontBuffer: Das ist das, was du gerade siehst. Wenn du hier reinzeichnen würdest, würde es direkt sichtbar -> nicht sehr wünschenswert

BackBuffer: Eigentlich nichts anderes als ein zweiter Frontbuffer, der aktuell aber nicht sichtbar ist. Mit Flip wird der alte FrontBuffer zum Backbuffer und der Backbuffer zum Frontbuffer (in aktuellen Systemen kann nicht garantiert werden, das Frontbuffer -> Backbuffer, weil eine FlipChain bis zu 8 Bilder vorausrendern kann wenn im Treiber oder DirectX Code nicht anderst eingestellt). Dies hat den Zweck, dass du dein komplettes nächstes Bild vorauszeichnen kannst, ohne das dadurch das aktuell Bild gestört wird. Dadurch wird auch die Grafikkarte besser ausgelastet, ansonsten müsste sie warten.
Da jedoch beim Wechsel der Buffer durch Flip nichts verschoben oder gelöscht wird, sondern nur der Zeiger auf den Buffer umgehängt wird, ist der gesamte Inhalt des Frontbuffers im Backbuffer. Deswegen muss man theoretisch CLS verwenden, um den Inhalt zu löschen (er wird einfach mit der Farbe übermalt). Praktisch ist es jedoch so, dass wenn du den Bildschirm vollständig übermalst, CLS nicht nötig ist, da die alten Daten dann sowieso übermalt werden.

ImageBuffer: Dieser Buffer repräsentiert den Inhalt des Bildes, das du angibst. Das gibt dir die Möglichkeit, das Bild direkt zu manipulieren. In diesem Falle ist kein Flip notwendig, da ein ImageBuffer nur ein einzelner Buffer ist.


Vielleicht hilft dir das ja, das ganze ein wenig zu verstehen Smile
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

f-code

BeitragFr, März 17, 2006 16:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Da jedoch beim Wechsel der Buffer durch Flip nichts verschoben oder gelöscht wird, sondern nur der Zeiger auf den Buffer umgehängt wird, ist der gesamte Inhalt des Frontbuffers im Backbuffer



danke das hilft schon einiges Wink das heisst ja so rein theoretisch: wenn ich eine animation hätte die aus 2 bildern besteht und immer wiederholt werden müsste, so müsste ich ja einfach tausend mal flip schreiben.... auch wenns zu schnell, und überhaupt nicht der sinn vond er sache wäre...

ja danke nochmals für eure hilfe Very Happy
http://www.f-code.ch/ Schaut doch mal vorbei

skey-z

BeitragFr, März 17, 2006 20:39
Antworten mit Zitat
Benutzer-Profile anzeigen
um nicht alles enu zeichnen zu müssen, kannst du ein Bild in der größe deiner vorhandenen Einstellungen erzeugen und alles was sich nihct verändert, seien es Positionen oder etwas animiertes dort hinein zeichnen.

somit musst du dann in der Hauotschleife nur dieses Bild und alles was sich bewegt oder animiert ist neu zeichnen und nicht wirklich alle gegenstände, die zu sehen sind.

Ich denke aber, dass diese Variante langsamer und Speicherintensiver ist, alles wirklich alles zu zeichnen, musst du aber selber wissen.
Awards:
Coffee's Monatswettbewerb Feb. 08: 1. Platz
BAC#57: 2. Platz
Twitter

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group