Text flimmert trotz Backbuffer(), Flip True und VWait

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

ZEVS

Betreff: Text flimmert trotz Backbuffer(), Flip True und VWait

BeitragDi, Jun 28, 2011 12:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Bei meinem Tower-Defense-Spiel funktioniert eigentlich alles, wenn ich es im Fenster-Modus spiele.
Allerdings wollte ich noch den Vollbildmodus hinzufügen, wobei es immer wieder zu flimmernden Text kommt. D.h., der Text wird mal angezeigt, dann aber auch immer wieder nicht. In einigen Fällen funktioniert es in manchen anderen Fällen aber nicht. Interessanterweise wird alles andere (Bilder, Linien etc.) fehlerfrei angezeigt.
Ein Beispiel:
BlitzBasic: [AUSKLAPPEN]
Function getUserName$()
Local font = LoadFont(useFont, 20, 0, 0, 0)
SetFont font
Color 255, 255, 255
Local name$ = "", quit = 0
Repeat
FlushKeys
Cls
Text 0, 0, "Please enter your name:"
If Len(name) < userNameMaxLength
Text 0, 30, name+"_"
Else
Text 0, 30, name
EndIf
doFlip
WaitEvent
If EventID() = $101 Then
Select EventData()
Case 1
quit = 1
name = ""
Case 14
If Len(name) > 0 Then name = Left(name, Len(name)-1)
Case 28
quit = 1
Default
Local ascii = GetKey()
If ascii >= 33 And ascii <= 126 And Len(name) < userNameMaxLength Then
name = name+Chr(ascii)
EndIf
End Select
EndIf
Until quit = 1
FreeFont font
Repeat
Until Not KeyDown(1)
Return name
End Function

userNameMaxLength ist eine Konstante (Int)
useFont (String) auch.
Die entscheidende Funktion ist wahrscheinlich die folgende:
BlitzBasic: [AUSKLAPPEN]
Function doFlip()
If fullScreen Then DrawImage pointer, MouseX(), MouseY()
VWait
If fullScreen Then
Flip True
Else
FlipCanvas canvas, True
EndIf
End Function

Die Variablen pointer, canvas und fullScreen sind global.
pointer enthält ein Cursor-Bild.
fullScreen ist True, wenn das Spiel im Vollbildmodus abläuft, sonst False.
canvas enthält natürlich ein Canvas, in das das Spiel im Fenstermodus kommt.
edit: natürlich nicht im Vollbildmodus
In allen anderen derartigen Threads wurde das Problem eigentlich immer mit Text, Backbuffer() und VWait gelöst.

Schade, ich dachte eigentlich, ich sei aus der noop-Zeit hinaus (oder ist mein Grafiktreiber veraltet?).
  • Zuletzt bearbeitet von ZEVS am Do, Jun 30, 2011 14:16, insgesamt einmal bearbeitet

ToeB

BeitragDi, Jun 28, 2011 13:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Versuch mal : CreateTimer/WaitTimer und Flip 0.
In Flip 1 ist ja VWait schon drin, deswegen flimmert es wahrscheinlich.

mfg ToeB
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!

ZaP

BeitragDi, Jun 28, 2011 13:01
Antworten mit Zitat
Benutzer-Profile anzeigen
War das nicht eigentlich immer Flip 0? (Timer nicht vergessen)
Starfare: Worklog, Website (download)

ZEVS

Betreff: Timer / Flip False

BeitragDi, Jun 28, 2011 14:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Flip False (0) ändert an der Sache nichts.
Durch Timer flackert er nur besser getimt (in der Timer-Frequenz).

Habe alle Kombinationen probiert (Flip True + Timer, Flip False + Timer, beides ohne Timer), alles erfolglos.

Langsam verzweifle ich

BlitzBasic: [AUSKLAPPEN]
Function doFlip()
If fullScreen Then DrawImage pointer, MouseX(), MouseY()
VWait
If fullScreen Then
Flip False
Else
FlipCanvas canvas, False
EndIf
End Function


Function getUserName$()
Local font = LoadFont(useFont, 20, 0, 0, 0)
SetFont font
Color 255, 255, 255
Local name$ = "", quit = 0, timer = CreateTimer(10)
Repeat
WaitTimer timer
FlushKeys
Cls
Text 0, 0, "Please enter your name:"
If Len(name) < userNameMaxLength
Text 0, 30, name+"_"
Else
Text 0, 30, name
EndIf
doFlip
WaitEvent
If EventID() = $101 Then
Select EventData()
Case 1
quit = 1
name = ""
Case 14
If Len(name) > 0 Then name = Left(name, Len(name)-1)
Case 28
quit = 1
Default
Local ascii = GetKey()
If ascii >= 33 And ascii <= 126 And Len(name) < userNameMaxLength Then
name = name+Chr(ascii)
EndIf
End Select
EndIf
Until quit = 1
FreeFont font
Repeat
Until Not KeyDown(1)
Return name
End Function

