Flimmern am oberen Bildschirmrand?

Übersicht BlitzBasic Beginners-Corner

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

 

funkmaster5000

Betreff: Flimmern am oberen Bildschirmrand?

BeitragMo, Aug 06, 2012 15:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo!

Ich habe oben benanntes Problem in Blitz3D (ist aber ein 2D Spiel). Sobald meine Figur in den Bereich y~80 beginnt die Spielergrafik zu flimmern. Es ist ein AnimImage. Könnte es daran liegen, dass das Bild aus der Mitte des Sets ist? Das fette x wäre das besagte Bild.
xxx
Xxx
xxx

Der Bildschirm wird mit CLS Color gelöscht, was ich sowieso noch anpasse und ein Hintergrundbild verwende. Allerdings hat ein Weglassen dieses Befehls sowieso keine Verbesserung gebracht.

Nicht animierte Bilder flimmern nicht.

Noch eine weitere Frage: Gibt es verschiedene Bildebenen, die ich definieren muss (kann), oder gilt, was zuerst gezeichnet wird, ist eine Ebene hinter einer neuen Zeichnung?

Danke im Voraus!

ZaP

BeitragMo, Aug 06, 2012 15:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,
wir werden schon etwas Code brauchen, um dir helfen zu können. Beim Zeichnen gilt immer: Das was gerade gezeichnet wird, überschreibt alles darunter.
Starfare: Worklog, Website (download)

Midimaster

BeitragMo, Aug 06, 2012 16:02
Antworten mit Zitat
Benutzer-Profile anzeigen
arbeitest Du schon mit der Option BackBuffer()?

BlitzBasic: [AUSKLAPPEN]
SetBuffer BackBuffer()


klicke einfach auf die beiden Befehle im Kästchen oben ... Dann geht die Hilfe zu BB an der entsprechenden Stelle auf.
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe
 

funkmaster5000

BeitragMo, Aug 06, 2012 18:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja der BackBuffer ist natürlich eingestellt, trotzdem guter Gedanke. Wenn der Fehler näher eingrenzbar wäre, wüsste ich, welcher Code von belang ist. Ich habe eine Sub zum zeichnen der Map, zeichnen von Gegenständen auf der Map, Animation des Spielers, Steuerung und natürlich die Hauptspielschleife, die alle Subs aufruft.

Ich denke, das Spezielle an diesem Problem ist, dass es nur im oberen Randbereich des Bildschirms auftritt, also kann man denke ich den BackBuffer ausschließen, ebenso wie CLS.

EDIT:
Ich konnte das Problem auf die Sub zum Mapzeichnen eingrenzen. Allerdings sieht die mir nicht danach aus, dass was falsch sein könnte.

Mein Level liegt in einem Feld und die Koordinaten werden abhängig von der Spielergeschwindigkeit angepasst, ebenso mein Hintergrundbild.

Code: [AUSKLAPPEN]
.Drawmap
level(22)=Rand(0,2)


For z%=1 To 22
For i%=1 To 22
If level(i%)=0 Then       
DrawImage desert,levelx(i%)-playerspeed%,mapy%,0
End If
If level(i%)=1 Then
DrawImage desert,levelx(i%)-playerspeed%,mapy%,1
End If
If level(i%)=2 Then
DrawImage desert,levelx(i%)-playerspeed%,mapy%,2
End If
Next
Next


For i%=1 To 2
If background(i%)=1 Then
DrawImage sandmountain,backgroundx(i%)-backgroundspeed%,backgroundy%
End If
If background(i%)=2 Then
DrawImage gray,backgroundx(i%)-backgroundspeed%,backgroundy%
End If
Next

Return

Xeres

Moderator

BeitragMo, Aug 06, 2012 19:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi auch!
Wie sieht denn der Code zum Laden der Bilder/Animationen aus? Oder hast du ein Screenshot mit dem Sichtbaren Fehler (wenn, bitte im Archiv hochladen).

