首页
社区
课程
招聘
[旧帖] [求助]原书Windows游戏编程大师+获得像素格式 IdirectDrawSurface4::GetPixelFormat()用法 0.00雪花
发表于: 2010-10-5 15:46 1208

[旧帖] [求助]原书Windows游戏编程大师+获得像素格式 IdirectDrawSurface4::GetPixelFormat()用法 0.00雪花

2010-10-5 15:46
1208
Windows游戏编程大师技巧.pdf 学习—获得像素格式  IdirectDrawSurface4::GetPixelFormat()
最近学习Windows游戏编程大师技巧.pdf,获得像素格式部分,代码是书中原有的(模板也是书上的),P259页,我加了个message(),目的是能弹出消息,看到底是 什么像素格式
请教 !哪位高手 ,能帮看看,以下代码编译通过,但就是一运行就出现如图画面,百思不得其解,在此 先谢过了 ,(编译环境: XPsp2+VC6.0编译通过)

代码如下:
// DEMO7_1.CPP basic full-screen 16-bit color pixel plotting DirectDraw demo

// INCLUDES ///////////////////////////////////////////////

#define WIN32_LEAN_AND_MEAN  // just say no to MFC

#define INITGUID

#include <windows.h>   // include important windows stuff
#include <windowsx.h>
#include <mmsystem.h>
#include <iostream.h> // include important C/C++ stuff
#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>

#include <ddraw.h> // include directdraw

// DEFINES ////////////////////////////////////////////////

// defines for windows
#define WINDOW_CLASS_NAME "WINCLASS1"

// default screen size
#define SCREEN_WIDTH    640  // size of screen
#define SCREEN_HEIGHT   480
#define SCREEN_BPP      16    // bits per pixel

// TYPES //////////////////////////////////////////////////////

// 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)

// 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))

// initializes a direct draw struct
#define DDRAW_INIT_STRUCT(ddstruct) { memset(&ddstruct,0,sizeof(ddstruct)); ddstruct.dwSize=sizeof(ddstruct); }

// GLOBALS ////////////////////////////////////////////////
HWND      main_window_handle = NULL; // globally track main window
HINSTANCE hinstance_app      = NULL; // globally track hinstance

// directdraw stuff

LPDIRECTDRAW7         lpdd         = NULL;   // dd object
LPDIRECTDRAWSURFACE7  lpddsprimary = NULL;   // dd primary surface
LPDIRECTDRAWSURFACE7  lpddsback    = NULL;   // dd back surface
LPDIRECTDRAWPALETTE   lpddpal      = NULL;   // a pointer to the created dd palette
LPDIRECTDRAWCLIPPER   lpddclipper  = NULL;   // dd clipper
PALETTEENTRY          palette[256];          // color palette
PALETTEENTRY          save_palette[256];     // used to save palettes
DDSURFACEDESC2        ddsd;                  // a direct draw surface description struct
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

//char buffer[80];                     // general printing buffer

// FUNCTIONS //////////////////////////////////////////////

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

// what is the message
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 success
                return(0);
                   } break;

        case WM_DESTROY:
                {

                // kill the application, this sends a WM_QUIT message
                PostQuitMessage(0);

        // return success
                return(0);
                } break;

        default:break;

    } // end switch

// process any messages that we didn't take care of
return (DefWindowProc(hwnd, msg, wparam, lparam));

} // end WinProc

///////////////////////////////////////////////////////////

inline void Plot_Pixel_Faster16(int x, int y,
                                int red, int green, int blue,
                                USHORT *video_buffer, int lpitch16)
{
// this function plots a pixel in 16-bit color mode
// assuming that the caller already locked the surface
// and is sending a pointer and byte pitch to it

// first build up color WORD
USHORT pixel = _RGB16BIT565(red,green,blue);

// write the data
video_buffer[x + y*lpitch16] = pixel;

} // end Plot_Pixel_Faster16

////////////////////////////////////////////////////////////

