 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Devilkevin aka Kerstin

Anmeldungsdatum: 11.11.2004 Beiträge: 2532 Wohnort: nähe Mannheim
|
Verfasst am: 23.07.2005, 16:27 Titel: Grafiken flimmern |
|
|
Hallo, wie verhindere ich das die Grafiken so extrem flimmern ?
Der Code ist:
Code: |
DIM image(307204) AS UBYTE
SCREEN 18
BLOAD "thor.bmp", VARPTR(image(0))
x = 1
y = 1
put(x,y),image
do
cls
if inkey$=CHR$(0)+CHR$(72) then y=y-3
if inkey$=CHR$(0)+CHR$(80) then y=y+3
if inkey$=CHR$(0)+CHR$(75) then x=x-3
if inkey$=CHR$(0)+CHR$(77) then x=x+3
put (x,y), image
loop |
Thor.bmp ist eine 256 Farben Bitmap.
Problem 2: Die Grafik lässt sich nicht steuern !
Die Codes scheinen richtig zusein, aber egal was ich drücke, die Grafik bewegt sich immer nur nach unten. _________________ www.piratenpartei.de |
|
Nach oben |
|
 |
Kai Bareis

Anmeldungsdatum: 10.09.2004 Beiträge: 545 Wohnort: Baden Würtemberg
|
Verfasst am: 23.07.2005, 16:36 Titel: |
|
|
Die Steuerung geht deswegen nicht da anstatt CHR$(0) CHR$(255) stehen muss.
Und wegen dem flimmern eventuell mal in docs/gfxlib.txt schauen _________________ MfG Kai Bareis
Es ist noch kein Meister vom Himmel gefallen! Warum einfach wens auch umständlich geht! |
|
Nach oben |
|
 |
Devilkevin aka Kerstin

Anmeldungsdatum: 11.11.2004 Beiträge: 2532 Wohnort: nähe Mannheim
|
Verfasst am: 23.07.2005, 16:43 Titel: |
|
|
Hi, wen ich 255 anstatt 0 schreibe kann ich dir Grafik nach oben bewegen, die anderen Richtungen gehen aber nicht. _________________ www.piratenpartei.de |
|
Nach oben |
|
 |
Mecki Igel

Anmeldungsdatum: 10.09.2004 Beiträge: 985 Wohnort: Niederbayern
|
|
Nach oben |
|
 |
jb

Anmeldungsdatum: 14.01.2005 Beiträge: 2010
|
Verfasst am: 23.07.2005, 19:29 Titel: |
|
|
Zum Flimmern:
Benutz mal Doublebuffering!
Code: |
screen 18 , , 2
screenset 1, 2
do
' Grafik
screencopy
loop until ???
|
jb |
|
Nach oben |
|
 |
Progger_X Mr. Lagg
Anmeldungsdatum: 24.11.2004 Beiträge: 784 Wohnort: Leipzig
|
Verfasst am: 23.07.2005, 23:02 Titel: |
|
|
An deiner Stelle würd ich einfach SCREENLOCK und SCREENUNLOCK verwenden. SCREENLOCK bevor alle Grafiken ausgegeben werden, SCREENUNLOCK nachdem alle Grafiken ausgegeben wurden.
Das INKEY$ kannste außerhalb dieses Zeugs machen. |
|
Nach oben |
|
 |
Devilkevin aka Kerstin

Anmeldungsdatum: 11.11.2004 Beiträge: 2532 Wohnort: nähe Mannheim
|
Verfasst am: 23.07.2005, 23:16 Titel: |
|
|
Progger_X hat Folgendes geschrieben: | An deiner Stelle würd ich einfach SCREENLOCK und SCREENUNLOCK verwenden. SCREENLOCK bevor alle Grafiken ausgegeben werden, SCREENUNLOCK nachdem alle Grafiken ausgegeben wurden.
Das INKEY$ kannste außerhalb dieses Zeugs machen. |
Es flimmert zwar immer noch, aber das Prog läuft dadurch sehr viel flüsiger !
/Edit: Wen man ein kleines SLEEP 1 einbaut, funktioniert es fast ohne flimmern. _________________ www.piratenpartei.de |
|
Nach oben |
|
 |
