程序与技术分享:DDraw笔记

简介: 程序与技术分享:DDraw笔记

高彩模式


除了8位的,还有16位、24位、32位等。高于8位的模式都不再采用调色板模式。下面介绍几种编码模式。


16位模式下有几种编码方案


Alpha.5.5.5:这种模式用D15位存储一个Alpha(透明度),其余15位均匀分配给红色5位,绿色5位,蓝色5位。


X5.5.5:与Alpha.5.5.5类似,只是最高位没有使用。


5.6.5:这个是16色彩最常用的模式。5位分配给红,6位分配给绿,5位分配给蓝


下面是构造他们的宏:


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


源代码下载


// -------------------------------------------------------------------------


// 文件名 : 7_1.cpp


// 创建者 : 方煜宽


// 邮箱 : fangyukuan@gmail.com


// 创建时间 : 2010-12-9 0:52


// 功能描述 : 16位模式,RGB565


// 对于像素位深度大于8的页面,不需要使用调色板


// -------------------------------------------------------------------------


#define INITGUID


#include[/span>windows.h

#include [/span>ddraw.h

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);


HWND main_window_handle = NULL; // 全局的windows窗口句柄


LPDIRECTDRAW7 lpdd = NULL; // ddraw 接口指针


DDSURFACEDESC2 ddsd; // ddraw 显示表面 描述结构


LPDIRECTDRAWSURFACE7 lpddsprimary = NULL; // ddraw 主显示表面


LPDIRECTDRAWSURFACE7 lpddsback = NULL; // ddraw 从显示表面


#define SCREEN_WIDTH 640 // 屏幕宽


#define SCREEN_HEIGHT 480 // 屏幕高


#define SCREEN_BPP 16 // 深度


#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 & 31) + ((g & 63) [ 5) + ((r & 31) [ 11))


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


#define KEYDOWN(vk_code) ((::GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0)


#define KEYUP(vk_code) ((::GetAsyncKeyState(vk_code) & 0x8000) ? 0 : 1)


/


每个像素16位,用此函数前先锁住表面。


/


inline void Plot_Pixel_Faster16(int x, int y,


int red, int green, int blue,


USHORT video_buffer, int lpitch16)