ToeB

BeitragDi, Jun 28, 2011 15:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Wie gesagt, Flip 1 beinhaltet VWait, wenn du Flip 0 + Timer verwenden willst musst du VWait ausmachen Wink

mfg ToeB
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!

aMul

Sieger des Minimalist Compo 01/13

BeitragDi, Jun 28, 2011 17:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe wenig Ahnung von BlitzPlus, deshalb weiß ich nicht ob an den BP-eigenen Befehlen etwas falsch ist.
Aber vielleicht lohnt es sich allgemein erst mal mit einem kleineren Code anzufangen und zu testen ob dieser das gleiche Problem hat.

Zum Beispiel dieser hier:
BlitzBasic: [AUSKLAPPEN]
Graphics(0, 0, 32, 1)

Local timer = CreateTimer(60)

SetBuffer(BackBuffer())

Repeat

Text(MouseX(), MouseY(), "mouse")

Flip(0)
Cls
WaitTimer(timer)

Until KeyHit(1)


Funktioniert bei mir wie erwartet perfekt.
Solltest du mit diesem Code auch ein Problem haben, wissen wir zumindest, dass es nicht am Code liegt.
Falls doch, kannst du zum Test eine Sache nach der anderen hinzufügen, bis du das Problem eingegrenzt hast.
Panic Pong - ultimate action mashup of Pong and Breakout <= aktives Spiele-Projekt, Downloads mit vielen bunten Farben!
advASCIIdraw - the advanced ASCII art program <= aktives nicht-Spiele-Projekt, must-have für ASCII/roguelike/dungeon-crawler fans!
Alter BB-Kram: ThroughTheAsteroidBelt - mit Quelltext! | RGB-Palette in 32²-Textur / Farbige Beleuchtung mit Dot3 | Stereoskopie in Blitz3D | Teleport-Animation Screensaver

ZEVS

BeitragDi, Jun 28, 2011 19:49
Antworten mit Zitat
Benutzer-Profile anzeigen
In der Tat, auch hier blinkt der Text.
Ich werde mal einen anderen Treiber ausprobieren.

Trotzdem danke an alle Tipps, auch wenn sie das Problem nicht beheben.

edit:
Tatsächlich kann ich mit einem anderen Treiber das Flackern vermeiden.
Hier der veränderte Test-Code:
BlitzBasic: [AUSKLAPPEN]
Local drivers = CountGfxDrivers()
Const driverName$ = "Native"
For driver = 1 To drivers ;[edited]
If GfxDriverName(driver) = driverName Then Goto start
Next
RuntimeError "Couldn't find driver '"+driverName+"'"

.start
SetGfxDriver driver


Const sx = 800, sy = 600
Graphics sx, sy, 16, 1

Local timer = CreateTimer(60)

SetBuffer(BackBuffer())

Repeat

Text(MouseX(), MouseY(), "mouse")

Flip(0)
Cls
WaitTimer(timer)

Until KeyHit(1)


Ich muss nur den Treiber DirectDraw vermeiden. Mit den Treibern OpenGL und Native funktioniert es (OK, bei OpenGL bekomme ich eine Fehlermeldung beim Beenden des Programms, außerdem ist der Wechsel sichtlich aufwändiger).

Weiß gemand, ob ich einen dieser Treiber vorraussetzen kann?

hazumu-kun

BeitragDi, Jun 28, 2011 21:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Beim OpenGL Treiber musst du das Programm eventuell über die API Funktion exitprocess beenden damit die Fehlermeldung nicht kommt.

Decls:
Code: [AUSKLAPPEN]

.lib "kernel32.dll"
api_ExitProcess (uExitCode%) : "ExitProcess"


Im Code dann mit "api_ExitProcess" aufrufen.
Warum kann es keine omnipotente Macht geben?
Weil diese omnipotente Macht in der Lage sein müsste, einen so schweren Stein zu schaffen, dass sie ihn nicht heben kann
-> nicht omnipotent

ZEVS

Betreff: Native?

BeitragMi, Jun 29, 2011 14:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Kann ich nicht einfach den Treiber "Native" nehmen?
Weiß jemand, ob ich diesen Treiber, der mir sichtlich lieber ist, nehmen kann?

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group