Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Grafiken flimmern

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Devilkevin
aka Kerstin


Anmeldungsdatum: 11.11.2004
Beiträge: 2532
Wohnort: nähe Mannheim

BeitragVerfasst am: 23.07.2005, 16:27    Titel: Grafiken flimmern Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Kai Bareis



Anmeldungsdatum: 10.09.2004
Beiträge: 545
Wohnort: Baden Würtemberg

BeitragVerfasst am: 23.07.2005, 16:36    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Devilkevin
aka Kerstin


Anmeldungsdatum: 11.11.2004
Beiträge: 2532
Wohnort: nähe Mannheim

BeitragVerfasst am: 23.07.2005, 16:43    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Mecki
Igel


Anmeldungsdatum: 10.09.2004
Beiträge: 985
Wohnort: Niederbayern

BeitragVerfasst am: 23.07.2005, 17:02    Titel: Antworten mit Zitat

Hi dk,
..das liegt daran, dass der Tastenpuffer durch die erste If-Abfrage gelerrt wird und somit die folgenden nicht mehr greifen können. Abhilfe schafft hier das einmalige Umtaufen in eine andere Variable:
Code:
K$=inkey$
if K$=bla
if K$=blub
if K$=möp
Grüßle,
Mecki
_________________
» Yodl.de: So sucht man gestern. verwundert
» Geld verdienen im Netz + ICQ.
» Firefox!
» 100€ zu gewinnen
» FreeBASIC.de
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen AIM-Name Yahoo Messenger MSN Messenger
jb



Anmeldungsdatum: 14.01.2005
Beiträge: 2010

BeitragVerfasst am: 23.07.2005, 19:29    Titel: Antworten mit Zitat

Zum Flimmern:

Benutz mal Doublebuffering!
Code:

screen 18 , , 2

screenset 1, 2

do

 ' Grafik

 screencopy

loop until ???


jb
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Progger_X
Mr. Lagg


Anmeldungsdatum: 24.11.2004
Beiträge: 784
Wohnort: Leipzig

BeitragVerfasst am: 23.07.2005, 23:02    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Devilkevin
aka Kerstin


Anmeldungsdatum: 11.11.2004
Beiträge: 2532
Wohnort: nähe Mannheim

BeitragVerfasst am: 23.07.2005, 23:16    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
d.j.peters
Gast





BeitragVerfasst am: 27.07.2005, 13:23    Titel: Antworten mit Zitat

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 zwinkern
Code:
ScreenSet 0,1


Grüße
Joshy
Nach oben
jb



Anmeldungsdatum: 14.01.2005
Beiträge: 2010

BeitragVerfasst am: 27.07.2005, 13:43    Titel: Antworten mit Zitat

Mit screenset 1, 2 klappt's aber auch. zwinkern

jb
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
d.j.peters
Gast





BeitragVerfasst am: 27.07.2005, 16:09    Titel: Antworten mit Zitat

jb hat Folgendes geschrieben:
Mit screenset 1, 2 klappt's aber auch. zwinkern

jb

Hätte ich nicht geglaubt wenn ich es nicht ausprobiert hätte. mit den Augen rollen

Grüsse
Joshy
Nach oben
Michael Frey



Anmeldungsdatum: 18.12.2004
Beiträge: 2577
Wohnort: Schweiz

BeitragVerfasst am: 27.07.2005, 17:21    Titel: Wegen Flimmern Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Michael712
aka anfänger, programmierer


Anmeldungsdatum: 26.03.2005
Beiträge: 1593

BeitragVerfasst am: 29.07.2005, 17:51    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Gefrierbrand



Anmeldungsdatum: 05.12.2005
Beiträge: 12
Wohnort: Estenfeld

BeitragVerfasst am: 05.12.2005, 21:15    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen AIM-Name MSN Messenger
psygate



Anmeldungsdatum: 05.04.2005
Beiträge: 304
Wohnort: Wien und der Computer

BeitragVerfasst am: 05.12.2005, 22:22    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 05.12.2005, 22:27    Titel: Antworten mit Zitat

seeehr interessanter beitra, psygate grinsen

also ich benutze screensync schon von anfang an, ich finde den befehl nciht "unbekannt" grinsengrinsen
_________________
» Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Dusky_Joe



Anmeldungsdatum: 07.01.2005
Beiträge: 1007
Wohnort: Regensburg/Oberpfalz

BeitragVerfasst am: 10.12.2005, 13:27    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Eastler_dart



Anmeldungsdatum: 25.09.2005
Beiträge: 177
Wohnort: Baden-Würtemberg + Sachsen

BeitragVerfasst am: 10.12.2005, 21:36    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen Yahoo Messenger
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
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.

 Impressum :: Datenschutz