回 帖 发 新 帖 刷新版面

主题:关于DirectDraw 中实现动画的问题..诚心求解答,慷慨送分数,谢谢~~~~

小弟刚学DirectDraw ,在写一个小型游戏 ,目前遇到以下问题:
 我使用换页技术来实现动画的话,是不是每次要切换到下一帧,就必须调用一次lpDDSprimary->Flip() ???
在填写下一帧画面时,是不是每次都往lpDDSback里Blt画面内容,然后Blt完一次就调用一次lpDDSprimary->Flip() ??不过这样好像不行啊,一旦Flip 屏幕就变成白色的了,并非如设想那样变成缓冲表面的内容啊??到底怎么回事?要实现动画又应该如何编写??
 冰天雪地跪求解答~~~

回复列表 (共2个回复)

沙发

双缓冲
一个主页面,一个后台缓冲页面
向缓冲去写东西,然后bilt到主页面,完成一桢
重复以上动作,形成动画

板凳


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步要在主循环里,即每帧画一次,否则就一闪而过了

我来回复

您尚未登录,请登录后再回复。点此登录或注册