网站导航免费论文 原创论文 论文搜索 原创论文 网学软件 学术大家 资料中心 会员中心 问题解答 原创论文 论文素材 设计下载 最新论文 下载排行 论文上传 在线投稿 联系我们
返回网学首页
网学联系
最新论文 推荐专题 热门论文 素材专题
当前位置: 网学 > 编程文档 > VC++ > 正文
使用标准GDI实现游戏品质的动画系统
来源:Http://myeducs.cn 联系QQ:点击这里给我发消息 作者: 用户投稿 来源: 网络 发布时间: 12/10/15
下载{$ArticleTitle}原创论文样式
::IsWindow(pchild->GetSafeHwnd());
pchild->Render(&memdc);
}
这是一个典型的虚函数的应用,在调用这些子窗口的Render函数时,我们不需要知道它到底是Button还是TextBox,虚函数机制会自动帮我们找到该调用的函数。还有一点就是,请注意,一定要把子窗口渲染到我们的后台缓冲,也就是Memory DC中,否则还是会闪烁的。
上面这种方法适合于子窗口数目固定,更高级的界面会要求触发某个事件的时候产生一个子窗口,子窗口不断更新自己,并且在适当的时候把自己从UI系统中去除。让每个子窗口管理自己的生命期,是个不错的主意,不是吗?那你最好不要使用上面保存指针数组的方法,那样的话,子窗口在杀死自己的时候还要通知父窗口,以让父窗口把它的指针从数组中移除,这显然具有很高的偶合性,不是我们想要的。因为我们的所有子窗口都是标准的Windows对象,所以这使得我们有使用Windows消息的机会。我们首先要枚举所有子窗口,然后发一个自定义的更新消息给它,并把我们的MemoryDC的指针作为参数,具体例子代码如下:
void CMyView::RenderView()
{
…//其它更新操作
::EnumChildWindows(GetSafeHwnd(),CMyView::UpdateChildWnd,LPARAM(&memdc));
…//其它更新操作
}
其中第二个参数是一个回调函数,你必须把它声明成全局函数,或者类的static成员函数,这里我们使用了后者。
BOOL CALLBACK CMyWnd::UpdateChildWnd(HWND hwnd, LPARAM lParam/*CDC* */)
{
::SendMessage(hwnd,WM_COMMAND,CHILDCMD_RENDER,lParam);
return TRUE;
}
这里我没有使用自定义消息,而是发送标准的WM_COMMAND,这样你可以给那个CmyAniWnd虚基类添加一个CWnd虚函数OnCommand(),然后在那里面检测如果wParam是CHILDCMD_RENDER的话,就调用纯虚函数Render(以lParam作为参数),子窗口派生类只要实现自己的Render函数就好,其它不用管了。
这里还有一个要注意的问题就是绘制的顺序问题,如果你想让子窗口盖住某些动画,就应该先渲染那些动画,然后渲染子窗口,反之亦反。
进阶技巧--使用DIB
像素操作
以上所有操作都局限于标准GDI函数,如果我们要实现更进一步的操作,例如当傍晚你希望把整个画面的颜色渲染能淡红色调,晚上的时候你要把整个画面变暗,早上再把它恢复到原来的亮度这些GDI都无法帮你做到。 如果想达到上述效果,就必须自己对像素的RGB值进行操作。
首先让我们要得到一个Bitmap对象中的像素数据。让我们看一下具体该怎么操作。假设我们有一个mybmp是一个CBitmap对象(或者其派生类对象),下面的代码把CBitmap中的像素取出:
BITMAP bm;
mybmp.GetBitmap(&bm);
BITMAPINFO binfo;
ZeroMemory(&binfo,sizeof(BITMAPINFO));
binfo.bmiHeader.biBitCount=24; file://24bit像素格式
binfo.bmiHeader.biCompression=0;
binfo.bmiHeader.biHeight=-bm.bmHeight;
binfo.bmiHeader.biPlanes=1;
binfo.bmiHeader.biSizeImage=0;
binfo.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
binfo.bmiHeader.biWidth=bm.bmWidth;

CClientDC dc(this);
BYTE *pbuf;//用来存储像素数据
int linebytes=(bm.bmWidth*3+3)&(~3);//4字节对齐
int size=linebytes*bm.bmHeight;
pbuf=new BYTE[size];
::GetDIBits(dc,m_bmpSword,0,bm.bmHeight,pbuf,&binfo,DIB_RGB_COLORS);上面代码执行后,我们的pbuf中就存储了从mybmp拷贝而来的像素数据,而且是24bit模式的,这样你就可以对所有这些像素进行你所需要的操作了,例如晚上了,你想把这个Bitmap变暗,我这里粗略的把每个像素的RGB值都降低一半,可以使用下面的循环:
for(int I;I<size;I++)
  pbuf[i]=pbuf[i]/2;
得到了像素你就得到了一切,所有操作你都可以进行,例如上面提到的标准GDI不支持的Alpha通

网学推荐

免费论文

原创论文

浏览:
设为首页 | 加入收藏 | 论文首页 | 论文专题 | 设计下载 | 网学软件 | 论文模板 | 论文资源 | 程序设计 | 关于网学 | 站内搜索 | 网学留言 | 友情链接 | 资料中心
版权所有 QQ:3710167 邮箱:3710167@qq.com 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
Copyright 2008-2015 myeducs.Cn www.myeducs.Cn All Rights Reserved
湘ICP备09003080号