程序与技术分享: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="

相关文章
|
2月前
|
存储 运维 安全
隐语第二期学习内容随笔
数据要素在采集、存储等环节内外循环,数据持有方需确保内外循环中的数据安全与管控。信任焦虑源于数据权属等问题,依赖技术信任解决。隐私计算原则与开源隐语技术保障隐私安全。数据资产化驱动价值释放,技术信任促进流通,强调数据安全、隐私和信任的核心地位。
24 0
|
5天前
|
前端开发 JavaScript IDE
程序与技术分享:createjs入门
程序与技术分享:createjs入门
|
5天前
|
存储 缓存 监控
程序与技术分享:CacheAlgorithm
程序与技术分享:CacheAlgorithm
|
5天前
|
前端开发 Java 数据库连接
程序与技术分享:CleanBlog(个人博客+源码)
程序与技术分享:CleanBlog(个人博客+源码)
|
5天前
|
移动开发 JavaScript 前端开发
程序与技术分享:AppCan入门教程
程序与技术分享:AppCan入门教程
|
2月前
|
存储 算法 C语言
【C 言专栏】用 C 语言开发游戏的实践
【5月更文挑战第5天】本文探讨了使用C语言开发游戏的实践,包括选择适合的游戏类型(如贪吃蛇、俄罗斯方块),设计游戏框架、图形界面和逻辑,以及音效添加。文章还强调了性能优化、测试调试、跨平台挑战及未来发展趋势。对于热衷于C语言的开发者,这是一次挑战与乐趣并存的探索之旅。
【C 言专栏】用 C 语言开发游戏的实践
|
2月前
|
算法 搜索推荐
太厉害了!腾讯T4大牛把《数据结构与算法》讲透了,带源码笔记
经历过校招的人都知道,算法和数据结构都是不可避免的。 在笔试的时候,最主要的就是靠算法题。像拼多多、头条这种大公司,上来就来几道算法题,如果你没AC出来,面试机会都没有。
|
11月前
|
前端开发 程序员 数据库
程序员需要知道的50个网址,包括编程社区、开发工具、技术博客、在线课程等。
以下是 50 个程序员必须要知道的网站: 1. Codecademy(www.codecademy.com):在线编程学习平台,提供多种编程语言的入门课程。 2. Khan Academy(www.khanacademy.org):非营利性在线学习平台,提供有关计算机科学和编程的免费课程。 3. Udemy(www.udemy.com):在线教育平台,提供大量编程课程,包括入门课程和进阶课程。 4. Coursera(www.coursera.org):在线教育平台,提供全球顶尖大学和机构的编程课程。 5. edX(www.edx.org):在线教育平台,提供全球顶尖大学和机构的编程课程。 6
|
10月前
|
消息中间件 NoSQL Java
硬核!阿里P8自爆春招面试核心手册,Github上获赞65.7K
春节过后紧接着就是跳槽黄金期“金三银四”,现在Java面试已经是快被谈烂的话题了。随着近些年面试要求不断的提高,面试真题、面试总结、面试笔记......各种Java面试八股文一搜一大把,根本背不完,甚至是收藏=学会。但是总有程序员在错误地学习着,一边收藏一边抱怨着程序员是个枯燥无味的行业!
|
前端开发
如何写好一篇技术分享文章
如何写好一篇技术分享文章
299 0