主题:关于DirectDraw 中实现动画的问题..诚心求解答,慷慨送分数,谢谢~~~~
himurak
[专家分:0] 发布于 2006-09-14 00:41:00
小弟刚学DirectDraw ,在写一个小型游戏 ,目前遇到以下问题:
我使用换页技术来实现动画的话,是不是每次要切换到下一帧,就必须调用一次lpDDSprimary->Flip() ???
在填写下一帧画面时,是不是每次都往lpDDSback里Blt画面内容,然后Blt完一次就调用一次lpDDSprimary->Flip() ??不过这样好像不行啊,一旦Flip 屏幕就变成白色的了,并非如设想那样变成缓冲表面的内容啊??到底怎么回事?要实现动画又应该如何编写??
冰天雪地跪求解答~~~
回复列表 (共2个回复)
沙发
yjlh1234 [专家分:420] 发布于 2006-09-14 19:17:00
双缓冲
一个主页面,一个后台缓冲页面
向缓冲去写东西,然后bilt到主页面,完成一桢
重复以上动作,形成动画
板凳
iroii [专家分:40] 发布于 2006-09-15 07:31:00
1.创建面 (全屏)
if( FAILED( DirectDrawCreate( NULL, &lpdd, NULL ) ) )
{
ShowMsg( "无法正常初始化lpdd" );
return false;
}
if (FAILED( lpdd->SetCooperativeLevel( hwnd, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN | DDSCL_ALLOWREBOOT) ) )
{
ShowMsg( "无法正常初始化lpdd协作级" );
return false;
}
if( FAILED( lpdd->SetDisplayMode( WINWIDTH, WINHEIGHT, 16 ) ) )
{
ShowMsg( "设置SetDisplayMode()失败" );
return false;
}
DDInitStruct(ddsd);
ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE |DDSCAPS_FLIP | DDSCAPS_COMPLEX;
ddsd.dwBackBufferCount = 1;
if( FAILED( lpdd->CreateSurface( &ddsd, &lpdsprimary, NULL ) ) )
{
ShowMsg( "创建主显示面失败" );
return false;
}
ddsd.ddsCaps.dwCaps = DDSCAPS_BACKBUFFER;
if( FAILED( lpdsprimary->GetAttachedSurface( &ddsd.ddsCaps, &lpdsback)))
return false;
2 绘图
//先清后缓冲
DDBLTFX ddbfx;
DDInitStruct(ddbfx);
ddbfx.dwFillColor = 0;
lpddsback->Blt( NULL, NULL, NULL, DDBLT_COLORFILL, &ddbfx);
//然后加入自己的绘图函数
//...
3 翻页
略
注意后2步要在主循环里,即每帧画一次,否则就一闪而过了
我来回复