Ein paar Allgemeine Hinweise:
A) Code mit Tabulatoren einrücken - erhöht die Lesbarkeit ungemein.
BlitzBasic: [AUSKLAPPEN]
.Drawmap
level(22)=Rand(0,2)


For z%=1 To 22
For i%=1 To 22
If level(i%)=0 Then
DrawImage desert,levelx(i%)-playerspeed%,mapy%,0
End If
If level(i%)=1 Then
DrawImage desert,levelx(i%)-playerspeed%,mapy%,1
End If
If level(i%)=2 Then
DrawImage desert,levelx(i%)-playerspeed%,mapy%,2
End If
Next
Next


For i%=1 To 2
If background(i%)=1 Then
DrawImage sandmountain,backgroundx(i%)-backgroundspeed%,backgroundy%
End If
If background(i%)=2 Then
DrawImage gray,backgroundx(i%)-backgroundspeed%,backgroundy%
End If
Next

Return

und B) Benutze um Himmels willen kein GoSub oder (schlimmer) GoTo. Benutze function - kapselt den Code besser und wird dir auf lange Sicht viel Ärger ersparen.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

funkmaster5000

BeitragMo, Aug 06, 2012 19:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich rücke den Code natürlich ein, das ist da aber noch nicht geschehen, ich formatiere ihn und versehe ihn mit Kommentaren, sobald er funktioniert und keine Änderungen mehr gemacht werden müssen, aber ich denke, jeder macht das anders. Trotzdem Danke für den Hinweis!

Das ist mein erstes größeres Projekt (eigentlich...das erste Smile ) und es gibt nur wenige geplante Subs, deswegen leidet die Übersichtlichkeit nicht. Allerdings werde ich in Zukunft sicher Functions benötigen, wobei ich jetzt erst erfahre, dass sie Vorteile bieten.

Hier werden die Bilder geladen (das Tileset heißt desert) und besteht aus 3 unterschiedlichen Sandtiles. Es handelt sich um einen Sidescroller, die Tiles sind jeweils 32*32 Px groß und sobald das erste Tile aus dem Bild ist, wird per Zufall ein neues kreeirt und von vorne, damit ein Eindruck von unendlicher Wüste entsteht.

Code: [AUSKLAPPEN]
player=LoadAnimImage("gfx/player.png",32,32,0,16)
desert=LoadAnimImage("gfx/desert.png",32,32,0,3)
sandmountain=LoadImage("gfx/sandmountain.png")
gray=LoadImage("gfx/gray.png")
cloud1=LoadImage("gfx/cloud1.png")
cloud2=LoadImage("gfx/cloud2.png")
cloud3=LoadImage("gfx/cloud3.png")
MaskImage player,0,240,255
MaskImage sandmountain,0,240,255
MaskImage gray,0,240,255
MaskImage cloud1,0,240,255
MaskImage cloud2,0,240,255
MaskImage cloud3,0,240,255

Propellator

BeitragMo, Aug 06, 2012 20:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Ich rücke den Code natürlich ein, das ist da aber noch nicht geschehen, ich formatiere ihn und versehe ihn mit Kommentaren, sobald er funktioniert und keine Änderungen mehr gemacht werden müssen, aber ich denke, jeder macht das anders. Trotzdem Danke für den Hinweis!

So funktioniert Programmieren nicht. Du rückst den Code für dich selbst ein, um es für dich selbst hier und jetzt übersichtlich zu machen. Es ist kein Formatieren wie in Microsoft Word. Der einzige Grund, wieso man ihn so formatiert, ist um während dem coden keine Fehler zu machen.

Zitat:
und es gibt nur wenige geplante Subs, deswegen leidet die Übersichtlichkeit nicht.

Verwende einfach von Anfang an Functions. GoTo/GoSub ist schlechter Programmierstil. Es geht hier weniger um die Grösse des Projekts sondern um Disziplin und gute Praxis.
Propellator - Alles andere ist irrelephant.
Elefanten sind die Könige der Antarktis.
 

funkmaster5000

BeitragMo, Aug 06, 2012 20:51
Antworten mit Zitat
Benutzer-Profile anzeigen
[quote="Propellator"]Zitat:

Verwende einfach von Anfang an Functions. GoTo/GoSub ist schlechter Programmierstil. Es geht hier weniger um die Grösse des Projekts sondern um Disziplin und gute Praxis.


Stimmt! Auf den Stil kommt es natürlich auch an. Ist es schwer, Subs in eine Function zu überführen (ohne meine eigentliche Frage aus dem Sinn zu verlieren Very Happy )?

Xeres

Moderator

BeitragMo, Aug 06, 2012 21:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn du Funktionen verwendest, musst du zwischen Localen und Globalen Variablen unterscheiden. Ein mit Dim erstelltes Array ist immer Global. Je weniger Globale Variablen, desto besser (aber Ressourcen wie z.B. Bilder sind vermutlich ganz gut im globalen Namensraum aufgehoben).

Und was das Flimmern betrifft: Macht Flip(0) oder Flip(1) einen Unterschied? Manche Leute bemerken tearing mehr als andere.

Oh, und:
~VERSCHOBEN~

Sieht mir mehr nach einem Anfänger Thema aus. Wink
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

funkmaster5000

BeitragMo, Aug 06, 2012 21:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Nein, das behebt das Problem leider nicht. Vergesst bitte nicht, dass das Problem nur lokal auftritt und nicht auf dem ganzen Bildschirm. Nur bis ungefähr y<=80 und nur mit einem animierten Bild. Ist es ein nicht animiertes Bild, ist der Effekt nicht da.

BladeRunner

Moderator

BeitragMo, Aug 06, 2012 22:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Ohne code nix los. Lad dein Projekt hoch damit wir uns ein Bild von dem Probnlem machen können. Oder teste selbst mal auf einem anderen Rechner.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

Xeres

Moderator

BeitragMo, Aug 06, 2012 22:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Das Erste, was ich getippt hätte war: Deine Bilder haben nicht die richtige Größe bzw. die Angaben für ein Frame passen nicht ganz dazu, sodass 1px abgeschnitten wird... Aber der Effekt ist Positionsabhängig und tritt bei y>80 nicht mehr auf?
Da würde ich dich fast schon bitten, Code und Ressourcen zu zippen & hoch zu laden, damit ich selber mal alles anschauen kann.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

funkmaster5000

BeitragDi, Aug 07, 2012 20:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Also ich habe die Lösung, vielleicht kann mir aber jemand erklären, warum?

Es hängt damit zusammen, wann ich in der Hauptschleife meinen Spieler zeichne und wann meine Map + Hintergrundbild (ist bei mir eine Sub, wird aber natürlich eine Function werden Wink ) gezeichnet wird. Hier ist erst mal die Sub für die Map und darunter die Hauptschleife einmal mit Problem und einmal ohne.
Code: [AUSKLAPPEN]
;____________________________________________
;Level zeichnen

.Drawmap
level(22)=Rand(0,2)


For z%=1 To 22
For i%=1 To 22
If level(i%)=0 Then       
DrawImage desert,levelx(i%)-playerspeed%,mapy%,0
End If
If level(i%)=1 Then
DrawImage desert,levelx(i%)-playerspeed%,mapy%,1
End If
If level(i%)=2 Then
DrawImage desert,levelx(i%)-playerspeed%,mapy%,2
End If
Next
Next


For i%=1 To 2
If background(i%)=1 Then
DrawImage sandmountain,backgroundx(i%)-backgroundspeed%,backgroundy%
End If
If background(i%)=2 Then
DrawImage gray,backgroundx(i%)-backgroundspeed%,backgroundy%
End If
Next

Return


Code: [AUSKLAPPEN]
;_________________________________________
;Hauptspielschleife mit Problem

