//--------------------------------------------------------------------------- #include #pragma hdrstop #include "DDraw4C.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { lpDD = NULL; lpDDSEkran = NULL; lpDDSBufor = NULL; lpDDSObiekt = NULL; x = 10; y = 10; } //--------------------------------------------------------------------------- void __fastcall TForm1::Transparent(void) { DDCOLORKEY Kolor; Kolor.dwColorSpaceLowValue = clBlack; Kolor.dwColorSpaceHighValue = 10; lpDDSObiekt->SetColorKey(DDCKEY_SRCBLT, &Kolor); } //--------------------------------------------------------------------------- void __fastcall TForm1::Start(void) { DirectDrawCreate(NULL, &lpDD, NULL); lpDD->SetCooperativeLevel(Handle, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN); lpDD->SetDisplayMode(1024, 768, 16); ZeroMemory(&ddsd, sizeof(ddsd)); ddsd.dwSize = sizeof(ddsd); ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT; ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | DDSCAPS_FLIP | DDSCAPS_COMPLEX; ddsd.dwBackBufferCount = 1; lpDD->CreateSurface(&ddsd, &lpDDSEkran, NULL); ddsd.ddsCaps.dwCaps = DDSCAPS_BACKBUFFER; lpDDSEkran->GetAttachedSurface(&ddsd.ddsCaps, &lpDDSBufor); InitBackground(); InitObject(); Transparent(); DDBLTFX ddbltfx; ddbltfx.dwSize = sizeof (ddbltfx); ddbltfx.dwFillColor = 0; lpDDSBufor->Blt(NULL, NULL, NULL,DDBLT_COLORFILL | DDBLT_WAIT, &ddbltfx); } //--------------------------------------------------------------------------- void __fastcall TForm1::InitBackground(void) { HDC kontekst; hdcmem = CreateCompatibleDC(NULL); hbmp = (HBITMAP)LoadImage(NULL, "test.bmp", IMAGE_BITMAP, 1024, 768, LR_LOADFROMFILE); SelectObject(hdcmem, hbmp); ZeroMemory(&ddsd, sizeof(ddsd)); ddsd.dwSize = sizeof(ddsd); ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH; ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN; ddsd.dwWidth = 1024; ddsd.dwHeight = 768; lpDD->CreateSurface(&ddsd, &lpDDSBack, NULL); lpDDSBack->GetDC(&kontekst); BitBlt(kontekst, 0, 0, 1024, 762, hdcmem, 0, 0, SRCCOPY); lpDDSBack->ReleaseDC(kontekst); lpDDSBack->Flip(NULL, DDFLIP_WAIT); } //--------------------------------------------------------------------------- void __fastcall TForm1::Background(void) { HDC kontekst; lpDDSBufor->GetDC(&kontekst); lpDDSBufor->ReleaseDC(kontekst); RECT rect = {0, 0, 1024, 768}; lpDDSBufor->Blt(&rect, lpDDSBack, NULL, DDBLT_WAIT, NULL); lpDDSEkran->Flip(NULL, DDFLIP_WAIT); } //--------------------------------------------------------------------------- void __fastcall TForm1::InitObject(void) { HDC kontekst; hdcmem = CreateCompatibleDC(NULL); hbmp = (HBITMAP)LoadImage(NULL, "obiekt.bmp", IMAGE_BITMAP, 60, 60, LR_LOADFROMFILE); SelectObject(hdcmem, hbmp); ZeroMemory(&ddsd, sizeof(ddsd)); ddsd.dwSize = sizeof(ddsd); ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH | DDSD_BACKBUFFERCOUNT; ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_FLIP | DDSCAPS_COMPLEX; ddsd.dwWidth = 60; ddsd.dwHeight = 60; ddsd.dwBackBufferCount = 1; lpDD->CreateSurface(&ddsd, &lpDDSObiekt, NULL); lpDDSObiekt->GetDC(&kontekst); BitBlt(kontekst, 0, 0, 60, 60, hdcmem, 0, 0, SRCCOPY); lpDDSObiekt->ReleaseDC(kontekst); lpDDSObiekt->Flip(NULL, DDFLIP_WAIT); lpDDSObiekt->GetDC(&kontekst); BitBlt(kontekst, 0, 0, 60, 60, hdcmem, 0, 0, SRCCOPY); lpDDSObiekt->ReleaseDC(kontekst); lpDDSObiekt->Flip(NULL, DDFLIP_WAIT); } //-------------------------------------------------------------------------- void __fastcall TForm1::MyObject(void) { HDC kontekst; lpDDSBufor->GetDC(&kontekst); lpDDSBufor->ReleaseDC(kontekst); RECT rect = {x, y, 60 + x, 60 + y}; RECT tlo = {0 , 0, 1024, 768}; lpDDSBufor->Blt(&tlo, lpDDSBack, NULL, DDBLT_WAIT, NULL); lpDDSBufor->Blt(&rect, lpDDSObiekt, NULL, DDBLT_WAIT | DDBLT_KEYSRC, NULL); //lpDDSObiekt->Flip(NULL, DDFLIP_WAIT); lpDDSEkran->Flip(NULL, DDFLIP_WAIT); Transparent(); } //--------------------------------------------------------------------------- void __fastcall TForm1::Ruchy(WORD &Key) { switch(Key){ case VK_LEFT: x -= 4; break; case VK_RIGHT: x += 4; break; case VK_UP: y -= 4; break; case VK_DOWN: y += 4; break; } MyObject(); } //--------------------------------------------------------------------------- void __fastcall TForm1::FormShow(TObject *Sender) { Start(); MyObject(); } //--------------------------------------------------------------------------- void __fastcall TForm1::FormDestroy(TObject *Sender) { lpDDSEkran->Release(); lpDDSBack->Release(); lpDDSObiekt->Release(); lpDD->RestoreDisplayMode(); DeleteObject(hbmp); DeleteDC(hdcmem); lpDD->Release(); } //--------------------------------------------------------------------------- void __fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key, TShiftState Shift) { if(Key == VK_ESCAPE)Close(); Ruchy(Key); } //---------------------------------------------------------------------------