Форум: "Media";
Текущий архив: 2003.03.06;
Скачать: [xml.tar.bz2];
ВнизПомогите насчет DirectX Найти похожие ветки
← →
BlackSun (2002-11-22 21:45) [0]Суть в том, что есть 2 поверхности, заполненные черным цветом, и они по очереди выводятся на экран (метод Flip), но результат такой, одна поверхность белая, другая черная, а должны бть обе черными, делаю так... В чем дело, помогите, плиз...
procedure TfrmDD.FormCreate(Sender: TObject);
var
hRet : HRESULT;
ddsd : TDDSurfaceDesc2;
ddscaps : TDDSCaps2;
begin
FDDSBack := nil;
FDDSPrimary := nil;
FDD := nil;
hRet := DirectDrawCreateEx (nil, FDD, IDirectDraw7, nil);
if Failed (hRet) then ErrorOut(hRet, "DirectDrawCreateEx");
hRet := FDD.SetCooperativeLevel(Handle, DDSCL_FULLSCREEN or DDSCL_EXCLUSIVE);
if Failed (hRet) then ErrorOut(hRet, "SetCooperativeLevel");
hRet := FDD.SetDisplayMode (ScreenWidth, ScreenHeight, ScreenBitDepth, 0, 0);
if Failed (hRet) then ErrorOut(hRet, "SetDisplayMode");
ZeroMemory (@ddsd, SizeOf(ddsd));
with ddsd do begin
dwSize := SizeOf(ddsd);
dwFlags := DDSD_CAPS or DDSD_BACKBUFFERCOUNT;
ddsCaps.dwCaps := DDSCAPS_PRIMARYSURFACE or DDSCAPS_FLIP or DDSCAPS_COMPLEX;
dwBackBufferCount := 1;
end;
hRet := FDD.CreateSurface(ddsd, FDDSPrimary, nil);
if Failed (hRet) then ErrorOut(hRet, "Create Primary Surface");
ZeroMemory (@ddscaps, SizeOf(ddscaps));
ddscaps.dwCaps := DDSCAPS_BACKBUFFER;
hRet := FDDSPrimary.GetAttachedSurface(ddscaps, FDDSBack);
if Failed (hRet) then ErrorOut(hRet, "GetAttachedSurface");
if Failed (Clear) then Close;
if Failed (FlipPages) then Close;
if Failed (Clear) then Close;
end;
function TfrmDD.Clear : HRESULT;
var
desc : TDDSURFACEDESC2;
hRet : HRESULT;
begin
ZeroMemory (@desc, SizeOf(desc));
desc.dwSize := SizeOf(desc);
hRet := FDDSBack.Lock (nil, desc, DDLOCK_WAIT, 0);
if Failed (hRet) then begin
Result := hRet;
Exit;
end;
FillChar (desc.lpSurface^, 307200, 0);
Result := FDDSBack.Unlock (nil);
end;
function TfrmDD.FlipPages : HRESULT;
begin
Result := FDDSPrimary.Flip(nil, DDFLIP_WAIT);
end;
procedure TfrmDD.ApplicationEvents1Idle(Sender: TObject;
var Done: Boolean);
begin
if FActive then
FlipPages
else RestoreAll;
Done := False;
end;
← →
Sapersky_ (2002-11-24 00:35) [1]> FillChar (desc.lpSurface^, 307200, 0);
- это очистка фиксированного буфера 640*480, а если другой?
И вообще, ИМХО, лучше так:
Var BltFX : TDDBltFx;
BltFX.dwSize:=SizeOf(BltFX);
BltFX.dwFillColor:=0;
FDDSBack.Blt(nil,nil,nil,DDBLT_COLORFILL or DDBLT_WAIT,@BltFX);
И поставить очистку лучше в основном цикле, чтобы первые два раза перед выводом всё очищалось.
Страницы: 1 вся ветка
Форум: "Media";
Текущий архив: 2003.03.06;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.009 c