Repeat
   gravity%=1 ;Schwerkraft ist an
   Gosub Animation ;rufe Animationen auf
   Gosub Controls ;rufe Steuerung auf
   Gosub Gravity ;rufe Schwerkraft auf
   ClsColor 66,70,227 ;fülle Bildschirm mit Himmelblau
   Cls ;Clearscreen
   Gosub Drawclouds ;male Wolken
   Gosub Drawmap;male Map
   DrawImage player,playerx%,playery%,frame% ;male Spieler

   WaitTimer takt ;auf 30 Bilder die Sekunde beschränken
   Flip ;Buffer tauschen
Until KeyHit(1) ;Wiederholen bis ESC

Code: [AUSKLAPPEN]
;_________________________________________
;Hauptspielschleife ohne Problem

Repeat
   gravity%=1 ;Schwerkraft ist an
   Gosub Animation ;rufe Animationen auf
   Gosub Controls ;rufe Steuerung auf
   Gosub Gravity ;rufe Schwerkraft auf
   ClsColor 66,70,227 ;fülle Bildschirm mit Himmelblau
   Cls ;Clearscreen
   Gosub Drawclouds ;male Wolken
   DrawImage player,playerx%,playery%,frame% ;male Spieler
        Gosub Drawmap ;male Map
   
        WaitTimer takt ;auf 30 Bilder die Sekunde beschränken
   Flip ;Buffer tauschen
Until KeyHit(1) ;Wiederholen bis ESC

Midimaster

BeitragDi, Aug 07, 2012 20:52
Antworten mit Zitat
Benutzer-Profile anzeigen
ich glaube ja immer noch an einen vsync fehler...

mach mal bitte zum testen die letzten Zeilen so herum:

BlitzBasic: [AUSKLAPPEN]
   DrawImage player,playerx%,playery%,frame% ;male Spieler
Gosub Drawmap ;male Map
Flip 0 ;Buffer tauschen

WaitTimer takt ;auf 30 Bilder die Sekunde beschränken

Until KeyHit(1) ;Wiederholen bis ESC


ich kenn solche Bildfehler von früher. Da war es auch immer so, dass der Vsync in der Gegend um y=100 zu Bildfehlern geführt hat.

Und teste mal, wie lange dein Grafikaufbau dauert. Also so:

BlitzBasic: [AUSKLAPPEN]
Repeat

Zeit%=MilliSecs()

gravity%=1 ;Schwerkraft ist an
Gosub Animation ;rufe Animationen auf
Gosub Controls ;rufe Steuerung auf
Gosub Gravity ;rufe Schwerkraft auf
ClsColor 66,70,227 ;fülle Bildschirm mit Himmelblau
Cls ;Clearscreen
Gosub Drawclouds ;male Wolken
DrawImage player,playerx%,playery%,frame% ;male Spieler
Gosub Drawmap ;male Map

DebugLog "Zeit A=" + (MilliSecs()-Zeit)

WaitTimer takt ;auf 30 Bilder die Sekunde beschränken
Flip ;Buffer tauschen

DebugLog "Zeit B=" + (MilliSecs()-Zeit)

Until KeyHit(1) ;Wiederholen bis ESC


und schreib mir dann die Werte, die der Debugger ausgibt.
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe
 

funkmaster5000

BeitragMi, Aug 08, 2012 17:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Das wäre dann Folgendes:
Code: [AUSKLAPPEN]
Zeit A=5
Zeit B=34
Zeit A=5
Zeit B=33
Zeit A=6
Zeit B=32
Zeit A=5
Zeit B=33
Zeit A=4
Zeit B=32
Zeit A=14
Zeit B=33
Zeit A=4
Zeit B=23
Zeit A=18
Zeit B=33
Zeit A=19
Zeit B=32
Zeit A=5
Zeit B=32
Zeit A=5
Zeit B=34
Zeit A=5
Zeit B=33
Zeit A=5
Zeit B=32
Zeit A=5
Zeit B=33
Zeit A=5
Zeit B=33
Zeit A=4
Zeit B=33
Zeit A=5
Zeit B=33
Zeit A=5
Zeit B=33
Zeit A=5
Zeit B=33
Zeit A=5
Zeit B=33
Zeit A=4
Zeit B=33
Zeit A=4
Zeit B=32
Zeit A=5

Midimaster

