Newsgroup: it.comp.lang.visual-basic
Titolo: Movimento fluido pallina biliardo

Devo far scorrere una palla da biliardo (una bitmap con opportuna
ombreggiatura) sopra il tabolo di un biliardo (un'altra bitmap con disegni
dei piolini).
Sto usando il metodo del BitBlt disegnando in And allo sfondo la maschera
dellla pallina e poi disegnando in SrcPaint la pallina stessa.
Il funzionamento e' molto fluido e ad alta velocita' pero' l'effetto visivo
e' molto brutto, si vedono delle righe sulla pallina mentre questa scorre
sul tavolo.
Come ottenere un risultato estetico migliore?
Ciao e grazie
RobertoA

Sinceramente per questo tipo di cose ti sconsiglio VB...
Prova qualche tutorial su VC++ e DX o OpenGL...
-- 
Quando noi ignoranti eravamo di più,
tutto era più bello...
(A. Celentano)

 Come ottenere un risultato estetico migliore?
Si dovrebbe fare con una tecnica vecchia ma efficace di cui ora mi sfugge il
nome
il trucco e avere due palline, una in primo piano e l'altra sotto
si sposta prima quella nascosta poi si fa sparire quella in primo piano
In realta ho paura che anche con questo accorgimento l'abbinamento VB e
BitBlt
mandino tutto a monte
L'ideale credo sia l'utilizzo di directdraw che fa parte delle librerie
directX
che peraltro mi risulta offrano la tecnica descritta in modo trasparente per
l'utente
Non sono in grado di fornirti maggiori dettagli ma spero di averti dato
qualche coordinata nella giusta direzione
--
Mauro Cerreto
www.cerretosoft.it

RobertoA wrote:
quando esisteva Win3.11 for workgroups, usavo il trucco che ti 
dirò, ma tieni presente che qui potrebbe non avere alcuna 
efficacia con le versioni moderne.
Intanto creati due distinte (identiche come dimensioni) bitmaps 
invisibili, nel senso che stanno solo in ram normale e non in 
quella video, e un contenitore grafico la cui proprietà 
autoredraw sia FALSE (non ti serve certo una terza bitmap in 
ram), che rende più rapido il redraw diretto.
Un metodo veloce se non vuoi allocare ram e chiamare API per 
costruire le bitmaps, è usare due picture boxes INVISIBILI 
(hidden) ma con autoredraw = true, le sorgenti, più una terza 
PictureBox o anche Image, con autoredraw = false (la 
destinazione video).
Ora devi ragionare per istanti, come una sequenza cronologica. 
Ogni istante ne ha uno precedente ed uno successivo.
Il tuo output grafico "manuale" (line, circle, pset, ellipse, 
floodfill, etc etc etc) deve sempre andare in memoria di 
sistema, alternativamente ad una delle due bitmap invisibili, o 
meglio a quella che non è correntemente copiata nella bitmap a 
schermo del contenitore visibile, poi, non appena hai finito di 
disegnarla con i metodi grafici che preferisci (sia le API che 
anche metodi di VB .... beh, non ricordo se accettano handle di 
tipo bitmap in verità, cmq diciamo con le api di GDI), la sposti 
in modo veloce da ram normale a ram video con BitBLT, indicando 
il controllo Image visibile come destinazione.
Se non sbaglio esiste anche un qualche metodo ancora più rapido, 
come lo scambiare gli handle, che però non ricordo .... in dos, 
quando si lavorava in modo reale, il bios si occupava in modo 
trasparente di mappare una parte della ram su quella della 
scheda grafica, in quel caso bastava selezionare 
alternativamente l'una o l'altra pagina dei frame video per 
swappare ciò che veniva visualizzato. Suppongo che schede video 
come quelle attuali, con anche 256 MB di VRAM, possano certo 
permettersi il lusso di avere molte pagine per questo tipo di 
buffering (che assomiglia un po' a ciclare cose sovrapposte 
giocando di zorder) .... ma suppongo che non si possa più 
prendere possesso dell'hardware in questa maniera bruta, quindi 
bisogna delegare il S.O.
Cmq anche con BitBLT, se usi il flag di copia schietta, non 
dovresti avere molto flickering.
Certo, un po' è inevitabile a meno di non usare trucchi (che non 
so se Windows consente) tipo quello di anticipare il segnale 
refresh della ram video, restando sempre dietro o sempre davanti 
al pennello di scansione (anche perché queste porcherie saranno 
presto rese obsolete dai monitor a cristalli liquidi).
Cmq, se ti interessa il concetto, bisogna disegnare 
sincronizzandosi col segnale di scansione più lento del pennello 
elettronico (credo il refresh verticale). Se riesci a disegnare 
tutto l'output grafico restando sempre in coda rispetto ad un 
unica passata pennello, vedrai comparire tutto il disegno 
nell'aspetto definitivo in un solo "clock" dello schermo (mal 
che vada un sessantesimo di secondo). Se invece disegni (con 
BitBLT intendo) mentre il pennello sta passando, è chiaro che la 
parte di disegno fatto che precede il pennello apparirà in un 
istante lievemente anticipato rispetto a quello che viene 
copiato dopo il passaggio del pennello, e che quindi apparirà 
durante il clock successivo, dando sfarfallio.
Ora purtroppo io non mi intendo di DirectX, che dovrebbero 
essere la soluzione ad hoc, come Mauro Cerreto ti ha 
consigliato, ma non sarei sorpreso se vi fossero funzioni 
apposite per ridisegnare in modo fluido, già sincronizzati col 
segnale di refresh del monitor.
BitBLT da memoria a memoria è cmq il più rapido metodo di 
refresh manuale semplice che si possa fare con VB, e spesso la 
copia di una bitmap non troppo enorme riesce ad essere ultimata 
in molto meno di un ciclo del monitor. Certo che ogni tanto, per 
coincidenza, questo non si verificherà, e il segnale ti segherà 
l'output in un qualche punto del tracciamento.
Il fastidio del tremolio dipende sia dalla frequenza con cui 
ridisegni i fotogrammi sia dalla frequenza con cui avvengono le 
"intersezioni" da parte del V-refresh (ci possono essere 
battimenti). Di meglio non so dirti
Ciao
CCCP++Mario


 mandino tutto a monte
Provate a usare la mia advGraph.zip  sul sito comune ;)
Ciao
--
NeoDataType : 
http://www.neodatatype.net
Sito Comune : 
http://www.it-lang-vb.net

 trasparente per l'utente
basta scaricarti le DX9 SDK EXTRA PACK che contiene i sorgenti delle Dx9
accessibili da vb6.
-- 
-Gigio@Work(?)-

 Dx9 accessibili da vb6.
PS: esisteva il sito ms "directMedia" non so se c'è
-- 
-Gigio2k from W?b-