Graphics zonder flikkering.

Geef hier je beste Liberty BASIC tips door. (Hier geen hulp vragen)

Moderators: anthonio, Abcott

Graphics zonder flikkering.

Berichtdoor glpape » zo jun 24, 2012 1:29 pm

Dit kan een voorproefje zijn voor LB5. Carl belooft dat graphics daar helemaal in memory worden gedaan en als je uitgetekend bent kan Windows het bliksems snel, zonder flikkering op het scherm zetten. Sprites werken al zo.

gxGL (GL voor Graphics Library, gx voor graphix denk ik) is van lbjoseph en tekent via API calls naar een Memory Device Context. Als de plaat helemaal af is geef je hem weer via <Call gxRenderTo ...> in een Lbty graphic box. Het werkt prachtig, een demo als bijlage met een foto die sommigen nog zullen kennen. In 32 seconden (op mijn machine) draait het plaatje 360x 1 graad door. Je ziet wat "gefriemel" op de foto omdat er veel fijn detail in zit dat elke 90 msec een klein beetje verspringt. De groene text flikkert totaal niet: die wordt ook 11x/sec gewist en weer op het scherm gezet. Heel anders dan "delsegment" en "redraw".

Als je Google't naar gxGraphicsLibraryHome krijg je alle uitleg van lbjoseph zelf. Je hebt daar ook toegang tot de 46 (!) eerdere versies van de code. lbjoseph spreekt van Commands, lijkt me strikt genomen niet juist. De code bestaat uit Subs (ruim 450 regels code alleen, + REMs) die je dus aanroept met <Call ...> . Het is puur Lbty code.
De API functies die worden gebruikt zijn diverse BLIT functies (BLockImageTransfer) en voor rotatie SetWorldTransform.

Ideaal? Mijn chagrijn blijft dat je beperkt blijft tot wat je ziet van je gbox, scrollbars of niet. Je kunt het niet zichtbare deel alleen gebruiken met de eigen Lbty commando's. Blitting en Getbmp ( nodig voor Lbty's <flush> ) werken alleen met wat zichtbaar is op het scherm.

Vr groet,

George Pape.

NB : Ik krijg een waarschuwing dat het forum mijn bijlage weigert. OK. Wie geinteresseerd is kan me mailen, gl.pape@hccnet.nl .
glpape
 
Berichten: 83
Geregistreerd: za nov 08, 2008 5:32 pm

Re: Graphics zonder flikkering.

Berichtdoor Gordon » zo jun 24, 2012 9:10 pm

hmmm .... ik probeer het ook.

bingo2.zip
bingo zip bestand
(1.33 KiB) 163 keer gedownload



en de bas versie

Code: Selecteer alles
nomainwin
dim c(80),c1(80),p1(26),p2(26),g(26)
open "bingo" for graphics_nsb as #1
#1 "trapclose [1]"
#1 "place 110 40":#1 "\ BINGOKAART"
#1 "place 85 230":#1 "\ gekozen nummer"

''kolom 1
for x= 1 to 15:c(x)= x:next ''maak een array
for x= 1 to 30 ''aantal verwisellingen
1
a=int(rnd(1)*15) + 1:b=int(rnd(1)*15) + 1 ''genereerd twee getallen tussen 1-15
if a=b goto 1 ''twee zelfde getallen werk niet
a=a+0:b=b+0 ''pas het + getal aan bij de array nummers
c(a)=c(a)+c(b):c(b)=c(a)-c(b):c(a)=c(a)-c(b)''swap
next
''plaats gesorteerde gegeven in het venster kolom 1
sort c(),1,5
for x= 1 to 5:y1=x*30+40:#1 "place 90 "; y1 '' 5 plaatsen in venster
z=c(x):z$=str$(z) ''zet getal om naar een string
#1 "\"+z$ ''5 getallen in het venster

''opslag in geheugen g=getal p1=place x p2=place y
z=x:g(z)=c(x):p1(z)=90: p2(z)=y1
next