d.j.peters Gast
|
Verfasst am: 27.07.2005, 13:23 Titel: |
|
|
jb hat Folgendes geschrieben: | Zum Flimmern:
Benutz mal Doublebuffering!
Code: | screen 18 , , 2
screenset 1, 2
do
' Grafik
screencopy
loop until ???
| jb |
hi jb
Du weist doch Computer sind doof und fangen immer bei 0 an zu zählen
Grüße
Joshy |
|
Nach oben |
|
 |
jb

Anmeldungsdatum: 14.01.2005 Beiträge: 2010
|
Verfasst am: 27.07.2005, 13:43 Titel: |
|
|
Mit screenset 1, 2 klappt's aber auch.
jb |
|
Nach oben |
|
 |
d.j.peters Gast
|
Verfasst am: 27.07.2005, 16:09 Titel: |
|
|
jb hat Folgendes geschrieben: | Mit screenset 1, 2 klappt's aber auch.
jb |
Hätte ich nicht geglaubt wenn ich es nicht ausprobiert hätte.
Grüsse
Joshy |
|
Nach oben |
|
 |
Michael Frey

Anmeldungsdatum: 18.12.2004 Beiträge: 2577 Wohnort: Schweiz
|
Verfasst am: 27.07.2005, 17:21 Titel: Wegen Flimmern |
|
|
Dafür gibt es in Freebasic 0.14 einen eigenen behfehl namens
SCREENSYNC
Kleiner Typ: lest zwischen durch die Datei changelog.txt, da gibts echt coole, meist unbekannte Befehle wie diesen. |
|
Nach oben |
|
 |
Michael712 aka anfänger, programmierer
Anmeldungsdatum: 26.03.2005 Beiträge: 1593
|
Verfasst am: 29.07.2005, 17:51 Titel: |
|
|
Hallo.
Bei dir ist auch ein Problem, welches ich auch mal hatte. Mit put x,y,bild wird das bild mit xor geputtet. Wenn das dann zweimal geschreben wird dann ist das wieder weg. Ich würde ohne screenset/screencopy arbeiten und einfach immer: put x,y,bild,pset schreiben. Dann wird jeder punkt einzeln gesetzt.
mfg
Michael
P.S.: Bin seit 5min ausm urlaub zurück. _________________
Code: | #include "signatur.bi" |
|
|
Nach oben |
|
 |
Gefrierbrand

Anmeldungsdatum: 05.12.2005 Beiträge: 12 Wohnort: Estenfeld
|
Verfasst am: 05.12.2005, 21:15 Titel: |
|
|
Zitat: | Code:
Code: | DIM image(307204) AS UBYTE
SCREEN 18
BLOAD "thor.bmp", VARPTR(image(0))
x = 1
y = 1
put(x,y),image
do
cls
if inkey$=CHR$(0)+CHR$(72) then y=y-3
if inkey$=CHR$(0)+CHR$(80) then y=y+3
if inkey$=CHR$(0)+CHR$(75) then x=x-3
if inkey$=CHR$(0)+CHR$(77) then x=x+3
put (x,y), image
loop |
|
Boar nach so einem einfachen Verfahren Bitmaps einzufügen suche ich schon lange, kann mir mal wer den Type UBYTE geben, damit ich das Teil testen kann?
Edit: Oops sehe gerade das da ja das FreeBasic Forum ist und nicht Qb, schade... _________________
 |
|
Nach oben |
|
 |