{


USHORT pixel = _RGB16BIT565(red,green,blue);


video_buffer【x + ylpitch16】 = pixel;


}


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(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;


memset(&ddsd,0,sizeof(ddsd));


ddsd.dwSize = sizeof(ddsd);


ddsd.dwFlags = DDSD_CAPS;


ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;


if (FAILED(lpdd->CreateSurface(&ddsd, &lpddsprimary, NULL)))


return 0;


// 不需要调色板了


// 对于像素位深度大于8的页面,不需要使用调色板


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 Game_Main(void parms = NULL, int num_parms = 0)


{


if (KEYDOWN(VK_ESCAPE))


SendMessage(main_window_handle, WM_CLOSE, 0, 0);


DDRAW_INIT_STRUCT(ddsd);


if (FAILED(lpddsprimary->Lock(NULL, &ddsd,


DDLOCK_SURFACEMEMORYPTR | DDLOCK_WAIT,


NULL)))


return 0;


int lpitch16 = (int)(ddsd.lPitch 1);


USHORT video_buffer = (USHORT *)ddsd.lpSurface;


for (int index=0; index [/span> 1000; index++)


{


int red = rand() % 256;


int green = rand() % 256;


int blue = rand() % 256;


int x = rand() % 640;


int y = rand() % 480;


Plot_Pixel_Faster16(x, y, red, green, blue, video_buffer, lpitch16);


}


if (FAILED(lpddsprimary->Unlock(NULL)))


return 0;


return 1;


}


int WINAPI WinMain(HINSTANCE hInstance,


HINSTANCE hPrevInstance,


LPSTR lpCmdLine,


int nShowCmd)


{


HWND hwnd;


MSG msg;


TCHAR lpszClassName【】 = TEXT("kuan");


WNDCLASS wc;


wc.style = CS_HREDRAW //代码效果参考:http://hnjlyzjd.com/xl/wz_24183.html

| CS_VREDRAW;

wc.lpfnWndProc = WndProc;


wc.cbClsExtra = 0;


wc.cbWndExtra = 0;


wc.hInstance = hInstance;


wc.hIcon = ::LoadIcon(NULL,IDI_APPLICATION);


wc.hCursor = ::LoadCursor(NULL,IDC_ARROW);


wc.hbrBackground = (HBRUSH)::GetStockObject(BLACK_BRUSH);


wc.lpszMenuName = NULL;


wc.lpszClassName = lpszClassName;


RegisterClass(&wc);


hwnd = CreateWindow(lpszClassName,


TEXT("fangyukuan"),


WS_POPUP | WS_VISIBLE,


0,0,SCREEN_WIDTH,SCREEN_HEIGHT,


NULL,


NULL,


hInstance,


NULL);


main_window_handle = hwnd;


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;


}


LRESULT CALLBACK WndProc(HWND hwnd,


UINT message,


WPARAM wParam,


LPARAM lParam)


{


switch(message)


{


case WM_LBUTTONDOWN:


{


::MessageBeep(0);


}


break;


case WM_DESTROY:


::PostQuitMessage(0);


break;


default:


return ::DefWindowProc(hwnd,message,wParam,lParam);


}


return 0;


}


32位模式下有几种编码方案


Alpha(8).8.8.8:用8位表示透明信息。红色、绿色、蓝色,各有用8位。每个像素都用32位来表示,这是奔腾处理器最快的内存寻址方式。


X(8).8.8:最高8位没有使用。其它的跟Alpha(8).8.8.8一样。


下面是构造他们的宏:


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


<img src="

相关文章
|
6月前
|
前端开发 JavaScript IDE
程序与技术分享:createjs入门
程序与技术分享:createjs入门
51 0
|
6月前
|
存储 缓存 监控
程序与技术分享:CacheAlgorithm
程序与技术分享:CacheAlgorithm
42 0
|
6月前
|
前端开发 Java 数据库连接
程序与技术分享:CleanBlog(个人博客+源码)
程序与技术分享:CleanBlog(个人博客+源码)
34 0
|
7月前
|
存储 算法 C语言
【C 言专栏】用 C 语言开发游戏的实践
【5月更文挑战第5天】本文探讨了使用C语言开发游戏的实践,包括选择适合的游戏类型(如贪吃蛇、俄罗斯方块),设计游戏框架、图形界面和逻辑,以及音效添加。文章还强调了性能优化、测试调试、跨平台挑战及未来发展趋势。对于热衷于C语言的开发者,这是一次挑战与乐趣并存的探索之旅。
230 0
【C 言专栏】用 C 语言开发游戏的实践
|
7月前
|
算法 搜索推荐
太厉害了!腾讯T4大牛把《数据结构与算法》讲透了,带源码笔记
经历过校招的人都知道,算法和数据结构都是不可避免的。 在笔试的时候,最主要的就是靠算法题。像拼多多、头条这种大公司,上来就来几道算法题,如果你没AC出来,面试机会都没有。
|
前端开发 JavaScript API
❤️十分钟快速学会使用Nodejs全栈开发微信公众号【建议收藏】(三)
❤️十分钟快速学会使用Nodejs全栈开发微信公众号【建议收藏】
139 0
❤️十分钟快速学会使用Nodejs全栈开发微信公众号【建议收藏】(三)
|
小程序 开发者
微信小游戏开发基础系列教程开篇
做个游戏并不简单,或者其实比想象中的还要难,我想对于很多学习游戏开发的新手来讲都会这样觉得。即使是再简单的工具,甚至连代码都不需要写,但是用起来还是一个样,跟着教程一步一步的知道怎么做,脱离了教程就两眼一抹黑,无从下手。
118 0
|
JavaScript 小程序 API
❤️十分钟快速学会使用Nodejs全栈开发微信公众号【建议收藏】(一)
❤️十分钟快速学会使用Nodejs全栈开发微信公众号【建议收藏】
158 0
❤️十分钟快速学会使用Nodejs全栈开发微信公众号【建议收藏】(一)
|
JavaScript NoSQL 安全
❤️十分钟快速学会使用Nodejs全栈开发微信公众号【建议收藏】(二)
❤️十分钟快速学会使用Nodejs全栈开发微信公众号【建议收藏】
164 0
❤️十分钟快速学会使用Nodejs全栈开发微信公众号【建议收藏】(二)
|
JSON 开发工具 git
第一节课堂笔记|青训营笔记(二)
第一节课堂笔记|青训营笔记
第一节课堂笔记|青训营笔记(二)