int Game_Main(void *parms = NULL, int num_parms = 0)
{
// this is the main loop of the game, do all your processing
// here

// for now test if user is hitting ESC and send WM_CLOSE
if (KEYDOWN(VK_ESCAPE))
   SendMessage(main_window_handle,WM_CLOSE,0,0);

// plot 1000 random pixels to the primary surface and return
// clear ddsd and set size, never assume it's clean
DDRAW_INIT_STRUCT(ddsd);

// lock the primary surface
if (FAILED(lpddsprimary->Lock(NULL, &ddsd,
                   DDLOCK_SURFACEMEMORYPTR | DDLOCK_WAIT,
                   NULL)))
   return(0);

// now ddsd.lPitch is valid and so is ddsd.lpSurface

// make a couple aliases to make code cleaner, so we don't
// have to cast
int lpitch16 = (int)(ddsd.lPitch >> 1);
USHORT *video_buffer = (USHORT *)ddsd.lpSurface;

// plot 1000 random pixels with random colors on the
// primary surface, they will be instantly visible
for (int index=0; index < 1000; index++)
    {
    // select random position and color for 640x480x16
    int red   = rand()%256;
    int green = rand()%256;
    int blue  = rand()%256;
    int x = rand()%640;
    int y = rand()%480;

    // plot the pixel
    Plot_Pixel_Faster16(x,y,red,green,blue,video_buffer,lpitch16);      

    } // end for index

// now unlock the primary surface
if (FAILED(lpddsprimary->Unlock(NULL)))
   return(0);

// 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)
{
LPDIRECTDRAWSURFACE4  lpdds_primary = NULL; //assume this valid

DDPIXELFORMAT ddpixel;

//clear our structure
memset( &ddpixel, 0, sizeof(ddpixel));

//set length
ddpixel. dwSize = sizeof(ddpixel);

lpdds_primary -> GetPixelFormat(&ddpixel);

//now perform tests
//check if this is an RGB mode or palettized
if( ddpixel. dwFlags &DDPF_RGB)
{
        //RGB mode
        //what's the RGB mode
switch(ddpixel.dwRGBBitCount)
        {
        case 15: //must be 5.5.5. mode
                {
                //use the _RGB16BIT555(r,g,b) macro
                MessageBox(NULL, TEXT("The Pixel Format is  _RGB16BIT555(r,g,b)"),
                                    TEXT("Hello,windows 98!"),MB_OK) ;
   
                }break;
        case 16: //must be 5.6.5. mode
                {
                //use the _RGB16BIT565(r,g,b) macro
                MessageBox(NULL, TEXT("The Pixel Format is  _RGB16BIT565(r,g,b)"),
                                    TEXT("Hello,windows 98!"),MB_OK) ;                       
                }break;
        case 24: //must be 8.8.8. mode
                {
                MessageBox(NULL, TEXT("The Pixel Format is  8.8.8. "),
                                    TEXT("Hello,windows 98!"),MB_OK) ;
                }break;
        case 32: //must be alpha(8).8.8.8 mode
                {
                MessageBox(NULL, TEXT("The Pixel Format is  alpha(8).8.8.8 "),
                                    TEXT("Hello,windows 98!"),MB_OK) ;
                }break;

        default: break;

        }//end switch

} //end if
else
if(ddpixel.dwFlags & DDPF_PALETTEINDEXED8)
{
        //256 color palettized mode
} //end if
else
{
        //something else??? mode tests
} //end else
return 1;
} // end Game_Init

/////////////////////////////////////////////////////////////

int Game_Shutdown(void *parms = NULL, int num_parms = 0)
{
// 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 primary surface
if (lpddsprimary)
   {
   lpddsprimary->Release();
   lpddsprimary = NULL;
   } // end if

// now blow away the IDirectDraw4 interface
if (lpdd)
   {
   lpdd->Release();
   lpdd = NULL;
   } // end if

// return success or failure or your own return code here
return(1);

} // end Game_Shutdown

// WINMAIN ////////////////////////////////////////////////

int WINAPI WinMain(        HINSTANCE hinstance,
                                        HINSTANCE hprevinstance,
                                        LPSTR lpcmdline,
                                        int ncmdshow)
{

WNDCLASSEX winclass; // this will hold the class we create
HWND           hwnd;         // generic window handle
MSG                   msg;                 // generic message
//HDC        hdc;      // graphics device context

// first fill in the window class stucture
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);

// save hinstance in global
hinstance_app = hinstance;

// register the window class
if (!RegisterClassEx(&winclass))
        return(0);

// create the window
if (!(hwnd = CreateWindowEx(NULL,                  // extended style
                            WINDOW_CLASS_NAME,     // class
                                                    "DirectDraw 16-Bit Full-Screen Demo", // title
                                                    WS_OVERLAPPEDWINDOW | WS_VISIBLE,
                                                     0,0,          // initial x,y
                                                    400,300,  // initial width, height  // initial width, height
                                                    NULL,          // handle to parent
                                                    NULL,          // handle to menu
                                                    hinstance,// instance of this application
                                                    NULL)))        // extra creation parms
return(0);

// save main window handle
main_window_handle = hwnd;

// initialize game here
Game_Init(hwnd);

// enter main event loop
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);

           // send the message to the window proc
           DispatchMessage(&msg);
           } // end if
   
       // main game processing goes here
       Game_Main();
      
        } // end while

// closedown game here
Game_Shutdown();

// return to Windows like this
return(msg.wParam);

} // end WinMain

///////////////////////////////////////////////////////////

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 0
支持
分享
最新回复 (1)
雪    币: 112
活跃值: (51)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
下来看看。。随便学习一下。,
2010-10-5 17:11
0
游客
登录 | 注册 方可回帖
返回
//