psygate
Anmeldungsdatum: 05.04.2005 Beiträge: 304 Wohnort: Wien und der Computer
|
Verfasst am: 05.12.2005, 22:22 Titel: |
|
|
Code: |
DIM image(307204) AS UBYTE
SCREEN 18
BLOAD "thor.bmp", VARPTR(image(0))
x = 1
y = 1
put(x,y),image
do
screenlock
cls
if inkey$=CHR$(0)+CHR$(72) then y=y-3
if inkey$=CHR$(0)+CHR$(80) then y=y+3
if inkey$=CHR$(0)+CHR$(75) then x=x-3
if inkey$=CHR$(0)+CHR$(77) then x=x+3
put (x,y), image
screenunlock
loop | [/quote] |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 05.12.2005, 22:27 Titel: |
|
|
seeehr interessanter beitra, psygate
also ich benutze screensync schon von anfang an, ich finde den befehl nciht "unbekannt"   _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
Dusky_Joe

Anmeldungsdatum: 07.01.2005 Beiträge: 1007 Wohnort: Regensburg/Oberpfalz
|
Verfasst am: 10.12.2005, 13:27 Titel: |
|
|
Ein ganz ähnlicher Code ist in der Referenz unter
MULTIKEY
zu finden.
Hier wird mit Double-Buffering gearbeitet, also mit mehreren Bildschirmseiten.
Das flimmern wird bei dir vor allem durch den CLS-Befehl verursacht. Den ganzen Bildschirm zu löschen, wenn nur ein kleiner Teil gelöscht werden müsste, ist ziemlich aufwendig, und sollte vermieden werden. Stattdessen kannst du einen zweiten Bildpuffer erstellen, und in ihm den Hintergrund von thor speichern.
Weil ich den Befehl ImageCreate schöner finde, als die Verwendung eines Arrays, siehe vor diesem beispiel auch:
IMAGECREATE
Code: | ' Zwei Puffer bereitstellen
Dim As Any Ptr thor, thorBgr
' Bildschirm initiieren
Screen 18, 8, 2
ScreenSet 0, 1
' Speicherbereich für Bilder reservieren
thor = ImageCreate(thorBreite, thorHöhe)
thorBgr = ImageCreate(thorBreite, thorHöhe)
' Bild laden
Bload "thor.bmp", thor
' Hintergrundbild einlesen, damit Thor grafisch verschwinden kann
Get (x, y)-(x + thorBreite, y + thorHöhe), thorBgr
Do
' Altes Hintergrundbild anzeigen => Thors Position grafisch löschen
Put (x, y), thorBgr
' Überprüfe die Pfeiltasten und aktualisiere die Koordinaten
' x, y entsprechend.
IF MULTIKEY(&h4B) AND x > 0 THEN x -= 1
IF MULTIKEY(&h4D) AND x < 639 THEN x += 1
IF MULTIKEY(&h48) AND y > 0 THEN y -= 1
IF MULTIKEY(&h50) AND y < 479 THEN y += 1
' Neues Hintergrundbild lesen
Get (x, y)-(x + ThorBreite, y + ThorHöhe), ThorBgr
' Thor Anzeigen
Put (x, y), Thor
' Und die Seite kopieren
ScreenCopy
Loop Until Inkey$ = CHR$(27) ' Breche bei ESC ab.
' Nicht vergessen: Speicher für Bilder wieder frei geben!
ImageDestroy Thor
ImageDestroy ThorBgr |
Ach ja, anmerkung:
Wenn du MULTIKEY benutzt, wird dein Tastaturpuffer (INKEY$) nicht geleert, er läuft also irgendwann voll. Deswegen musst du zumindest einmal pro Schleifendurchlauf INKEY$ verwenden, hier z.B. am Ende der Schleife, um zu prüfen, ob ESC gedrückt wird.
Have a nice day
Ciao _________________ fully biological degradable
Once, the big wave arrives, you've got two ways, you can go:
Either, you ride it, or you don't do.
But, if you don't ride, you'll never know wether you'd have gone wet. |
|
Nach oben |
|
 |
Eastler_dart