''kolom 2
for x= 16 to 30:c(x)= x:next
for x= 1 to 30
2
a=int(rnd(1)*15) + 1:b=int(rnd(1)*15) + 1
if a=b goto 2
a=a+15:b=b+15
c(a)=c(a)+c(b):c(b)=c(a)-c(b):c(a)=c(a)-c(b)''swap
next
sort c(),16,20
for x= 16 to 20:y2=(x-15)*30+40:#1 "place 120 "; y2
z=c(x):z$=str$(z):#1 "\"+z$

''opslag in hetgeheugen
z=x-10:g(z)=c(x):p1(z)=120:p2(z)=y2
next

''kolom 3
for x= 31 to 45:c(x)= x:next
for x= 1 to 30
3
a=int(rnd(1)*15) + 1:b=int(rnd(1)*15) + 1
if a=b goto 3
a=a+30:b=b+30
c(a)=c(a)+c(b):c(b)=c(a)-c(b):c(a)=c(a)-c(b)''swap
next
sort c(),31,35
for x= 31 to 35:y3=(x-30)*30+40:#1 "place 150 "; y3
z=c(x):z$=str$(z):#1 "\"+z$

''opslag in het geheugen
z=x-20:g(z)=c(x):p1(z)=150:p2(z)=y3
next

''kolom 4
for x= 46 to 60:c(x)= x:next
for x= 1 to 30
4
a=int(rnd(1)*15) + 1:b=int(rnd(1)*15) + 1
if a=b goto 4
a=a+45:b=b+45
c(a)=c(a)+c(b):c(b)=c(a)-c(b):c(a)=c(a)-c(b)''swap
next
sort c(),46,50
for x= 46 to 50:y4=(x-45)*30+40:#1 "place 180 "; y4
z=c(x):z$=str$(z):#1 "\"+z$

''opslag in het geheugen
z=x-30:g(z)=c(x):p1(z)=180:p2(z)=y4
next

''kolom 5
for x= 61 to 75:c(x)= x:next
for x= 1 to 30
5
a=int(rnd(1)*15) + 1:b=int(rnd(1)*15) + 1
if a=b goto 5
a=a+60:b=b+60
c(a)=c(a)+c(b):c(b)=c(a)-c(b):c(a)=c(a)-c(b)''swap
next
sort c(),61,65
for x= 61 to 65:y5=(x-60)*30+40:#1 "place 210 "; y5
z=c(x):z$=str$(z):#1 "\"+z$

''opslag in het geheugen
z=x-40:g(z)=c(x):p1(z)=210:p2(z)=y5
next

''genereerd een roepnummer
for x= 1 to 75:c1(x)= x:next
for x= 1 to 220
6
a=int(rnd(1)*75) + 1:b=int(rnd(1)*75) + 1
if a=b goto 6
c1(a)=c1(a)+c1(b):c1(b)=c1(a)-c1(b):c1(a)=c1(a)-c1(b)''swap
next

''plaats roep nummer in venster
for x= 1 to 75
  #1 "place 205 230":z=c1(x):z$=str$(z):#1 "\"+z$
  timer 500,[7]:wait:[7] timer 0 ''tijd vertragin
''streept nummer in venster door
for i= 1 to 25
if z=g(i) then
  c=c+1
  #1 "font courier_new 11 bold strikeout"
  #1 "place ";p1(i); "  ";p2(i)
  z$=str$(z):#1 "\"+z$
  timer 1000,[8]:wait:[8] timer 0 ''tijd vertragin
end if

''bingo
#1 "color red": #1 "font courier_new 14 bold"
if c= 25 then
 #1 "place 85 230":#1 "\                "''wist gekozen nummer
 #1 "place 120 260":#1 "\ bingo"
 goto 9
end if
''#1 "color black": #1 "font courier_new 11'' bold"
next i
next x
9
wait
[1]  close #1:end


Deze listing is van Joop (cursist Amstelveen)

Gordon
Avatar gebruiker
Gordon
Site Admin
 
Berichten: 684
Geregistreerd: zo mei 22, 2005 12:50 am

Re: Graphics zonder flikkering.

Berichtdoor Gordon » zo jun 24, 2012 9:12 pm

Oeps George,

