Newsgroup: it.comp.programmare.win32
Titolo: Chi mi da una mano sulle DirecDraw?

Sto lavorando da poco con le DirectDraw in VB. Sono riuscito a capire come
fare una <surface> con relativa <backBuffer> e fare delle scritte animate.
Ora vorrei capire come posso fare due layer trasparenti (ad es. sfruttando
gli overlay) come in photoshop in modo da poter scrivere su un layer,
cancellarlo, senza che vada a toccare l'altro layer (come se lavorassi su
due fogli lucidi). I due layer devono essere indipendenti ma sovrapponibili
in modo da fare scritte animate su sfondi anch'essi animati.
Per ora ho definito le seguenti variabili:
Public dxDirectX As New DirectX7
Public dxDirectDraw7 As DirectDraw7
Public sdFront As DDSURFACEDESC2
Public srfFront As DirectDrawSurface7
Public sdBackBuffer As DDSURFACEDESC2
Public srfBackBuffer As DirectDrawSurface7
poi ho fatto una sub di Init:
Sub Initialize()
ShowCursor (0)
Set srfBackBuffer = Nothing
Set srfFront = Nothing
Set dxDirectDraw7 = dxDirectX.DirectDrawCreate("")
dxDirectDraw7.SetCooperativeLevel Form1.hWnd, DDSCL_FULLSCREEN Or
DDSCL_EXCLUSIVE Or DDSCL_ALLOWMODEX
Call dxDirectDraw7.SetDisplayMode(1024, 768, 32, 0, DDSDM_DEFAULT)
sdFront.lFlags = DDSD_CAPS Or DDSD_BACKBUFFERCOUNT
sdFront.ddsCaps.lCaps = DDSCAPS_PRIMARYSURFACE Or DDSCAPS_COMPLEX Or
DDSCAPS_FLIP
sdFront.lBackBufferCount = 1
Set srfFront = dxDirectDraw7.CreateSurface(sdFront)
Dim ddCaps As DDSCAPS2
ddCaps.lCaps = DDSCAPS_BACKBUFFER
Set srfBackBuffer = srfFront.GetAttachedSurface(ddCaps)
srfBackBuffer.GetSurfaceDesc sdBackBuffer
End Sub
poi ho messo un timer che va a scrivere quello che desidero usando la
funzione srfFront.DrawText(....) avendo precedentemente settato il font con
srfFront.SetFont. Ho visto che posso fare caratteri trasparenti con la
funzione srfFront.SetFontTransparency True, per cui mi basta capire come
fare un layer trasparente.
Come faccio a creare le due superfici e lavorare su di esse con due timer ad
esempio???
--
      grazie,
               Alessio.

Ciao, AL!
Il giorno 23/11/2003 alle ore 20:38 hai scritto:
 A> lavorassi su due fogli lucidi). I due layer devono essere indipendenti
 A> ma sovrapponibili in modo da fare scritte animate su sfondi anch'essi
 A> animati.
Devi definire tante superfici quante ne servono per quello che devi fare e
poi le "blitti" sulla superficie di visualizzazione con le apposite
funzioni. Con il DirectDraw non funziona l'alfa channel ma solo il croma
key, se vuoi usare l'alpha channel devi usare il direct 3d.
Bye

"1Sconosciuto" <o...@unknown.invalid> ha scritto nel messaggio
news:f%iwb.141774$e6.51...@twister2.libero.it...

ma come le definisco queste superfici?! Per il blit ho capito, mi dici solo
come usare il colore per le trasparenze? Grazie, Alessio

Ciao, AL!
Il giorno 24/11/2003 alle ore 09:41 hai scritto:
 A> ma come le definisco queste superfici?! Per il blit ho capito, mi dici
 A> solo come usare il colore per le trasparenze? Grazie, Alessio
Le definisci come hai definito tutte le altre, solo che anziche' avere un
backbuffer sono superfici normali, lo hai gia' fatto...
Comunque trovi tutto su 
msdn.microsoft.com
.
Bye

"1Sconosciuto" <o...@unknown.invalid> ha scritto nel messaggio
news:%Tjwb.138251$vO5.5...@twister1.libero.it...

ho provato, ma mi da automation error, sia settando la superfice come
overlay che off_screen ! uffa.....provero` ancora
dove sbaglio?:
sdFront2.lFlags = DDSD_CAPS Or DDSD_CKSRCOVERLAY Or DDSD_BACKBUFFERCOUNT
sdFront2.ddsCaps.lCaps = DDSCAPS_OVERLAY Or DDSCAPS_COMPLEX Or
DDSCAPS_VISIBLE
On Error GoTo err2
Set srfFront2 = dxDirectDraw7.CreateSurface(sdFront2)
If Not srfFront2 Is Nothing Then
    srfFront.AddAttachedSurface srfFront2
    Debug.Print "surface 2 attached!"
Else
    Beep
End If

Ciao, AL!
Il giorno 24/11/2003 alle ore 13:36 hai scritto:
 A> ho provato, ma mi da automation error, sia settando la superfice come
 A> overlay che off_screen ! uffa.....provero` ancora
Ti da l'errore dove, alla creazione o all'attach ? Se e' nella creazione hai
specificato una combinazione di flag non validi. Comunque non uso il VB
quindi non saprei nello specifico.
 A> sdFront2.lFlags = DDSD_CAPS Or DDSD_CKSRCOVERLAY Or DDSD_BACKBUFFERCOUNT
 A> sdFront2.ddsCaps.lCaps = DDSCAPS_OVERLAY Or DDSCAPS_COMPLEX Or
 A> DDSCAPS_VISIBLE
Togli backbuffercount, togli complex, togli visibile. Direi che poi mancano
i flag per la dimensione e la superficie deve essere OFFSCREENPLAIN. Il
directdraw ha regole precise per le superfici che si possono creare che in
buona parte dipendono dai driver della scheda video, per esempio l'overlay
di solito e' uno solo (alcune schede come le ATI a volte ne possono creare
anche piu' di uno) e solitamente di tipo YUV.
 A>     srfFront.AddAttachedSurface srfFront2
Questo non serve.
Bye

 Questo non serve.
adesso funziona, anche perche` bisogna creare prima la superficie
BackBuffer!! Mah...misteri, possibile che non si possa creare solo una
primaria e una OffScreen?! Naturalmente ho tolto buffercount nelle prove
senza Back, ma l'importante che ora io sia riuscito a creare una nuova
superficie. Il problema ora e` il Blitting con il colorKey. Non funziona
questo adesso! Uff...ma io ho cercato documentazione in rete e non capisco
dove sta l'errore. Se aggiungo il flag DDSD_CKSRCBLT alla creazione della
sup. OffScreen mi dice che la memoria e` esaurita. Se non lo metto, quando
chiamo la Blt (con il flag DDBLTFAST_SRCCOLORKEY) mi da errore. Natuarlmente
prima ho chiamato la SetColorKey dalla sup. di origine.