
Новичок
Профиль
Группа: Участник
Сообщений: 19
Регистрация: 21.12.2005
Репутация: нет Всего: нет
|
Итак возникла проблема. Учусь по книжке А.Ламота "Программирование для Windows. Советы профессионала" Берутся 3 изображения 24 бита, копируются во внеэкранную поверхность, по 1-му изображению на 1 внеэкранную поверхность соответствующего размера.(с этого места работаю с 1-м из изображений, т.к. пока и это не получается, а в идеале хочу сделать анимацию) Далее это изображение пересылается в задний буфер, а из заднего в праймари буфер. Вопрос: Почему не работает?  Вот код гэим_мэин, т.е. основной функции работы: Код |
int Game_Main(void *parms = NULL, int num_parms = 0) {
RECT source_rect, // used to hold the destination RECT dest_rect; // used to hold the destination RECT
LPDIRECTDRAWSURFACE7 lpdds_image; //ïîäñòðàõîâêà ïðîòèâ ïîâòîðíîãî çàïóñêà, ò.ê. íå èñêëþ÷åíî, ÷òî ô-ÿ Game_Main() áóäåò âûçâàíà åù¸ ðàç, óæå ïîñëå óäàëåíèÿ //ñîîòâåòòñâóþùåãî îêíà. Ýòî êîíå÷íî-æå ïðèâåä¸ò ê îøèáêå, òàê êàê DirectDraw äîëæåí èìåòü â ñâî¸ì ðàñïîðÿæåíèè óêàçàòåëü //íà îêíî. Ïîýòîìó áûëà ââåäåíà áëîêèðóþùàÿ ïåðåìåííàÿ(áèíàðíûé ñåìàôîð:)),êîòîðîé ïîñëå çàêðûòèÿ îêíà ïðèñâàèâàåòñÿ çíà÷åíèå 1 //÷òî ïðåäîòâðàùàåò âûçîâ ôóíêöèè Game_Main() â áóäóùåì. if (window_closed) return(0);
// ïðîâåðêà íå íàæàë ëè ïîëüçîâàòåëü êëàâèøó ESC äëÿ âûõîäà èç èãðû if (KEYDOWN(VK_ESCAPE)) { PostMessage(main_window_handle,WM_CLOSE,0,0); window_closed=1; } DD_INIT_STRUCT(ddsd);
//Òåïåðü ïîëÿ ddsd.lPitch è ddsd.plSurface äîñòîâåðíû
//DWORD *primary_buffer = (DWORD *)ddsd.lpSurface; //Ââåäåíèå íåêîòîðûõ äîïîëíèòåëüíûõ ïåðåìåííûõ, ÷òîáû êîä áûë áîëåå ïîíÿòíûì è íå òðåáîâàëîñü ïðåîáðàçîâàíèå òèïîâ int lpitch32 = (int)(ddsd.lPitch >> 2); UCHAR *back_buffer=(UCHAR *)ddsd.lpSurface;
//Ïðÿìîóãîëüíàÿ îáëàñòü íàçíà÷åíèÿ int x=10; int y=10;
dest_rect.left=x; dest_rect.top=y; dest_rect.right=x+118-1; dest_rect.bottom=y+95-1;
//Èñõîäíàÿ ïðÿìîóãîëüíàÿ îáëàñòü source_rect.left=0; source_rect.top=0; source_rect.right=118-1; source_rect.bottom=95-1;
if (FAILED(lpddsback->Blt(&dest_rect, // pointer to dest RECT dopbuf[0], // pointer to source surface &source_rect,// pointer to source RECT DDBLT_WAIT|DDBLT_KEYSRC, // control flags NULL))) // pointer to DDBLTFX holding info return(0);
dest_rect.left=x; dest_rect.top=y; dest_rect.right=x+118-1; dest_rect.bottom=y+95-1;
//Èñõîäíàÿ ïðÿìîóãîëüíàÿ îáëàñòü source_rect.left=0; source_rect.top=0; source_rect.right=118-1; source_rect.bottom=95-1;
if (FAILED(lpddsprimary->Blt(&dest_rect, // pointer to dest RECT lpddsback, // pointer to source surface &source_rect,// pointer to source RECT DDBLT_WAIT|DDBLT_KEYSRC, // control flags NULL))) // pointer to DDBLTFX holding info return(0);
/////////////////// Sleep(30); //Íåáîëüøàÿ çàäåðæêà.
// return success or failure or your own return code here return(1);
} // end Game_Main
|
Вот код гэим_инициализэйшн: Код |
int Game_Init(void *parms = NULL, int num_parms = 0) { // this is called once after the initial window is created and // before the main event loop is entered, do all your initialization // here
if (FAILED(DirectDrawCreateEx(NULL,(void**)&lpdd,IID_IDirectDraw7,NULL))) {
//îøèáêà return(0); }//if
//Çàäà¸ì äëÿ óðîâíÿ ñîâìåñòíîãî äîñòóïà ôëàã DDSCL_FULLSCREEN,ïîñêîëüêó ïðèëîæåíèå áóäåò ðàáîòàòü //â ïîëíîýêðàííîì ðåæèìå. Òàê-æå óêàçûâàþòñÿ DDSCL_EXCLUSIVE äëÿ èñêëþ÷èòåëüíîãî ðåæèìà(äðóãèå ïðèëîæåíèÿ //íå ñîìãóò âûâîäèòü èôîðìàöèþ ïîâåðõ íàøåãî.DDSCL_ALLOWREBOOT äëÿ ðàñïîçíàâàíèÿ êëàâèø Alt+Ctrl+Del if (FAILED(lpdd->SetCooperativeLevel(main_window_handle, DDSCL_FULLSCREEN| DDSCL_EXCLUSIVE| DDSCL_ALLOWREBOOT| DDSCL_ALLOWMODEX))) { //Îøèáêà return(0); }//if
//Óñòàíîâêà âèäåîðåæèìà 640õ480õ32 if(FAILED(lpdd->SetDisplayMode(SCREEN_WIDTH,SCREEN_HEIGHT,SCREEN_BPP,0,0))) {
//îøèáêà return(0); }
////////////////////////////// //Ñîçäàíèå ïîâåðõíîñòåé DD_INIT_STRUCT(ddsd); //memset(&ddsd,0,sizeof(ddsd)); //Microsoft ðåêîìåíäóåò î÷èùàòü ýòó ñòðóêòóðó. Ìîæíî òàê-æå èñïîëüçîâàòü ô-þ ZeroMemory() //ddsd.dwSize=sizeof(ddsd); //çàäàåì ðàçìåð ñòðóêòóðû
ddsd.dwFlags=DDSD_CAPS|DDSD_BACKBUFFERCOUNT;// íàøåì ñëó÷àå èñïîëüçóåòñÿ òîëüêî ïîëå ddsCaps. //Ìîæíî áûëî áû èñïîëüçîâàòü òàê-æå ïîëÿ îòâå÷àþùèå çà øèðèíó, âûñîòó è äðóãèå //ïàðàìåòðû ïîâåðõíîñòè, íî îíè íå íóæíû, //ïîñêîëüêó ðàçìåðû ñîçäàâàåìîé ïåðâè÷íîé ïîâåðõíîñòè ñîâïàäàþò ñ ðàçìåðàìè ïî óìîë÷àíèþ //DDSD_BACKBUFFERCOUNT óêàçâûàåò, ÷òî ïîëå dwBackBufferCount ñîäåðæèò äîñòîâåðíîå çíà÷åíèå //Ýòî íóæíî äëÿ çàäíåãî áóôåðà.
ddsd.dwBackBufferCount=1; //Ïðèñâîåíèå ïîëþ ñ÷¸ò÷èêà çàäíèõ áóôåðîâ çíà÷åíèÿ 1
//Çàïðîñ ñëîæíîé ñòðóêòóðû ñ âîçìîæíîñòüþ ïåðåêëþ÷åíèÿ ddsd.ddsCaps.dwCaps=DDSCAPS_PRIMARYSURFACE|DDSCAPS_COMPLEX|DDSCAPS_FLIP; //çàäà¸ì ñâîéñòâî DDSCAPS_PRIMARYSURFACE-óêàçûâàþùåå //íà òî,÷òî äàííàÿ ïîâåðõíîñòü ïåðâè÷íàÿ. Ýòîò ôëàã ïðåäñòàâëÿåò òî, //÷òî ïîëüçîâàòåëü âèäèò â äàííûé ìîìåíò //DDSACPS_COMPLEX Óêàçûâàåò, ÷òî îïèñûâàåòñÿ ñëîæíàÿ ïîâåðõíîñòü, ò.å. ïîâåðõíîñòü //ñîñòîÿùàÿ èç îäíîé ïåðâè÷íîé ïîâåðõíîñòè è îäíîãî èëè íåñêîëüêèõ çàäíèõ áóôåðîâ //Ñ ïîìîùüþ ñëîæîíîé ïîâåðõíîñòè ñîçäà¸òñÿ ïîñëåäîâàòåëüíàÿ öåïî÷êà èçîáðàæåíèé //DDSCAPS_FLIP Óêàçûâàåò ÷òî äàííàÿ ïîâåðõíîñòü âõîäèò â ñîñòàâ ñòðóêòóðû, //ñîñòîÿùåé èç ñìåíÿþùèõ äðóã-äðóãà ïîâåðõíîñòåé. Ïðè ïåðåäà÷å ýòîãî ñâ-âà //ôóíêöèè-ìåòîäó CreateSurface() ñîçäàþòñÿ îäèí ïåðåäíèé è îäèí èëè íåñêîëüêî //çàäíèõ áóôåðîâ //Ñîçäàíèå ïåðâè÷íîé ïîâåðõíîñòè if (FAILED(lpdd->CreateSurface(&ddsd,&lpddsprimary,NULL))) { return(0); //îøèáêà }//if
//Çàïðîñ ïðèñîåäèíåííîé ïîâåðõîíñòè èç ïåðâè÷íîé ïîâåðõíîñòè
//Ýòà ñòðîêà ïîíàäîáèòñÿ äëÿ âûçîâà ddsd.ddsCaps.dwCaps=DDSCAPS_BACKBUFFER;
if (FAILED(lpddsprimary->GetAttachedSurface(&ddsd.ddsCaps,&lpddsback))) return(0);
for (int i=0;i<3;i++) { if(!(dopbuf[i]=DDraw_Create_Surface(118,95,DDSCAPS_VIDEOMEMORY))) { return(0); //Îøèáêà } }
///////////////////////// // load the 24-bit image if (!Load_Bitmap_File(&bitmap[0],"D:\cart\1.bmp")) return(0); // load the 24-bit image if (!Load_Bitmap_File(&bitmap[1],"D:\cart\2.bmp")) return(0); // load the 24-bit image if (!Load_Bitmap_File(&bitmap[2],"D:\cart\3.bmp")) return(0);
///////////////// //Ñîçäàíèå âíåýêðàííîé ïîâåðõíîñòè.
for(i=0;i<3;i++) { if(!(dopbuf[i]=DDraw_Create_Surface(118,95,DDSCAPS_VIDEOMEMORY))) return(0);
//Çàïîëíåíèå DDSURFACEDESC2 ddsd;
DD_INIT_STRUCT(ddsd); dopbuf[i]->Lock(NULL,&ddsd,DDLOCK_WAIT|DDLOCK_SURFACEMEMORYPTR,NULL);
//Êàæäûé ïèêñåëü â áóôåðå BITMAP_FILE.buffer[] çàêîäèðîâàí â âèäå 3-áàéòîâîé ïîñëåäîâàòåëüíîñòè â ïîðÿäêå BGR à íå RGB!!
// process each line and copy it into the primary buffer for (int index_y = 0; index_y < SCREEN_HEIGHT; index_y++) { for (int index_x = 0; index_x < SCREEN_WIDTH; index_x++) { // get BGR values UCHAR blue = (bitmap[i].buffer[index_y*SCREEN_WIDTH*3 + index_x*3 + 0]), green = (bitmap[i].buffer[index_y*SCREEN_WIDTH*3 + index_x*3 + 1]), red = (bitmap[i].buffer[index_y*SCREEN_WIDTH*3 + index_x*3 + 2]);
// this builds a 32 bit color value in A.8.8.8 format (8-bit alpha mode) /*DWORD pixel =*/ _RGB32BIT(0,red,green,blue);
// write the pixel } // end for index_x
} // end for index_y
dopbuf[i]->Unlock(NULL);
Scan_Image_Bitmap(&bitmap[i],dopbuf[i],0,0); Unload_Bitmap_File(&bitmap[i]);
}//for
//////////////// // now create and attach clipper RECT rect_list[1] = {0,0,SCREEN_WIDTH,SCREEN_HEIGHT};
if (FAILED(lpddclipper = DDraw_Attach_Clipper(lpddsprimary,1,rect_list))) return(0);
//////////////////////////////////
// return success or failure or your own return code here return(1);
} // end Game_Init
|
Ну и собствнно определения: Код | // DEFINES ////////////////////////////////////////////////
// defines for windows #define WINDOW_CLASS_NAME "WINCLASS1"
#define SCREEN_WIDTH 640 // size of screen #define SCREEN_HEIGHT 480 #define SCREEN_BPP 32 // bits per pixel //#define MAX_COLORS 256 // maximum colors
#define BITMAP_ID 0x4D42 // universal id for a bitmap
// basic unsigned types typedef unsigned short USHORT; typedef unsigned short WORD; typedef unsigned char UCHAR; typedef unsigned char BYTE;
// MACROS /////////////////////////////////////////////////
#define KEYDOWN(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0) #define KEYUP(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 0 : 1)
// initializes a direct draw struct #define DD_INIT_STRUCT(ddstruct) { memset(&ddstruct,0,sizeof(ddstruct)); ddstruct.dwSize=sizeof(ddstruct); }
// this builds a 32 bit color value in A.8.8.8 format (8-bit alpha mode) #define _RGB32BIT(a,r,g,b) ((b) + ((g) << 8) + ((r) << 16) + ((a) << 24))
// GLOBALS //////////////////////////////////////////////// HWND main_window_handle = NULL; // globally track main window HINSTANCE hinstance_app = NULL; // globally track hinstance int window_closed=0;
int gwidth = -1; int gheight = -1; ///Ñòðóêòóðû typedef struct BITMAP_FILE_TAG { BITMAPFILEHEADER bitmapfileheader;//Çäåñü ñîäåðæèòñÿ çàãîëîâîê ðàñòðîâîãî ôàéëà BITMAPINFOHEADER bitmapinfoheader;//Çäåñüñîäåðæàòñÿ âñå äàííûå âêëþ÷àÿ ïàëèòðó PALETTEENTRY palette[256]; //Çäåñü õðàíèòñÿ ïàëèòðà UCHAR *buffer; //Óêàçàòåëü íà äàííûå }BITMAP_FILE, *BITMAP_FILE_PTR;
// directdraw stuff
LPDIRECTDRAW7 lpdd = NULL; // Èíòåðôåéñ DirectDraw 7 LPDIRECTDRAWSURFACE7 lpddsprimary = NULL; // Ïåðâè÷íàÿ ïîâåðõíîñòü LPDIRECTDRAWSURFACE7 lpddsback = NULL; // Çàäíèé áóôåð LPDIRECTDRAWSURFACE7 dopbuf[3] /*= NULL*/; // Âíåýêðàííàÿ ïîâåðõíîñòü
LPDIRECTDRAWPALETTE lpddpal = NULL; // Èíòåðôåéñ ïàëèòðû LPDIRECTDRAWCLIPPER lpddclipper = NULL; // dd clipper
PALETTEENTRY palette[256]; // ñîçäàíèå ïàëèòðû PALETTEENTRY save_palette[256]; // used to save palettes
DDSURFACEDESC2 ddsd; // Îïèñàíèå ïîâåðõíîñòè DirectDraw DDBLTFX ddbltfx; // used to fill DDSCAPS2 ddscaps; // a direct draw surface capabilities struct HRESULT ddrval; // result back from dd calls DWORD start_clock_count = 0; // used for timing
BITMAP_FILE bitmap[3]; // holds the bitmap
// these defined the general clipping rectangle int min_clip_x = 0, // clipping rectangle max_clip_x = SCREEN_WIDTH-1, min_clip_y = 0, max_clip_y = SCREEN_HEIGHT-1;
// these are overwritten globally by DD_Init() int screen_width = SCREEN_WIDTH, // width of screen screen_height = SCREEN_HEIGHT, // height of screen screen_bpp = SCREEN_BPP; // bits per pixel
char buffer[80]; // general printing buffer
|
Все используемые функции работают 100% т.к. были просто скопированы из книги, однако если нужно я их дам. Собственно не могу найти проблему, но в и тоге при запуске мы имеем чёрный экран. Заранее благодарен.
|