Модераторы: Rickert, Alexeis, BorisVorontsov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с внеэкранной поверхностью. 2d.DirectX, По Андрэ Ламоту. 
:(
    Опции темы
6Apokali6sis6
Дата 8.7.2007, 18:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 21.12.2005

Репутация: нет
Всего: нет



Итак возникла проблема. Учусь по книжке А.Ламота "Программирование для Windows. Советы профессионала"
Берутся 3 изображения 24 бита, копируются во внеэкранную поверхность, по 1-му изображению на 1 внеэкранную поверхность соответствующего размера.(с этого места работаю с 1-м из изображений, т.к. пока и это не получается, а  в идеале хочу сделать анимацию) Далее это изображение пересылается в задний буфер,  а из заднего в праймари буфер.  Вопрос: Почему не работает? smile
Вот код гэим_мэин, т.е. основной функции работы:

Код


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% т.к. были просто скопированы из книги, однако если нужно я их дам. Собственно не могу найти проблему, но в и тоге при запуске мы имеем чёрный экран.

Заранее благодарен.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Вы можете найти полезным что...
Alexeis
Rickert
  • Английская документация по DirectX лежит где-то здесь.
  • Английская документация по OpenGL лежит где-то там.
  • Гейм-дев у нас обсуждают где-то тут

Ждём вас! С уважением, Alexeis, Rickert.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Мультимедия, OpenGL/DirectX | Следующая тема »


 




[ Время генерации скрипта: 0.0754 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.