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:

Animation mit PUT flimmerfrei?

 
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
zipmar



Anmeldungsdatum: 06.12.2013
Beiträge: 12
Wohnort: Bremen

BeitragVerfasst am: 27.03.2014, 13:43    Titel: Animation mit PUT flimmerfrei? Antworten mit Zitat

Hi!
ich habe mir mal den code zum ->Animation mit PUT<- näher angesehen und compiliert, dabei ist mir aufgefallen, das die objekte die dort animiert sind, flackern.

meine frage dazu, kann man das abschalten, wenn ja wie?

ich muss dazu sagen, das ich alte intros nachprogrammieren möchte,
und mich das thema natürlich brennend interessiert
lachen

VG
zipmar
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Haubitze



Anmeldungsdatum: 14.10.2009
Beiträge: 132

BeitragVerfasst am: 27.03.2014, 14:37    Titel: Antworten mit Zitat

Hi Zipmar,

ich wuerde das so machen

Code:

...
do
screenlock
line (0,0)-(scrw,scrh),0,BF

put...
put...

screenunlock
loop
...


salute
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
zipmar



Anmeldungsdatum: 06.12.2013
Beiträge: 12
Wohnort: Bremen

BeitragVerfasst am: 27.03.2014, 15:17    Titel: Antworten mit Zitat

hi!
meintest du es so?

Code:

DO

ScreenLock
    x1 = 320 + r1 * SIN(phi1)
    y1 = 240 + 0.6 * r1 * COS(phi1)
    PUT(x1 - 15, y1 - 15), Buffer1, XOR

    x2 = 320 + r2 * SIN(phi2)
    y2 = 240 + 0.7 * r2 * COS(phi2)
    PUT(x2 - 20, y2 - 20), Buffer2, XOR

    x3 = 320 + r3 * SIN(phi3)
    y3 = 240 + 0.8 * r3 * COS(phi3)
    PUT(x3 - 25, y3 - 17), Buffer3, XOR

    SLEEP 5
    PUT(x1 - 15, y1 - 15), Buffer1, XOR
    PUT(x2 - 20, y2 - 20), Buffer2, XOR
    PUT(x3 - 25, y3 - 17), Buffer3, XOR

    phi1 = phi1 + dphi1
    phi2 = phi2 + dphi2
    phi3 = phi3 + dphi3

ScreenUnlock

LOOP WHILE INKEY = ""


funktioniert so leider nicht! da habe ich gar keine animation mehr!!

vielleicht noch eine idee?

vg
zipmar
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
ThePuppetMaster



Anmeldungsdatum: 18.02.2007
Beiträge: 1839
Wohnort: [JN58JR]

BeitragVerfasst am: 27.03.2014, 15:20    Titel: Antworten mit Zitat

also .. "sleep" sollte man keinesfalls in ein screenlock / screenunlock packen.

wenn, dann so in etwas

Code:

DO

ScreenLock
    x1 = 320 + r1 * SIN(phi1)
    y1 = 240 + 0.6 * r1 * COS(phi1)
    PUT(x1 - 15, y1 - 15), Buffer1, XOR

    x2 = 320 + r2 * SIN(phi2)
    y2 = 240 + 0.7 * r2 * COS(phi2)
    PUT(x2 - 20, y2 - 20), Buffer2, XOR

    x3 = 320 + r3 * SIN(phi3)
    y3 = 240 + 0.8 * r3 * COS(phi3)
    PUT(x3 - 25, y3 - 17), Buffer3, XOR

    PUT(x1 - 15, y1 - 15), Buffer1, XOR
    PUT(x2 - 20, y2 - 20), Buffer2, XOR
    PUT(x3 - 25, y3 - 17), Buffer3, XOR

    phi1 = phi1 + dphi1
    phi2 = phi2 + dphi2
    phi3 = phi3 + dphi3

ScreenUnlock
    SLEEP 5

LOOP WHILE INKEY = ""


ein seep in einem gelocktem screen könnte sogar dazu führen, das des app einfriert.


