BackBuffer() und CLS frage
Übersicht

![]() |
f-codeBetreff: BackBuffer() und CLS frage |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo ihr BB Profis ![]() 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 ![]() Aber danke schon mal im voraus ![]() |
||
http://www.f-code.ch/ Schaut doch mal vorbei |
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Du kannst statt dem Backbuffer auch einen ImageBuffer ansprechen und diesen dann jeweils in den Backbuffer zeichnen.
musste halt einfach alles 2x zeichnen ![]() |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
Roseman |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Danke für die antworte. ![]() Ich habe schon Réne's buch gelesen und auch die Robsite ist so eine seite die ich täglich besuche ![]() 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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
![]() |
f-code |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() ja danke nochmals für eure hilfe ![]() |
||
http://www.f-code.ch/ Schaut doch mal vorbei |
![]() |
skey-z |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group