 |
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 |
zipmar
Anmeldungsdatum: 06.12.2013 Beiträge: 12 Wohnort: Bremen
|
Verfasst am: 27.03.2014, 13:43 Titel: Animation mit PUT flimmerfrei? |
|
|
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
VG
zipmar |
|
Nach oben |
|
 |
Haubitze
Anmeldungsdatum: 14.10.2009 Beiträge: 132
|
Verfasst am: 27.03.2014, 14:37 Titel: |
|
|
Hi Zipmar,
ich wuerde das so machen
Code: |
...
do
screenlock
line (0,0)-(scrw,scrh),0,BF
put...
put...
screenunlock
loop
...
|
salute |
|
Nach oben |
|
 |
zipmar
Anmeldungsdatum: 06.12.2013 Beiträge: 12 Wohnort: Bremen
|
Verfasst am: 27.03.2014, 15:17 Titel: |
|
|
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 |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
Verfasst am: 27.03.2014, 15:20 Titel: |
|
|
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 |
|
 |
MOD Fleißiger Referenzredakteur

Anmeldungsdatum: 10.09.2007 Beiträge: 1003
|
Verfasst am: 27.03.2014, 15:25 Titel: |
|
|
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 |
|
 |
zipmar
Anmeldungsdatum: 06.12.2013 Beiträge: 12 Wohnort: Bremen
|
Verfasst am: 27.03.2014, 15:38 Titel: |
|
|
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 |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
Verfasst am: 27.03.2014, 15:46 Titel: |
|
|
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
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 |
|
 |
zipmar
Anmeldungsdatum: 06.12.2013 Beiträge: 12 Wohnort: Bremen
|
Verfasst am: 27.03.2014, 16:14 Titel: |
|
|
hey ThePuppetMaster!
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
auf jedenfall lüpt es!! thx!
ich habe seit meiner amiga zeit nicht mehr im grafischen programmiert und da war es in asm
ich dachte, mal eben eine animation zu erstellen ...tz muss doch wohl mehr lesen
danke für eure zeit!!
vg
zipmar |
|
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.
|
|