MfG
TPM
_________________
[ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
MOD
Fleißiger Referenzredakteur


Anmeldungsdatum: 10.09.2007
Beiträge: 1003

BeitragVerfasst am: 27.03.2014, 15:25    Titel: Antworten mit Zitat

Ich würde es ja so machen:
Code:
Do
    'Speicherinhalte (Satelliten) in Bild einfuegen:
    x1 = 320 + r1 * Sin(phi1)
    y1 = 240 + 0.6 * r1 * Cos(phi1)
   x2 = 320 + r2 * Sin(phi2)
    y2 = 240 + 0.7 * r2 * Cos(phi2)
   x3 = 320 + r3 * Sin(phi3)
    y3 = 240 + 0.8 * r3 * Cos(phi3)
   
   ScreenLock
    Put(x1 - 15, y1 - 15), Buffer1, Xor
    Put(x2 - 20, y2 - 20), Buffer2, Xor
    Put(x3 - 25, y3 - 17), Buffer3, Xor
   ScreenUnLock
   
   Sleep 5
   
    'Satelliten durch nochmaliges Einfuegen des Speicherinhaltes loeschen:
   ScreenLock
    Put(x1 - 15, y1 - 15), Buffer1, Xor
    Put(x2 - 20, y2 - 20), Buffer2, Xor
    Put(x3 - 25, y3 - 17), Buffer3, Xor
   ScreenUnLock
   
    phi1 = phi1 + dphi1
    phi2 = phi2 + dphi2
    phi3 = phi3 + dphi3
Loop While InKey = ""
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
zipmar



Anmeldungsdatum: 06.12.2013
Beiträge: 12
Wohnort: Bremen

BeitragVerfasst am: 27.03.2014, 15:38    Titel: Antworten mit Zitat

hi!

die lösung von MOD war schon besser!! jedoch habe ich immer noch flimmern! zwar jetzt nicht mehr so oft, aber es ist da.

Code:

#include "fbgfx.bi"
Using FB

DIM AS ANY PTR Buffer1, Buffer2, Buffer3
DIM AS SINGLE x, y, pi, dphi1, dphi2, dphi3, phi1, phi2, phi3, r1, r2, r3, x1, _
              y1, x2, y2, x3, y3
DIM AS INTEGER i

SCREEN 12

'Satelliten speichern:

'Roter Satellit:
Buffer1 = IMAGECREATE(32, 32)
CIRCLE Buffer1, (16, 16), 15, 4,,,,F

'Blauer Satellit:
Buffer2 = IMAGECREATE(42, 42)
CIRCLE Buffer2, (21, 21), 20, 9,,,,F

'Gruener Satellit:
Buffer3 = IMAGECREATE(36, 36)
CIRCLE Buffer3, (18, 18), 17, 2,,,,F

'Bild aufbauen:

LOCATE 29, 30
PRINT "Ende: Beliebige Taste"

'Sternenhimmel zeichnen:
RANDOMIZE TIMER
FOR i = 0 TO 1000
    x = 640 * RND(1)
    y = 480 * RND(1)
    PSET (x, y)
NEXT i

'Saturn-Himmelskoerper zeichnen (gelb):
CIRCLE (320, 240), 75, 14,,,,F

'Saturn-Ringe zeichnen (braun):
pi = 3.141593
FOR i = 0 TO 10 STEP 2
  CIRCLE (320, 240), 150 + 3 * i, 6, (0.66 - .003 * i) * pi, (0.34 + .003 * i) * pi, .2
NEXT i

'Parameter fuer Satellitenbahnen:

dphi1 = 2 * pi / 500
dphi2 = .7 * dphi1
dphi3 = .3 * dphi1
r1 = 195
r2 = 210
r3 = 230
phi1 = 0
phi2 = 2 * pi / 3
phi3 = 4 * pi / 3

Do
    'Speicherinhalte (Satelliten) in Bild einfuegen:
    x1 = 320 + r1 * Sin(phi1)
    y1 = 240 + 0.6 * r1 * Cos(phi1)
   x2 = 320 + r2 * Sin(phi2)
    y2 = 240 + 0.7 * r2 * Cos(phi2)
   x3 = 320 + r3 * Sin(phi3)
    y3 = 240 + 0.8 * r3 * Cos(phi3)
   
   ScreenLock
    Put(x1 - 15, y1 - 15), Buffer1, Xor
    Put(x2 - 20, y2 - 20), Buffer2, Xor
    Put(x3 - 25, y3 - 17), Buffer3, Xor
   ScreenUnLock
   
   Sleep 5
   
    'Satelliten durch nochmaliges Einfuegen des Speicherinhaltes loeschen:
   ScreenLock
    Put(x1 - 15, y1 - 15), Buffer1, Xor
    Put(x2 - 20, y2 - 20), Buffer2, Xor
    Put(x3 - 25, y3 - 17), Buffer3, Xor
   ScreenUnLock
   
    phi1 = phi1 + dphi1
    phi2 = phi2 + dphi2
    phi3 = phi3 + dphi3
   
Loop While InKey = ""

IMAGEDESTROY Buffer1
IMAGEDESTROY Buffer2
IMAGEDESTROY Buffer3



nochmal der ganze source (inkl. MOD's lösung)

hilft das vielleicht weiter??

vg
zipmar
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
ThePuppetMaster



Anmeldungsdatum: 18.02.2007
Beiträge: 1839
Wohnort: [JN58JR]

BeitragVerfasst am: 27.03.2014, 15:46    Titel: Antworten mit Zitat

Um dir das mal vor augen zu führen:

dein computer aktualisiert das bild auf dem monitor zyklisch. Das bedeutet, das man in den aktualisierungspausen zeichnen sollte, oder dem computer mitteilen, das er, wärend du zeichnest, das bild nicht neu aufbauen soll.

Wenn man dies nicht macht, dann kann es passieren, das der computer ein "halbfertig zusammengesetztes bild" von dir anzeigt.

da der computer nicht weis, wann es fertrig is, und er sich prinzipiel an sein timing hällt, kann es passieren, das man mehr, oder mal weniger fertig ist, und er das einfach anzeigt.

dadurch entsteht das "flimmer".

was du nun also machen musst, ist dem system zu sagen, das du derzeit zeichnest, bzw. das er keine aktualisierung vornehmen soll, bis du fertig bist.

das kannst du mithilfe eines "screenlock()" und "screenUnlock()" machen.

ASobald das screenlock aufgerufen wurde wartet das system mit der aktualisierung solange, bis es "unlockt" wird.

Du solltest also alles, was das zeichnen betrifft in ein lock/unlock packen, oder ein grosses lock/unlock machen, in dem alle zeichenoperationen zusammen, und direkt aufeinanderfolgend geschehen.

wenn man mehr als nur ein put nutzt, udn jedes put in ein seperates lock/unlock packt, dann kann es dennoch flimmern.

Code:

screenlock() 'mit bildaktualisierung warten bis unlock
pset (1, 1), &HFFFFFFFF 'etwas zeichnen
screenunlock() 'entsperren.
'jetzt kann das system das bild aktualisierungen
screenlock() 'problem! hier wird noch was hinzu gezeichnet. das bild könnte aber bereits aktualisierut worden sein .. das führt zum flimmern. Auch wenn nochmal gelockt wird.
pset (3, 3), &HFFFFFFFF
screenunlock()


besser ist:
Code:

screenlock() 'mit bildaktualisierung warten bis unlock
pset (1, 1), &HFFFFFFFF 'etwas zeichnen
pset (3, 3), &HFFFFFFFF
screenunlock() 'entsperren
'bild wird aktualisiert.

beim letzten code wird alles, was gezeichent wird, in einem zug gemacht. dadurch kommt es nicht mehr zum flimmern.

damti soltlest das problem jetzt alleine lösen können zwinkern


EDIT:
Um dir mal das probelm direkt vor augen zu führen, kannst du einmal nach jedem ScrenUnlock() in deinem code direkt danach ein "sleep 1000, 1" einfügen. dann siehst du im 1 sekundenabstand, was ich genau meine.


MfG
TPM
_________________
[ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
zipmar



Anmeldungsdatum: 06.12.2013
Beiträge: 12
Wohnort: Bremen

BeitragVerfasst am: 27.03.2014, 16:14    Titel: Antworten mit Zitat

hey ThePuppetMaster!

grinsen
ich danke dir für's augen öffnen!! ich hätte auch alleine drauf kommen können, wenn ich mir mal screenlock nachgeschlagen hätte mit dem Kopf durch die Mauer wollen

auf jedenfall lüpt es!! thx!

ich habe seit meiner amiga zeit nicht mehr im grafischen programmiert missbilligen und da war es in asm

ich dachte, mal eben eine animation zu erstellen ...tz muss doch wohl mehr lesen happy

danke für eure zeit!!

vg
zipmar
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
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