All I want to do is load the bmp haha.bmp (dont ask) onto a backsurface then blit it on to the backbuffer and flip. When I run this code below it does the intro then when it comes to the blit part it seems to load the bmp then for some odd reason the code cuts my screen in 4 pieces!!?? It draws the bmp twice,once in the upper left and once upper right. then the bottom half of the screen is black. I have no clue whats wrong.
Im using a TNT video card. Oh by the way the first part of the program (the intro part works without a hitch) thanks again guys I owe you my life here is the code:
// DEMO7_5.CPP 8-bit page flipping demo
// INCLUDES ///////////////////////////////////////////////
#define WIN32_LEAN_AND_MEAN // just say no to MFC
#define INITGUID
#include #include // DEFINES //////////////////////////////////////////////// // defines for windows // default screen size // TYPES ////////////////////////////////////////////////////// // basic unsigned types } BITMAP_FILE, *BITMAP_FILE_PTR; typedef struct KNIGHT_OBJ_TYPE // PROTOTYPES ////////////////////////////////////////////// int Flip_Bitmap(UCHAR *image, int bytes_per_line, int height); int Load_Bitmap_File(BITMAP_FILE_PTR bitmap, char *filename); int Unload_Bitmap_File(BITMAP_FILE_PTR bitmap); int DDraw_Fill_Surface(LPDIRECTDRAWSURFACE4 lpdds, int color); int Scan_Image_Bitmap(BITMAP_FILE_PTR bitmap, LPDIRECTDRAWSURFACE4 lpdds, int cx, int cy); LPDIRECTDRAWSURFACE4 DDraw_Create_Surface(int width, int height, int mem_flags, int color_key); int DDraw_Draw_Surface(LPDIRECTDRAWSURFACE4 source, int x, int y, // MACROS ///////////////////////////////////////////////// #define KEYDOWN(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0) // initializes a direct draw struct // GLOBALS //////////////////////////////////////////////// // directdraw stuff KNIGHT_OBJ knight[3]; // The player LPDIRECTDRAWSURFACE4 lpddsbackground = NULL;// holds the background image char buffer[80]; // general printing buffer int gwidth = -1 ; // FUNCTIONS ////////////////////////////////////////////// //set the dwfillcolor to the color //ready to blt to surface { RECT dest_rect, // fill in the source rect if (transparent) // return success } //end DDraw_Draw_Surfacc int Scan_Image_Bitmap(BITMAP_FILE_PTR bitmap, // bitmap file to scan image data from UCHAR *source_ptr, // working pointers DDSURFACEDESC2 ddsd; // direct draw surface description // get the addr to destination surface memory // set size of the structure // lock the display surface // compute position to start scanning bits from gwidth = ddsd.dwWidth; // extract bitmap data // assign a pointer to the memory surface for manipulation // iterate thru each scanline and copy bitmap // advance pointers // unlock the surface // return success } // end Scan_Image_Bitmap /////////////////////////////////////////////////////////////// LPDIRECTDRAWSURFACE4 DDraw_Create_Surface(int width, int height, int mem_flags, int color_key = 1) DDSURFACEDESC2 ddsd; // working description // set dimensions of the new bitmap surface // set surface to offscreen plain // create the surface // test if user wants a color key // now set the color key for source blitting // return surface int Intro_Screen() ///Black for a second // for now test if user is hitting ESC and send WM_CLOSE /////////Load COMPANY LOGO for (int fade = 32; fade >= 0; fade--) // lock the back buffer lpddsback->Lock(NULL,&ddsd, DDLOCK_SURFACEMEMORYPTR | DDLOCK_WAIT,NULL); //fade in if ((blue - fade) > 0) //pixel // write the pixel } // end for index_x } // end for index_y // unlock the back buffer // perform the flip // hold title } ///End of Fade FOR //////////////////Fade OUT////////////////////// // lock the back buffer lpddsback->Lock(NULL,&ddsd, DDLOCK_SURFACEMEMORYPTR | DDLOCK_WAIT,NULL); if ((blue - fade) > 0) } // end for index_x } // end for index_y // unlock the back buffer // perform the flip //////////////////////////////////////////////////////////////////////// int Load_Bitmap_File(BITMAP_FILE_PTR bitmap, char *filename) int file_handle; // the file handle UCHAR *temp_buffer = NULL; // used to convert 24 bit images to 16 bit // open the file if it exists // now load the bitmap file header // test if this is a bitmap file // return error // now we know this is a bitmap, so read in all the sections // first the bitmap infoheader // now load the bitmap file header // finally the image data itself // now read in the image, if the image is 8 or 16 bit then simply read it if (bitmap->bitmapinfoheader.biBitCount==8 | | bitmap->bitmapinfoheader.biBitCount==16 | | // allocate the memory for the image // return error // now read it in } // end if } // end else #if 0 // close the file // flip the bitmap // return success } // end Load_Bitmap_File /////////////////////////////////////////////////////////// int Unload_Bitmap_File(BITMAP_FILE_PTR bitmap) // reset pointer } // end if // return success } // end Unload_Bitmap_File /////////////////////////////////////////////////////////// int Flip_Bitmap(UCHAR *image, int bytes_per_line, int height) UCHAR *buffer; // used to perform the image processing // allocate the temporary buffer // copy image to work area // flip vertically // release the memory // return success } // end Flip_Bitmap /////////////////////////////////////////////////////////////// // what is the message // return success case WM_DESTROY: // kill the application, this sends a WM_QUIT message // return success default:break; } // end switch // process any messages that we didn't take care of } // end WinProc /////////////////////////////////////////////////////////// int Game_Main(void *parms = NULL, int num_parms = 0) //lookup for wlking sequence int index; //general looper // make sure this isn't executed again // for now test if user is hitting ESC and send WM_CLOSE // draw all the bots // } // end for index Sleep(100); return(1); //////////////////////////////////////////////////////////// int Game_Init(void *parms = NULL, int num_parms = 0) // first create base IDirectDraw interface // now query for IDirectDraw4 // set cooperation to full screen // set display mode to 800x600x16 // clear ddsd and set size // enable valid fields // set the backbuffer count field to 1, use 2 for triple buffering // request a complex, flippable // create the primary surface // clean the surfaces // create the buffer to hold the background // get video pointer to primary surfce // make copy of source and destination addresses // memory is non-linear, copy line by line // advance pointers to next line } // end else Sleep(500); // unload the bitmap file, we no longer need it // create each surface and load bits // now load bits... // unload the bitmap file, we no longer need it } // end Game_Init ///////////////////////////////////////////////////////////// int Game_Shutdown(void *parms = NULL, int num_parms = 0) // now the primary surface // now blow away the IDirectDraw4 interface // return success or failure or your own return code here } // end Game_Shutdown // WINMAIN //////////////////////////////////////////////// int WINAPI WinMain( HINSTANCE hinstance, WNDCLASSEX winclass; // this will hold the class we create // first fill in the window class stucture // save hinstance in global // register the window class // create the window // save main window handle // initialize game here // enter main event loop // send the message to the window proc // closedown game here // return to Windows like this } // end WinMain ///////////////////////////////////////////////////////////
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define WINDOW_CLASS_NAME "WINCLASS1"
#define SCREEN_WIDTH 800 // size of screen
#define SCREEN_HEIGHT 600
#define SCREEN_BPP 16 // bits per pixel
typedef unsigned short USHORT;
typedef unsigned short WORD;
typedef unsigned char UCHAR;
typedef unsigned char BYTE;
// container structure for bitmaps .BMP file
typedef struct BITMAP_FILE_TAG
{
BITMAPFILEHEADER bitmapfileheader; // this contains the bitmapfile header
BITMAPINFOHEADER bitmapinfoheader; // this is all the info including the palette
UCHAR *buffer; // this is a pointer to the data
{
LPDIRECTDRAWSURFACE4 frames[3]; //3 frames of animation
int x,y; //position of KNIGHT
int current_frame; //current frame of animation
int counter; //used to time animation
int width;
int height;
float scale; //scale of object
} KNIGHT_OBJ, *KNIGHT_OBJ_PTR;
int width, int height, LPDIRECTDRAWSURFACE4 dest,
int transparent);
#define KEYUP(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 0 : 1)
#define BITMAP_ID 0x4D42 // universal id for a bitmap
#define DDRAW_INIT_STRUCT(ddstruct) { memset(&ddstruct,0,sizeof(ddstruct)); ddstruct.dwSize=sizeof(ddstruct); }
// this builds a 16 bit color value in 5.6.5 format (green dominate mode)
#define _RGB16BIT565(r,g,b) ((b%32) + ((g%64) << 6) + ((r%32) << 11))
HWND main_window_handle = NULL; // globally track main window
int window_closed = 0; // tracks if window is closed
HINSTANCE hinstance_app = NULL; // globally track hinstance
LPDIRECTDRAW4 lpdd = NULL; // dd4 object
LPDIRECTDRAWSURFACE4 lpddsprimary = NULL; // dd primary surface
LPDIRECTDRAWSURFACE4 lpddsback = NULL; // dd back surface
LPDIRECTDRAWPALETTE lpddpal = NULL; // a pointer to the created dd palette
LPDIRECTDRAWCLIPPER lpddclipper = NULL; // dd clipper
DDSURFACEDESC2 ddsd; // a direct draw surface description struct
DDBLTFX ddbltfx;
DDSCAPS ddscaps;
HRESULT ddrval; // result back from dd calls
BITMAP_FILE bitmap; // holds the bitmap
int gheight = -1 ;
int DDraw_Fill_Surface(LPDIRECTDRAWSURFACE4 lpdds, int color)
{
DDBLTFX ddbltfx; //contains DDBLTFX struct
//clear and set size
DDRAW_INIT_STRUCT(ddbltfx);
ddbltfx.dwFillColor = _RGB16BIT565(0,0,0);
lpdds->Blt(NULL,
NULL,
NULL,
DDBLT_COLORFILL | DDBLT_WAIT,
&ddbltfx); //ptr to DDBLTFX structure
//return success
return(1);
} //end of DDraw FILL SURFACE
///////////////////////////////////////////////////////////////
int DDraw_Draw_Surface(LPDIRECTDRAWSURFACE4 source,
int x, int y,
int width, int height,
LPDIRECTDRAWSURFACE4 dest,
int transparent = 1)
source_rect;
// fill in the dest rect
dest_rect.left = x;
dest_rect.top = y;
dest_rect.right = 800; //width - 1;
dest_rect.bottom = 600; //y+height - 1;
source_rect.left = 0;
source_rect.top = 0;
source_rect.right = 800; //width - 1;
source_rect.bottom = 600; //y+height -1;
{
//enable color key blt
//blt to dest surface
if (FAILED(dest->Blt(&dest_rect, source,
&source_rect,(DDBLT_WAIT | DDBLT_KEYSRC),
NULL)))
return(0);
} //end if
else
{
if (FAILED(dest->Blt(&dest_rect, source,
&source_rect,(DDBLT_WAIT),
NULL)))
return(0);
} //end if
return(1);
///////////////////////////////////////////////////////////////////
LPDIRECTDRAWSURFACE4 lpdds, // surface to hold data
int cx, int cy) // cell to scan image from
{
// this function extracts a bitmap out of a bitmap file
*dest_ptr;
ddsd.dwSize = sizeof(ddsd);
lpdds->Lock(NULL,
&ddsd,
DDLOCK_WAIT | DDLOCK_SURFACEMEMORYPTR,
NULL);
cx = cx*(ddsd.dwWidth+1) + 1;
cy = cy*(ddsd.dwHeight+1) + 1;
gheight = ddsd.dwHeight;
source_ptr = bitmap->buffer + cy*bitmap->bitmapinfoheader.biWidth+cx;
dest_ptr = (UCHAR *)ddsd.lpSurface;
for (int index_y=0; index_y < ddsd.dwHeight; index_y++)
{
// copy next line of data to destination
memcpy(dest_ptr, source_ptr, ddsd.dwWidth);
dest_ptr += (ddsd.dwWidth);
source_ptr += bitmap->bitmapinfoheader.biWidth;
} // end for index_y
lpdds->Unlock(NULL);
return(1);
{
// this function creates an offscreen plain surface
LPDIRECTDRAWSURFACE4 lpdds; // temporary surface
// set to access caps, width, and height
memset(&ddsd,0,sizeof(ddsd));
ddsd.dwSize = sizeof(ddsd);
ddsd.dwFlags = DDSD_CAPS| DDSD_WIDTH | DDSD_HEIGHT;
ddsd.dwWidth = 800; //width;
ddsd.dwHeight = 600; //height;
ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | mem_flags;
if (FAILED(lpdd->CreateSurface(&ddsd,&lpdds,NULL)))
return(NULL);
if (color_key >= 0)
{
DDCOLORKEY color_key; // used to set color key
color_key.dwColorSpaceLowValue = _RGB16BIT565(0,0,0); //pure green
color_key.dwColorSpaceHighValue = _RGB16BIT565(0,0,0);
lpdds->SetColorKey(DDCKEY_SRCBLT, &color_key);
} // end if
return(lpdds);
} // end DDraw_Create_Surface
///////////////////////////////////////////////////////////////
{
////Hide the Cursor
ShowCursor(FALSE);
Sleep(1000);
// make sure this isn't executed again
if (window_closed)
return(0);
if (KEYDOWN(VK_ESCAPE))
{
PostMessage(main_window_handle,WM_CLOSE,0,0);
window_closed = 1;
} // end if
Load_Bitmap_File(&bitmap,"BITMAP24.bmp");
{
Sleep(5);
DDRAW_INIT_STRUCT(ddsd);
// alias pointer to back buffer surface
USHORT *back_buffer = (USHORT *)ddsd.lpSurface;
// process each line and copy it into the secondary 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, note the scaling down of the channels, so that they
// fit into the 5.6.5 format
USHORT blue = (bitmap.buffer[index_y*SCREEN_WIDTH*3 + index_x*3 + 0]) >> 3,
green = (bitmap.buffer[index_y*SCREEN_WIDTH*3 + index_x*3 + 1]) >> 3,
red = (bitmap.buffer[index_y*SCREEN_WIDTH*3 + index_x*3 + 2]) >> 3;
// this builds a 16 bit color value in 5.6.5 format (green dominant mode)
if ((red - fade) > 0 )
red = red - fade;
else
red = 0;
if ((green - fade) > 0)
green = green - fade;
else
green = 0;
blue = blue - fade;
else
blue = 0;
USHORT pixel = _RGB16BIT565(red, green, blue);
back_buffer[index_x + (index_y*ddsd.lPitch >> 1)] = pixel;
if (FAILED(lpddsback->Unlock(NULL)))
return(0);
while (FAILED(lpddsprimary->Flip(NULL, DDFLIP_WAIT)));
if (fade == 0)
Sleep(3000);
for (fade = 0; fade <= 32; fade++)
{
Sleep(5);
DDRAW_INIT_STRUCT(ddsd);
// alias pointer to back buffer surface
USHORT *back_buffer = (USHORT *)ddsd.lpSurface;
// process each line and copy it into the secondary 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, note the scaling down of the channels, so that they
// fit into the 5.6.5 format
USHORT blue = (bitmap.buffer[index_y*SCREEN_WIDTH*3 + index_x*3 + 0]) >> 3,
green = (bitmap.buffer[index_y*SCREEN_WIDTH*3 + index_x*3 + 1]) >> 3,
red = (bitmap.buffer[index_y*SCREEN_WIDTH*3 + index_x*3 + 2]) >> 3;
// this builds a 16 bit color value in 5.6.5 format (green dominant mode)
if ((red - fade) > 0 )
red = red - fade;
else
red = 0;
if ((green - fade) > 0)
green = green - fade;
else
green = 0;
blue = blue - fade;
else
blue = 0;
USHORT pixel = _RGB16BIT565(red, green, blue);
// write the pixel
back_buffer[index_x + (index_y*ddsd.lPitch >> 1)] = pixel;
if (FAILED(lpddsback->Unlock(NULL)))
return(0);
while (FAILED(lpddsprimary->Flip(NULL, DDFLIP_WAIT)));
} /////End of Fade out FOR
// unload the bitmap file, we no longer need it
Unload_Bitmap_File(&bitmap);
return(1);
} ////END of Intro
{
// this function opens a bitmap file and loads the data into bitmap
OFSTRUCT file_data; // the file data information
if ((file_handle = OpenFile(filename,&file_data,OF_READ))==-1)
return(0);
_lread(file_handle, &bitmap->bitmapfileheader,sizeof(BITMAPFILEHEADER));
if (bitmap->bitmapfileheader.bfType!=BITMAP_ID)
{
// close the file
_lclose(file_handle);
return(0);
} // end if
_lread(file_handle, &bitmap->bitmapinfoheader,sizeof(BITMAPINFOHEADER));
_lseek(file_handle,-(int)(bitmap->bitmapinfoheader.biSizeImage),SEEK_END);
// but if its 24 bit then read it into a temporary area and then convert
// it to a 16 bit image
bitmap->bitmapinfoheader.biBitCount==24)
{
// delete the last image if there was one
if (bitmap->buffer)
free(bitmap->buffer);
if (!(bitmap->buffer = (UCHAR *)malloc(bitmap->bitmapinfoheader.biSizeImage)))
{
// close the file
_lclose(file_handle);
return(0);
} // end if
_lread(file_handle,bitmap->buffer,bitmap->bitmapinfoheader.biSizeImage);
else
{
// serious problem
return(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
_lclose(file_handle);
Flip_Bitmap(bitmap->buffer,
bitmap->bitmapinfoheader.biWidth*(bitmap->bitmapinfoheader.biBitCount/8),
bitmap->bitmapinfoheader.biHeight);
return(1);
{
// this function releases all memory associated with "bitmap"
if (bitmap->buffer)
{
// release memory
free(bitmap->buffer);
bitmap->buffer = NULL;
return(1);
{
// this function is used to flip bottom-up .BMP images
int index; // looping index
if (!(buffer = (UCHAR *)malloc(bytes_per_line*height)))
return(0);
memcpy(buffer,image,bytes_per_line*height);
for (index=0; index < height; index++)
memcpy(ℑ[((height-1) - index)*bytes_per_line],
&buffer[index*bytes_per_line], bytes_per_line);
free(buffer);
return(1);
LRESULT CALLBACK WindowProc(HWND hwnd,
UINT msg,
WPARAM wparam,
LPARAM lparam)
{
// this is the main message handler of the system
PAINTSTRUCT ps; // used in WM_PAINT
HDC hdc; // handle to a device context
char buffer[80]; // used to print strings
switch(msg)
{
case WM_CREATE:
{
// do initialization stuff here
// return success
return(0);
} break;
case WM_PAINT:
{
// simply validate the window
hdc = BeginPaint(hwnd,&ps);
// end painting
EndPaint(hwnd,&ps);
return(0);
} break;
{
PostQuitMessage(0);
return(0);
} break;
return (DefWindowProc(hwnd, msg, wparam, lparam));
{
static int animation_seq[4] = {0,1,0,2};
if (window_closed)
return(0);
if (KEYDOWN(VK_ESCAPE))
{
PostMessage(main_window_handle,WM_CLOSE,0,0);
window_closed = 1;
} // end if
// copy background to the back buffer
DDraw_Draw_Surface(lpddsbackground,0,0, SCREEN_WIDTH,SCREEN_HEIGHT,lpddsback,0);
// move knight around
//for (index=0; index < 3; index++)
// {
// draw objects
// DDraw_Draw_Surface(knight[index].frames[animation_seq[knight[index].current_frame]],
// knight[index].x, knight[index].y,
// 72,80,
// lpddsback);
// flip pages
while (FAILED(lpddsprimary->Flip(NULL, DDFLIP_WAIT)));
} // end Game_Main
{
// this is called once after the initial window is created and
// before the main event loop is entered, do all your initialization
// here
LPDIRECTDRAW lpdd_temp;
if (FAILED(DirectDrawCreate(NULL, &lpdd_temp, NULL)))
return(0);
if (FAILED(lpdd_temp->QueryInterface(IID_IDirectDraw4,
(LPVOID *)&lpdd)))
return(0);
if (FAILED(lpdd->SetCooperativeLevel(main_window_handle,
DDSCL_FULLSCREEN | DDSCL_ALLOWMODEX |
DDSCL_EXCLUSIVE | DDSCL_ALLOWREBOOT)))
return(0);
if (FAILED(lpdd->SetDisplayMode(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BPP,0,0)))
return(0);
DDRAW_INIT_STRUCT(ddsd);
ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
ddsd.dwBackBufferCount = 1;
ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | DDSCAPS_COMPLEX | DDSCAPS_FLIP;
if (FAILED(lpdd->CreateSurface(&ddsd, &lpddsprimary, NULL)))
return(0);
// this line is needed by the call
ddsd.ddsCaps.dwCaps = DDSCAPS_BACKBUFFER;
// get the attached back buffer surface
if (FAILED(lpddsprimary->GetAttachedSurface(&ddsd.ddsCaps, &lpddsback)))
return(0);
// load the 16-bit image
if (!Load_Bitmap_File(&bitmap,"haha.bmp"))
return(0);
DDraw_Fill_Surface(lpddsprimary,0);
DDraw_Fill_Surface(lpddsback,0);
lpddsbackground = DDraw_Create_Surface(800,600,0,-1);
// lock the surface
lpddsbackground->Lock(NULL,&ddsd, DDLOCK_SURFACEMEMORYPTR | DDLOCK_WAIT,NULL);
UCHAR *image_buffer = (UCHAR *)ddsd.lpSurface;
// test if memory is linear
if (ddsd.lPitch == SCREEN_WIDTH)
{
// copy memory from double buffer to primary buffer
memcpy((void *)image_buffer, (void *)bitmap.buffer, SCREEN_WIDTH*SCREEN_HEIGHT);
} // end if
else
{ // non-linear
UCHAR *dest_ptr = image_buffer;
UCHAR *src_ptr = bitmap.buffer;
for (int y=0; y < SCREEN_HEIGHT; y++)
{
// copy line
memcpy((void *)dest_ptr, (void *)src_ptr, SCREEN_WIDTH);
dest_ptr+=ddsd.lPitch;
src_ptr +=SCREEN_WIDTH;
} // end for
// copy memory from double buffer to primary buffer
memcpy((void *)image_buffer, (void *)bitmap.buffer, SCREEN_WIDTH*SCREEN_HEIGHT);
// now unlock the background surface
if (FAILED(lpddsbackground->Unlock(NULL)))
return(0);
Unload_Bitmap_File(&bitmap);
//knight[0].x = 100;
//knight[0].y = 200;
//knight[0].current_frame = 0;
//knight[0].counter = 0;
// load the 8-bit image
//if (!Load_Bitmap_File(&bitmap,"knight.bmp"))
// return(0);
//for (int index = 0; index < 3; index++)
// {
// create surface to hold image
// knight[0].frames[index] = DDraw_Create_Surface(72,80,0);
// Scan_Image_Bitmap(&bitmap, // bitmap file to scan image data from
// knight[0].frames[index], // surface to hold data
// index, 0); // cell to scan image from
// } //end for
// return success or failure or your own return code here
//Unload_Bitmap_File(&bitmap);
return(1);
{
// this is called after the game is exited and the main event
// loop while is exited, do all you cleanup and shutdown here
// now the back buffer surface
if (lpddsback)
{
lpddsback->Release();
lpddsback = NULL;
} // end if
if (lpddsprimary)
{
lpddsprimary->Release();
lpddsprimary = NULL;
} // end if
if (lpdd)
{
lpdd->Release();
lpdd = NULL;
} // end if
return(1);
HINSTANCE hprevinstance,
LPSTR lpcmdline,
int ncmdshow)
{
HWND hwnd; // generic window handle
MSG msg; // generic message
HDC hdc; // graphics device context
winclass.cbSize = sizeof(WNDCLASSEX);
winclass.style = CS_DBLCLKS | CS_OWNDC |
CS_HREDRAW | CS_VREDRAW;
winclass.lpfnWndProc = WindowProc;
winclass.cbClsExtra = 0;
winclass.cbWndExtra = 0;
winclass.hInstance = hinstance;
winclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
winclass.hCursor = LoadCursor(NULL, IDC_ARROW);
winclass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
winclass.lpszMenuName = NULL;
winclass.lpszClassName = WINDOW_CLASS_NAME;
winclass.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
hinstance_app = hinstance;
if (!RegisterClassEx(&winclass))
return(0);
if (!(hwnd = CreateWindowEx(NULL, // extended style
WINDOW_CLASS_NAME, // class
"DirectDraw Page Flipping Demo", // title
WS_POPUP | WS_VISIBLE,
0,0, // initial x,y
SCREEN_WIDTH,SCREEN_HEIGHT, // initial width, height
NULL, // handle to parent
NULL, // handle to menu
hinstance,// instance of this application
NULL))) // extra creation parms
return(0);
main_window_handle = hwnd;
Game_Init();
Sleep(100);
Intro_Screen();
while(TRUE)
{
// test if there is a message in queue, if so get it
if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
// test if this is a quit
if (msg.message == WM_QUIT)
break;
// translate any accelerator keys
TranslateMessage(&msg);
DispatchMessage(&msg);
} // end if
// main game processing goes here
Game_Main();
} // end while
Game_Shutdown();
return(msg.wParam);