Heb je misschien per ongeluk gekozen voor
<Opslaan> in plaats van <Bevestig>
?

Gordon
Avatar gebruiker
Gordon
Site Admin
 
Berichten: 684
Geregistreerd: zo mei 22, 2005 12:50 am

Re: Graphics zonder flikkering.

Berichtdoor glpape » zo jun 24, 2012 11:28 pm

Gordon, hallo,

Heb ik op "opslaan" geklikt. Wie weet, maar ik denk van niet. Ik kreeg een waarschuwing in grote rode letters dat het bijlage quotum vol was, of zoiets. Ik had een .zip map van 423kB.

Vr groet,

George Pape.
glpape
 
Berichten: 83
Geregistreerd: za nov 08, 2008 5:32 pm

Re: Graphics zonder flikkering.

Berichtdoor glpape » wo jun 27, 2012 3:40 pm

Gordon hallo,

Wat bedoelde je met bingo2.bas ? Dat hier in een grafisch venster wordt gewerkt zonder dat het flikkert ? Dat is natuurlijk zo, maar ik dacht aan graphics waarbij het scherm wordt gewist en dan opnieuw wordt ingevuld. Zoals sprites, in Lbty, die in memory worden getekend en dan heel snel, zonder dat je het ziet, op het scherm worden gezet. Voor andere graphics heb je daar "redraw" voor nodig en dat flikkert.

Je kunt natuurlijk altijd een nieuwe lijn, cirel of letter tekenen zonder flikkering. Dat doet bingo2.bas. Je kunt zo ook cijfers vervangen door nieuwe cijfers maar ik zie wel beperkingen die ik toon in de volgende listing :

Code: Selecteer alles
nomainwin
Call SetWdw 200, 100, 800, 500
open "" for graphics as #G
#G "trapclose [qq]"
hG = hwnd(#G)
calldll #user32, "GetDC", hG as ulong, hDCG as ulong

' calldll #gdi32, "SetBkMode", hDCG as ulong, _TRANSPARENT as long, rtn as long

#G "down; color green; font courier_new 96 bold"
#G "place 300 250;\22"

Call Pause 2500
#G "place 300 250;\33"

Call Pause 2500
#G "place 270 250;\888"

Call Pause 2500
#G "place 300 250;\77"

wait  :  [qq]    close #G  :  end


'  * * * * * * * * * * * * * * *  Functions & Subs  * * * * * * * * * * * * * * * * * * * * * *


Sub SetWdw a,b,c,d                          ' sets ULX, etc
UpperLeftX = a
UpperLeftY = b
WindowWidth = c
WindowHeight = d
End Sub

Sub Pause pp                                ' pause in milliseconds
tt = time$("ms") : dd = date$("days")
while  time$("ms") + 3600*24*1000*k  < tt + pp
k = date$("days") - dd
wend
End Sub


= er gebeuren als je nieuwe cijfer kleiner is dan het oude (bv 888 --> 77);
= de backcolor moet hetzelfde zijn als de kleur van je venster; als je geen achtergrond wilt gebruiken gebeurt wat je ziet als je de functie "SetBkMode" in mijn listing ont-REM-t.

Nu nog iets heel anders. In bingo2.bas zag ik deze regels :

Code: Selecteer alles
#1 "place 110 40":#1 "\ BINGOKAART"
#1 "place 85 230":#1 "\ gekozen nummer"


Je kunt grafische commando's achter elkaar zetten, met punt-komma's. Dat kan ook met tekst, maar de backslash moet dan direct volgen op de punt-komma, zonder spatie. Ik zeg dat omdat het niet in de helpfile staat.

Code: Selecteer alles
#1 "down; place 110 40;\ BINGOKAART"             ' Dit werkt.
#1       "place 85 230; \ gekozen nummer"        ' Dit niet.

En na de << #1 ".....;\tekst" >> kunnen geen andere commando's volgen.

Vr groet,

George Pape.
glpape
 
Berichten: 83
Geregistreerd: za nov 08, 2008 5:32 pm


Keer terug naar Tips en informatie

Wie is er online

Gebruikers op dit forum: Geen geregistreerde gebruikers. en 1 gast

cron