BeitragMi, Aug 08, 2012 23:45
Antworten mit Zitat
Benutzer-Profile anzeigen
ah! das Malen geht also schnell genug.

hier eingie Idde für Tests:

hat es dann was gebracht, die Reihenfolge von von FLIP und WAITTIMER zu vertauschen?


Und noch eine Frage: Muss der Player nicht eigentlich nach der MAP gezeichnet werden?

Experimentiere mal mit der frame%-Variablen herum: Setze sie mal immer unmittelbar vor dem Malen auf 0. Gleiches Problem? Nein? dann auf 1, dann auf 2 usw...
BlitzBasic: [AUSKLAPPEN]
frame=0
DrawImage player,playerx%,playery%,frame% ;male Spieler



Versuch mal beim Malen die Map kurzfristig umm 100pix nach unten zu versetzen:
BlitzMax: [AUSKLAPPEN]
For z%=1 To 22
For i%=1 To 22
If level(i%)=0 Then
DrawImage desert,levelx(i%)-playerspeed%,mapy%+100,0
....

Wo taucht jetzt der Ärger auf
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe
 

funkmaster5000

BeitragDo, Aug 09, 2012 12:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi! Also der Spieler muss nicht zwangsläufig nach der Map gezeichnet werden, da die "Map" ja nur aus einer Reihe Tiles besteht, die horizontal laufen. Also:

Code: [AUSKLAPPEN]
                              P (für Player)                           
[x][x][x][x][x][x][x][x][x][x][x][x][x][x][x] <-Tiles


Demzufolge ist egal, was wann kommt. Wenn ich allerdings das Zeichnen des Hintergrundbildes (das bei mir fast bildschirmfüllend ist) in dieser Sub geschehen lassen will (was ja der Fall ist und was auch Sinn macht, denn es ist auch Teil der Map), dann muss der Spieler natürlich danach gesetzt werden, da der Hintergrund ihn sonst verdeckt. Ich stehe jetzt vor der Wahl zwischen:
- Spieler, dann Bodentiles zeichnen und Hintergrund in einer extra Sub/Function zeichnen lassen (löst mein Problem, aber ich verstehe nicht warum und lerne nicht dazu)
- Das eigentliche Problem lösen (wäre mir natürlich am liebsten!) und alles so lassen wies ist. Ich sehe aber beim besten Willen keinen Fehler in den Subs oder in der Reihenfolge, in der sie aufgerufen werden.

Deine vorgeschlagenen Tests, werde ich heute Abend durchspielen.

BladeRunner

Moderator

BeitragDo, Aug 09, 2012 13:18
Antworten mit Zitat
Benutzer-Profile anzeigen
So, ein letztes mal: Lad dein Dings mal komplett hoch damit alle mit deinen Ressourcen testen können. Glaskugeleien machen keinen Spass.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92
 

funkmaster5000

BeitragDo, Aug 09, 2012 21:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Midimaster hat Folgendes geschrieben:


Versuch mal beim Malen die Map kurzfristig umm 100pix nach unten zu versetzen:
BlitzMax: [AUSKLAPPEN]
For z%=1 To 22
For i%=1 To 22
If level(i%)=0 Then
DrawImage desert,levelx(i%)-playerspeed%,mapy%+100,0
....

Wo taucht jetzt der Ärger auf


Es behebt den Ärger. Sobald ich das ganze um 100 px nach unten verschiebe, klappt alles, funktioniert bis mapy%+32 (ein Tile ist 32x32 px), danach tritt das Problem erneut auf.
Es handelt sich bei dem Spieler wie auch bei den 3 verschiedenen Tiles um AnimImages (damit ich die 3 Tiles nebeneinander packen kann). Eventuell gibt es da einen Zusammenhang.

Wie und wo lade ich den Source Code + Ressourcen hoch?

Xeres

Moderator

BeitragDo, Aug 09, 2012 21:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Du Zipst den Ordner, in dem sich Code und Ressourcen befinden, lädst die Zip hier im Archiv hoch und postest den Link hier.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group