Als blikken konden doden, waarom doen ze er dan erwten in?
Ik snap er echt helemaal niks meer van!
Maar een dialog gebruiken voor Direct Draw zou geen probleem mogen zijn?
Als blikken konden doden, waarom doen ze er dan erwten in?
private BOOL direct_draw_init_surfaces(void)
{
DDSCAPS ddscaps ;
LPDIRECTDRAW pDD ; // DD1 interface, used to get DD4 interface
HRESULT hRet ;
DDPIXELFORMAT ddpf =
// The pixel format that we want the surface to be in
{
sizeof(DDPIXELFORMAT),
DDPF_YUV,
0, 8
};
/*
* Create the main DirectDraw object.
* This function takes care of initializing COM and Constructing
* the DirectDraw object.
*/
hRet = DirectDrawCreate( NULL, &pDD, NULL ) ;
if( hRet != DD_OK )
{
return(FALSE) ;
}
// Fetch DirectDraw4 interface
hRet = pDD->lpVtbl->QueryInterface(pDD, &IID_IDirectDraw, (LPVOID *)&lpDD);
if (FAILED(hRet))
{
return (FALSE);
}
hRet = lpDD->lpVtbl->SetCooperativeLevel( lpDD , main , DDSCL_NORMAL ) ;
if( hRet != DD_OK )
{
lpDD->lpVtbl->Release ;
return(FALSE) ;
}
// Create the primary surface with 1 back buffer
ZeroMemory(&ddsd, sizeof(ddsd)) ;
ddsd.dwSize = sizeof(ddsd) ;
ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT ;
ddsd.dwHeight = 578 ;
ddsd.dwWidth = 768 ;
ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE| DDSCAPS_FLIP|DDSCAPS_COMPLEX ;
ddsd.dwBackBufferCount = 1 ;
ddsd.ddpfPixelFormat = ddpf ; // Use 8 bit YUV pixel format
hRet = lpDD->lpVtbl->CreateSurface (lpDD, &ddsd, &lpDDSPrimary, NULL) ;
if (hRet != DD_OK)
{
return(FALSE) ;
}
ddscaps.dwCaps = DDSCAPS_BACKBUFFER;
hRet = lpDDSPrimary->lpVtbl->GetAttachedSurface(lpDDSPrimary, &ddscaps, &lpDDSBack);
if(hRet!= DD_OK)
{
return (FALSE);
}
return(TRUE) ;
}
Als blikken konden doden, waarom doen ze er dan erwten in?
En voor de rest klopt alles... Ik heb alles gecheckt...
Als blikken konden doden, waarom doen ze er dan erwten in?
Maar ik zal nog een paar pogingen doen...
Als blikken konden doden, waarom doen ze er dan erwten in?
En ik heb een van de voorbeelden bij de DirectX 6.1 SDK gecomppileerd en die werkt wel ---> Stretch.cpp
Kan het eraan liggen dat ik C gebruik en niet C++?
Als blikken konden doden, waarom doen ze er dan erwten in?
Ik dacht dat je in windowed mode geen primary surface mag maken met DDSCAPS_FLIP en backbuffers.Garoth schreef op 11 december 2002 @ 16:29:
CreateSurface geeft aan dat de mode Exclusive moet zijn... Maar dat is net het probleem. Ik wil dit surface gebruiken voor het displayen van live video, maar het mag niet fullscreen exclusive zijn... Want dan werken mijn buttons niet meer...
Nee. Ik zou je zelfs dit stukje in assembler kunnen laten zien dat ik een keer heb gemaakt... Taal maakt in principe niets uit.Kan het eraan liggen dat ik C gebruik en niet C++?
Garoth schreef op 04 december 2002 @ 13:46:
Dit is dus hoe ik DD initialiseer, maar mijn lpddsback blijft ongevuld, en opeens ook mijn lpddsprimary...
C:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 private BOOL direct_draw_init_surfaces(void) { DDSCAPS ddscaps ; LPDIRECTDRAW pDD ; // DD1 interface, used to get DD4 interface HRESULT hRet ; DDPIXELFORMAT ddpf = // The pixel format that we want the surface to be in { sizeof(DDPIXELFORMAT), DDPF_YUV, 0, 8 }; /* * Create the main DirectDraw object. * This function takes care of initializing COM and Constructing * the DirectDraw object. */ hRet = DirectDrawCreate( NULL, &pDD, NULL ) ; if( hRet != DD_OK ) { return(FALSE) ; } // Fetch DirectDraw4 interface hRet = pDD->lpVtbl->QueryInterface(pDD, &IID_IDirectDraw, (LPVOID *)&lpDD); if (FAILED(hRet)) { return (FALSE); } hRet = lpDD->lpVtbl->SetCooperativeLevel( lpDD , main , DDSCL_NORMAL ) ; if( hRet != DD_OK ) { lpDD->lpVtbl->Release ; return(FALSE) ; } // Create the primary surface with 1 back buffer ZeroMemory(&ddsd, sizeof(ddsd)) ; ddsd.dwSize = sizeof(ddsd) ; ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT ; ddsd.dwHeight = 578 ; ddsd.dwWidth = 768 ; ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE| DDSCAPS_FLIP|DDSCAPS_COMPLEX ; ddsd.dwBackBufferCount = 1 ; ddsd.ddpfPixelFormat = ddpf ; // Use 8 bit YUV pixel format hRet = lpDD->lpVtbl->CreateSurface (lpDD, &ddsd, &lpDDSPrimary, NULL) ; if (hRet != DD_OK) { return(FALSE) ; } ddscaps.dwCaps = DDSCAPS_BACKBUFFER; hRet = lpDDSPrimary->lpVtbl->GetAttachedSurface(lpDDSPrimary, &ddscaps, &lpDDSBack); if(hRet!= DD_OK) { return (FALSE); } return(TRUE) ; }
even tussen codetags, dat leest wat makkelijker
wat betekent die bovenste private trouwens?
en verder ben je de haakjes vergeten achter Release bij het volgende stukje code:
1
2
3
4
5
| if( hRet != DD_OK ) { lpDD->lpVtbl->Release ; return(FALSE) ; } |
verder zou ik niet weten waarom het niet zou werken
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
Goed, dan moet ik helaas iets nieuws gaan verzinnen als backbuffering niet werkt in windowed mode... Maar ja, dat moet dan maar...
En .Oisin, die bovenste private is gewoon om ervoor te zorgen dat die functie private is. Da's een of andere regel hier in het bedrijf... Ik zou het zelf ook anders doen, maar ja...
En als ik haakjes achter Release zet geeft mijn debugger de error : "Function does not match prototype" . Raar maar waar... Yay Metrowerks...
Als blikken konden doden, waarom doen ze er dan erwten in?
In MSDN staan voorbeelden hoe dat moet. Gewoon een andere surface met DDSCAPS_OFFSCREENPLAIN maken, en dan met IDirectDrawSurface::Blt die op de primary surface blitten op de goede plaats.Garoth schreef op 12 December 2002 @ 09:02:
Goed, dan moet ik helaas iets nieuws gaan verzinnen als backbuffering niet werkt in windowed mode... Maar ja, dat moet dan maar...
Ook moet je een clipper maken en die aan je window en primary surface kopppelen.
Als blikken konden doden, waarom doen ze er dan erwten in?
Garoth schreef op 12 December 2002 @ 09:02:
En .Oisin, die bovenste private is gewoon om ervoor te zorgen dat die functie private is. Da's een of andere regel hier in het bedrijf... Ik zou het zelf ook anders doen, maar ja...
ja, en nu doet ie helemaal niets
Wat daar staat is in principe hetzelfde als:
1
2
3
4
| int a; /* ... */ a; /* <-- deze statement */ |
Het is een valide statement, maar er gebeurt gewoon niets. Wat je eigenlijk doet is het adres van de Release functie opvragen, maar daar doe je dan vervolgens niet mee. Als je er haakjes achter zet evalueert ie dat als een function call.
Dat ie met () erachter niet klopt is natuurlijk nogal duh, aangezien je altijd de this pointer mee moet geven als eerste parameter
Dit zal daarom beter werken:
1
| lpDD->lpVtbl->Release (lpDD); |
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
Maar wat ik ook probeer, ik krijg die pixelformat niet aan het werken....
Het kan zijn dat ik heel dom ben of zo, maar ik maak de dwSize gewoon sizeof(DDPIXELFORMAT), de dwFlags maak ik DDPF_FOURCC, en de deFourCC maak ik YUV8. En nu krijg ik de melding : Error : undefined identifier 'YUV8'
grab_sequence.c line 310 YUV8
[ Voor 65% gewijzigd door Garoth op 16-12-2002 09:30 ]
Als blikken konden doden, waarom doen ze er dan erwten in?
1
2
3
4
5
| ZeroMemory(&ddpf, sizeof(ddpf)); ddpf.dwSize = sizeof(DDPIXELFORMAT); ddpf.dwFlags = DDPF_YUV; // ddpf.dwFourCC = mmioFOURCC('Y','U','V','8'); ddpf.dwYUVBitCount= 8; |
[ Voor 12% gewijzigd door Garoth op 16-12-2002 10:06 ]
Als blikken konden doden, waarom doen ze er dan erwten in?