| Hagartinger | Дата: Понедельник, 03 Февраля 2014, 15:37 | Сообщение # 1 |  
| 
 был не раз 
Сейчас нет на сайте 
 
 | Учусь работать с DitectDraw по книжке Андре Ламота. Не получается заблокировать плоскость, не пойму в чем проблема, подскажите пожалуйста в чем проблема.   Код    #define WIN32_LEAN_AND_MEAN   #include <Windows.h>   #include <windowsx.h>    #include <ddraw.h>   #include <math.h>   #include <mmsystem.h>   #include <iostream>    #include <conio.h>   #include <stdlib.h>   #include <malloc.h>   #include <memory.h>   #include <string.h>   #include <stdarg.h>   #include <stdio.h>    #include <math.h>   #include <io.h>   #include <fcntl.h> 
   #pragma comment(lib,"ddraw.lib")   #pragma comment(lib,"DXGUID.lib") 
   // Параметры Экрана   #define SCREEN_WIDTH 1280   #define SCREEN_HEIGHT   1024   #define SCREEN_BPP      32     
   #define BITMAP_ID            0x4D42 // universal id for a bitmap 
   #define MAX_COLORS_PALETTE   256 
   #define DDRAW_INIT_STRUCT(ddstruct) { memset(&ddstruct,0,sizeof(ddstruct)); ddstruct.dwSize=sizeof(ddstruct); } 
   // this builds a 16 bit color value in 5.5.5 format (1-bit alpha mode)   #define _RGB16BIT555(r,g,b) ((b & 31) + ((g & 31) << 5) + ((r & 31) << 10)) 
   // this builds a 16 bit color value in 5.6.5 format (green dominate mode)   #define _RGB16BIT565(r,g,b) ((b & 31) + ((g & 63) << 5) + ((r & 31) << 11)) 
   // 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)) 
   //Глобальные переменные   WNDCLASSEX winclas;    HWND hwnd;   MSG msg;   LPDIRECTDRAW7 lpdd= NULL;   LPDIRECTDRAWSURFACE7 lpddsprimary=NULL;   LPDIRECTDRAWSURFACE7 lpddsback=NULL;   DDSURFACEDESC2 ddsd;  
   typedef struct BITMAP_FILE_TAG           {           BITMAPFILEHEADER bitmapfileheader;  // this contains the bitmapfile header           BITMAPINFOHEADER bitmapinfoheader;  // this is all the info including the palette           PALETTEENTRY     palette[256];      // we will store the palette here           UCHAR            *buffer;           // this is a pointer to the data 
           } BITMAP_FILE, *BITMAP_FILE_PTR; 
   int Flip_Bitmap(UCHAR *image, int bytes_per_line, int height)   {   // this function is used to flip bottom-up .BMP images 
   UCHAR *buffer; // used to perform the image processing   int index;     // looping index 
   // allocate the temporary buffer   if (!(buffer = (UCHAR *)malloc(bytes_per_line*height)))      return(0); 
   // copy image to work area   memcpy(buffer,image,bytes_per_line*height); 
   // flip vertically   for (index=0; index < height; index++)       memcpy(&image[((height-1) - index)*bytes_per_line],              &buffer[index*bytes_per_line], bytes_per_line); 
   // release the memory   free(buffer); 
   // return success   return(1); 
   } // end Flip_Bitmap   int Load_Bitmap_File(BITMAP_FILE_PTR bitmap, char *filename)   {   // this function opens a bitmap file and loads the data into bitmap 
   int file_handle,  // the file handle       index;        // looping index 
   UCHAR   *temp_buffer = NULL; // used to convert 24 bit images to 16 bit   OFSTRUCT file_data;          // the file data information 
   // open the file if it exists   if ((file_handle = OpenFile(filename,&file_data,OF_READ))==-1)      return(0); 
   // now load the bitmap file header   _lread(file_handle, &bitmap->bitmapfileheader,sizeof(BITMAPFILEHEADER)); 
   // test if this is a bitmap file   if (bitmap->bitmapfileheader.bfType!=BITMAP_ID)      {      // close the file      _lclose(file_handle); 
      // return error      return(0);      } // end if 
   // now we know this is a bitmap, so read in all the sections 
   // first the bitmap infoheader 
   // now load the bitmap file header   _lread(file_handle, &bitmap->bitmapinfoheader,sizeof(BITMAPINFOHEADER)); 
   // now load the color palette if there is one   if (bitmap->bitmapinfoheader.biBitCount == 8)      {      _lread(file_handle, &bitmap->palette,MAX_COLORS_PALETTE*sizeof(PALETTEENTRY)); 
      // now set all the flags in the palette correctly and fix the reversed       // BGR RGBQUAD data format      for (index=0; index < MAX_COLORS_PALETTE; index++)          {          // reverse the red and green fields          int temp_color                = bitmap->palette[index].peRed;          bitmap->palette[index].peRed  = bitmap->palette[index].peBlue;          bitmap->palette[index].peBlue = temp_color;                    // always set the flags word to this          bitmap->palette[index].peFlags = PC_NOCOLLAPSE;          } // end for index 
       } // end if 
   // finally the image data itself   _llseek(file_handle,-(int)(bitmap->bitmapinfoheader.biSizeImage),SEEK_END); 
   // now read in the image, if the image is 8 or 16 bit then simply read it   // but if its 24 bit then read it into a temporary area and then convert   // it to a 16 bit image 
   if (bitmap->bitmapinfoheader.biBitCount==8 || bitmap->bitmapinfoheader.biBitCount==16 ||        bitmap->bitmapinfoheader.biBitCount==24)      {      // delete the last image if there was one      if (bitmap->buffer)          free(bitmap->buffer); 
      // allocate the memory for the image      if (!(bitmap->buffer = (UCHAR *)malloc(bitmap->bitmapinfoheader.biSizeImage)))         {         // close the file         _lclose(file_handle); 
         // return error         return(0);         } // end if 
      // now read it in      _lread(file_handle,bitmap->buffer,bitmap->bitmapinfoheader.biSizeImage); 
      } // end if   else      {      // serious problem      return(0); 
      } // end else 
   #if 0   // write the file info out    printf("\nfilename:%s \nsize=%d \nwidth=%d \nheight=%d \nbitsperpixel=%d \ncolors=%d \nimpcolors=%d",           filename,           bitmap->bitmapinfoheader.biSizeImage,           bitmap->bitmapinfoheader.biWidth,           bitmap->bitmapinfoheader.biHeight,     bitmap->bitmapinfoheader.biBitCount,           bitmap->bitmapinfoheader.biClrUsed,           bitmap->bitmapinfoheader.biClrImportant);   #endif 
   // close the file   _lclose(file_handle); 
   // flip the bitmap   Flip_Bitmap(bitmap->buffer,                bitmap->bitmapinfoheader.biWidth*(bitmap->bitmapinfoheader.biBitCount/8),                bitmap->bitmapinfoheader.biHeight); 
   // return success   return(1); 
   } // end Load_Bitmap_File   int Unload_Bitmap_File(BITMAP_FILE_PTR bitmap)   {   // this function releases all memory associated with "bitmap"   if (bitmap->buffer)      {      // release memory      free(bitmap->buffer); 
      // reset pointer      bitmap->buffer = NULL; 
      } // end if 
   // return success   return(1); 
   } // end Unload_Bitmap_File 
   BITMAP_FILE bitmap; 
   LRESULT CALLBACK WinProc(HWND hwnd, UINT msg,WPARAM wparam,LPARAM Lparam)   {     PAINTSTRUCT ps;    HDC hdc;    switch (msg)    {    case WM_CREATE :     {      return(0);     } break;    case WM_PAINT:     {      hdc=BeginPaint(hwnd,&ps);      EndPaint(hwnd,&ps);      return(0);     } break;    case WM_DESTROY:      {      PostQuitMessage(0);      return(0);     } break;    }    return (DefWindowProc(hwnd,msg,wparam,Lparam));   }   int Game_Main (void* parms = NULL, int num_parms = 0)   {   memset(&ddsd,0,sizeof(ddsd));    ddsd.dwSize = sizeof(ddsd);   lpddsprimary->Lock(NULL,&ddsd, DDLOCK_SURFACEMEMORYPTR | DDLOCK_WAIT,NULL); 
   // get video pointer to primary surfce   DWORD *primary_buffer = (DWORD *)ddsd.lpSurface;        
   // 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.buffer[index_y*SCREEN_WIDTH*3 + index_x*3 + 0]),                 green = (bitmap.buffer[index_y*SCREEN_WIDTH*3 + index_x*3 + 1]),                 red   = (bitmap.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           primary_buffer[index_x + (index_y*ddsd.lPitch >> 2)] = pixel; 
           } // end for index_x 
       } // end for index_y 
   // now unlock the primary surface   if (FAILED(lpddsprimary->Unlock(NULL)))      return(0); 
     
   return(1);   } 
   int Game_Init(void* parms = NULL, int num_parms = 0)   {      
    if(FAILED(DirectDrawCreateEx(NULL,(VOID**)&lpdd,IID_IDirectDraw7,NULL)))     return(0); 
    if(FAILED(lpdd->SetCooperativeLevel(hwnd, DDSCL_FULLSCREEN | DDSCL_ALLOWMODEX |                       DDSCL_EXCLUSIVE | DDSCL_ALLOWREBOOT)))    return(0);    if(FAILED(lpdd->SetDisplayMode(SCREEN_WIDTH,SCREEN_HEIGHT,SCREEN_BPP,0,0))) return(0); 
    memset(&ddsd,0,sizeof(ddsd));    ddsd.dwSize = sizeof(ddsd); 
   // enable valid fields   ddsd.dwFlags = DDSD_CAPS|DDSD_BACKBUFFERCOUNT;   ddsd.dwBackBufferCount = 1; 
   // request primary surface   ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE|DDSCAPS_COMPLEX|DDSCAPS_FLIP; 
   // create the primary surface   if (FAILED(lpdd->CreateSurface(&ddsd, &lpddsprimary, NULL)))      {           return(0);      }  
   ddsd.ddsCaps.dwCaps=DDSCAPS_BACKBUFFER;   if(FAILED(lpddsprimary->GetAttachedSurface(&ddsd.ddsCaps,&lpddsback))) return(0); 
   if(!Load_Bitmap_File(&bitmap,"BMW.bmp"))    return(0); 
    return(1);     
     
       } 
   int Game_Shutdown (void* parms = NULL, int num_parms = 0)   { 
    if(lpddsprimary)    {     lpddsprimary->Release();     lpddsprimary=NULL;    }    if(lpdd)    {     lpdd->Release();     lpdd=NULL;    } 
    return(1);   }           int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd)    {     
    winclas.cbSize = sizeof(WNDCLASSEX);    winclas.style = CS_VREDRAW| CS_HREDRAW| CS_OWNDC| CS_DBLCLKS;    winclas.lpfnWndProc= WinProc;    winclas.cbClsExtra=0;    winclas.cbWndExtra=0;    winclas.hInstance=hInstance;    winclas.hIcon= LoadIcon (NULL,IDI_APPLICATION);    winclas.hCursor= LoadCursor(NULL, IDC_ARROW);    winclas.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);    winclas.lpszMenuName = NULL;    winclas.lpszClassName = L"WINCLASS1";    winclas.hIconSm= LoadIcon (NULL,IDI_APPLICATION);    if(FAILED(RegisterClassEx(&winclas))) return(0);    if(FAILED(CreateWindowEx(NULL,L"WINCLASS1",L"Мое Первое окно", WS_VISIBLE|WS_POPUP,0,0,SCREEN_WIDTH,SCREEN_HEIGHT,NULL,NULL,hInstance,NULL))) return(0); 
    Game_Init(); 
    while (true)    {      if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))     {      if(msg.message==WM_QUIT) break; 
     TranslateMessage(&msg); 
     DispatchMessage(&msg);     }     Game_Main();     // выполнение игры 
    }    Game_Shutdown();    return(msg.wParam);   }        После запуска выдает ошибку "Необработанное исключение по адресу 0x00197BBB в Chapter6.exe: 0xC0000005: нарушение прав доступа при чтении по адресу 0x00000000." 
   и указывает мне на этот кусок кода :   Код int Game_Main (void* parms = NULL, int num_parms = 0)   {   memset(&ddsd,0,sizeof(ddsd));    ddsd.dwSize = sizeof(ddsd);   lpddsprimary->Lock(NULL,&ddsd, DDLOCK_SURFACEMEMORYPTR | DDLOCK_WAIT,NULL); 
   // get video pointer to primary surfce   DWORD *primary_buffer = (DWORD *)ddsd.lpSurface;        
   // 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.buffer[index_y*SCREEN_WIDTH*3 + index_x*3 + 0]),                 green = (bitmap.buffer[index_y*SCREEN_WIDTH*3 + index_x*3 + 1]),                 red   = (bitmap.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           primary_buffer[index_x + (index_y*ddsd.lPitch >> 2)] = pixel; 
           } // end for index_x 
       } // end for index_y 
   // now unlock the primary surface   if (FAILED(lpddsprimary->Unlock(NULL)))      return(0); 
     
   return(1);   }     а именно на это строчку :   Код lpddsprimary->Lock(NULL,&ddsd, DDLOCK_SURFACEMEMORYPTR | DDLOCK_WAIT,NULL);  
 |  
| 
 | 
 |    | 
| Archido | Дата: Вторник, 04 Февраля 2014, 17:06 | Сообщение # 2 |  
 
Сэнсэй 
Сейчас нет на сайте 
 
 | Советую быстро забить на DirectDraw и изучать как минимум Direct3D9 или OpenGL 2.0 \ 3.0
  C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
 |  
| 
 | 
 |    | 
| Hagartinger | Дата: Среда, 05 Февраля 2014, 00:21 | Сообщение # 3 |  
| 
 был не раз 
Сейчас нет на сайте 
 
 | Да я уже забил, изучаю сейчас SDL, потом потихонечку переберусь на OpenGL или Direct3D9
 |  
| 
 | 
 |    |