Anmeldungsdatum: 25.09.2005 Beiträge: 177 Wohnort: Baden-Würtemberg + Sachsen
|
Verfasst am: 10.12.2005, 21:36 Titel: |
|
|
Hallo Devil,
da ich genau weiß, wie das ist, wenn man auf dem Schlauch steht, schreib ich von deinem Programm mal nur das wesentliche, dann siehst du sofort, warum es flimmert:
Code: | DO
CLS
PUT (x,y), image
LOOP
|
Na? siehst du es? Die Schleife wird ja ständig durchlaufen, ganz egal, ob ne Taste gedrückt wurde oder nicht. und in der Schleife steht ja, Bildschirm löschen, Bild anzeigen, löschen, anzeigen, löschen....
Dein Programm macht genau das, was du geschrieben hattest. (ja ja ich kenn das von mir nur zuuuu gut)
Wenn du es ganz simpel zusammenschnippeln willst:
Code: | DO
IF INKEY$=CHR$(0)+CHR$(72) THEN y=y-3 : CLS : PUT(x,y), image
IF INKEY$=CHR$(0)+CHR$(80) THEN y=y+3 : CLS : PUT(x,y), image
IF INKEY$=CHR$(0)+CHR$(75) THEN x=x-3 : CLS : PUT(x,y), image
IF INKEY$=CHR$(0)+CHR$(77) THEN x=x+3 : CLS : PUT(x,y), image
LOOP |
Dann wird das bild nur gelöscht/gezeichnet, wenn auch eine Cursortaste gedrückt war. Aber beim versetzen wirds immer noch kurz flimmern, da ja einmal CLS und dann das Bild angezeigt wird. Hier solltest du mittels SCREENLOCK/SCREENUNLOCK auch dieses kurze Flimmern verhindern. Das würde aber die IF-Zeilen sprengen:
Code: | IF INKEY$=CHR$(0)+CHR$(75) THEN x=x-3 : SCREENLOCK: CLS : PUT(x,y), image : SCREENUNLOCK
|
Oder für jede Taste das IF in zeilen aufteilen:
Code: |
IF INKEY$=CHR$(0)+CHR$(75) THEN
x=x-3
SCREENLOCK
CLS
PUT(x,y), image
SCREENUNLOCK
END IF
|
Zur Übersichtlichkeit hab ich dir kurzerhand als Beispiel die Anzeige in ne SUB ausgelagert. Dazu ist zu beachten, die Variable image muß nun SHARED gedimmt werden, damit sie in der Sub auch zur Verfügung steht.
Also folgender Vorschlag:
Code: |
DECLARE SUB BildAnzeigen(Bildx%,Bildy%)
DIM SHARED image(307204) AS UBYTE
SCREEN 18
BLOAD "thor.bmp", VARPTR(image(0))
x% = 1
y %= 1
'Erst mal das Bild anzeigen, daß es zu sehen ist
CALL BildAnzeigen(x%,y%)
'-----Hauptmenu
DO
in$=INKEY$ :'Tasteneingabe in ne Variable, dann gehts mit SelectCase
SELECT CASE in$
CASE CHR$(255)+CHR$(72)
'Cursor nach oben wurde gedrueckt
Y%=Y%-3
CALL BildAnzeigen(x%,y%)
CASE CHR$(255)+CHR$(80)
'Cursor nach unten wurde gedrueckt
Y%=Y%+3
CALL BildAnzeigen(x%,y%)
CASE CHR$(255)+CHR$(75)
'Cursor nach links wurde gedrueckt
X%=X%-3
CALL BildAnzeigen(x%,y%)
CASE CHR$(255)+CHR$(77) THEN
'Cursor nach rechts wurde gedrueckt
X%=X%+3
CALL BildAnzeigen(x%,y%)
'hier noch mehr CASE ?
'für Minus-Taste = Bild weg,
'Plus-Taste Bild wieder da etc
'läßt sich in diesem Schema sehr einfach nachtragen
END SELECT
LOOP UNTIL in$=CHR$(27) :'Solange Schleife, bis Escape gedrückt wird
SUB BildAnzeigen(Bildx%,Bildy%)
SCREENLOCK
CLS
put (Bildx%,Bildy%), image
SCREENUNLOCK
END SUB |
Hoffe diese Infos helfen dir
Eastler _________________ Kaum macht mans richtig, schon geht's |
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|