Flimmern am oberen Bildschirmrand?
Übersicht

funkmaster5000Betreff: Flimmern am oberen Bildschirmrand? |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 und B) Benutze um Himmels willen kein GoSub oder (schlimmer) GoTo. Benutze function ![]() |
||
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
funkmaster5000 |
![]() Antworten mit 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!
Das ist mein erstes größeres Projekt (eigentlich...das erste ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
[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 ![]() |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wenn du Funktionen verwendest, musst du zwischen Local![]() ![]() ![]() 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. ![]() |
||
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
funkmaster5000 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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. | ||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
funkmaster5000 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 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 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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 Versuch mal beim Malen die Map kurzfristig umm 100pix nach unten zu versetzen: BlitzMax: [AUSKLAPPEN] For z%=1 To 22 Wo taucht jetzt der Ärger auf |
||
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe |
funkmaster5000 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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. |
||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Midimaster hat Folgendes geschrieben: Versuch mal beim Malen die Map kurzfristig umm 100pix nach unten zu versetzen: BlitzMax: [AUSKLAPPEN] For z%=1 To 22 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? |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group