游戏开发论坛

 找回密码
 立即注册
搜索
查看: 4729|回复: 10

关于Flip()用法的问题

[复制链接]

1

主题

5

帖子

13

积分

新手上路

Rank: 1

积分
13
发表于 2004-4-11 12:26:00 | 显示全部楼层 |阅读模式
我想问关于Flip()用法的问题,这是我的代码:
pPSur->BltFast(0,0,pOPla,CRect(0,0,640,480),DDBLTFAST_WAIT);
pPSur->Flip( NULL , DDFLIP_WAIT );  //翻页
pBBuf->BltFast(0,0,pOPla,CRect(0,0,640,480),DDBLTFAST_WAIT);
pPSur->Flip( NULL , DDFLIP_WAIT );  //翻页
程序的结果:只能显示其中一张图,另一张为空白。不知是什么原因?

1万

主题

1万

帖子

2万

积分

管理员

中级会员

Rank: 9Rank: 9Rank: 9

积分
20527
发表于 2004-4-11 17:33:00 | 显示全部楼层

Re:关于Flip()用法的问题

你好像没有绘制到用来翻转的另外一个表面。

1

主题

5

帖子

13

积分

新手上路

Rank: 1

积分
13
 楼主| 发表于 2004-4-11 19:37:00 | 显示全部楼层

Re:关于Flip()用法的问题

谢谢站长的回答!
这是《vc游戏设计入门》里的程序。它本书的程序说可以实现的。
那请问一下应怎么样使用?

1

主题

5

帖子

13

积分

新手上路

Rank: 1

积分
13
 楼主| 发表于 2004-4-11 20:57:00 | 显示全部楼层

Re:关于Flip()用法的问题(附我的源程序)

LPDIRECTDRAW7              pDD7;  //声明DirectDraw对象
LPDIRECTDRAWSURFACE7       pPSur; //声明主绘图页
LPDIRECTDRAWSURFACE7       pBBuf; //声明后缓冲区
LPDIRECTDRAWSURFACE7       pOPla; //声明幕后内存区
DDSCAPS2  caps;                   //声明DDSCAPS结构
DDSURFACEDESC2             desc;  //声明描述结构
HRESULT result;                   //声明HRESULT类型变量

canvasFrame::canvasFrame()
{
        Create(NULL,"绘图窗口",WS_POPUP); //建立窗口
        hdc = ::CreateCompatibleDC(NULL);
        bmp1 = (HBITMAP):oadImage(NULL,"back1.bmp",IMAGE_BITMAP,640,480,LR_LOADFROMFILE);
        bmp2 = (HBITMAP)::LoadImage(NULL,"back2.bmp",IMAGE_BITMAP,640,480,LR_LOADFROMFILE);
        ::SelectObject(hdc,bmp1);  //选择第一张位图
        LoadBmp();
        pPSur->BltFast(0,0,pOPla,CRect(0,0,640,480),DDBLTFAST_WAIT);
        ::SelectObject(hdc,bmp2);  //选择第二张位图
        LoadBmp();
        pBBuf->BltFast(0,0,pOPla,CRect(0,0,640,480),DDBLTFAST_WAIT);
}
int canvasFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
        if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
                return -1;
    result = DirectDrawCreateEx(NULL, (VOID**)&pDD7, IID_IDirectDraw7, NULL);
        //建立DirectDraw对象
    if (result != DD_OK)
                MessageBox("建立DirectDraw对象失败!");
        result = pDD7->SetCooperativeLevel(m_hWnd,DDSCL_EXCLUSIVE |
                                 DDSCL_FULLSCREEN|DDSCL_ALLOWREBOOT );
        //设定协调层级
        if(result !=DD_OK)
                MessageBox("设定程序协调层级失败!");
        result = pDD7->SetDisplayMode(640,480,16,0,DDSDM_STANDARDVGAMODE);  //设定屏幕显示模式
        //设定显示模式
        if(result !=DD_OK)
                MessageBox("设定屏幕显示模式失败!");
        memset(&desc,0,sizeof(desc));      
        desc.dwSize = sizeof(desc);           
        desc.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
        desc.dwBackBufferCount = 1;        
        desc.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | DDSCAPS_COMPLEX | DDSCAPS_FLIP;
        result = pDD7->CreateSurface(&desc,&pPSur,NULL);
        //建立主绘图页
        if(result !=DD_OK)
                 MessageBox("建立主绘图页失败!");
        caps.dwCaps = DDSCAPS_BACKBUFFER;  
        result = pPSur->GetAttachedSurface(&caps,&pBBuf);
        //连结后缓冲区
        if(result !=DD_OK)
                MessageBox("连接后缓冲区失败!");
        memset(&desc,0,sizeof(desc));        
        desc.dwSize = sizeof(desc);
        desc.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH;
        desc.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN ;
        desc.dwWidth = 640;
        desc.dwHeight = 480;
        result = pDD7->CreateSurface(&desc, &pOPla, NULL);
        //建立幕后内存区
        if(result !=DD_OK)
                  MessageBox("建立幕后内存区失败!");
        SetTimer(1,500,NULL);
        return 0;
}

void canvasFrame::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
        CFrameWnd::OnChar(nChar, nRepCnt, nFlags);
        if( nChar== VK_ESCAPE )      //判断是否按下 Esc 键
                PostMessage(WM_CLOSE );  //传送WM_CLOSE信息
}

void canvasFrame::OnTimer(UINT nIDEvent)
{
        CFrameWnd::OnTimer(nIDEvent);
        pPSur->Flip( NULL , DDFLIP_WAIT );  //翻页
}
void canvasFrame::LoadBmp()
{
        result = pOPla->GetDC(&hdc1);  //取得DC
        if(result !=DD_OK)
                  MessageBox("取得内存区 DC 失败!");
        ::BitBlt(hdc1,0,0,desc.dwWidth,desc.dwHeight,hdc,0,0,SRCCOPY);
        pOPla->ReleaseDC(hdc1);        //释放DC
}
canvasFrame::~canvasFrame()
{
        delete hdc;
        delete hdc1;
        delete bmp1;
        delete bmp2;
        pDD7->Release();
        pPSur->Release();
        pOPla->Release();
}

1

主题

17

帖子

29

积分

注册会员

Rank: 2

积分
29
发表于 2004-4-11 22:57:00 | 显示全部楼层

Re:关于Flip()用法的问题

pPSur->BltFast(0,0,pOPla,CRect(0,0,640,480),DDBLTFAST_WAIT);
这已经复制到主页面了,并且到显示了。还用翻页吗

64

主题

856

帖子

856

积分

高级会员

Rank: 4

积分
856
QQ
发表于 2004-4-12 15:32:00 | 显示全部楼层

Re: 关于Flip()用法的问题

pPSur->BltFast(0,0,pOPla,CRect(0,0,640,480),DDBLTFAST_WAIT);
pPSur->Flip( NULL , DDFLIP_WAIT );  
pBBuf->BltFast(0,0,pOPla,CRect(0,0,640,480),DDBLTFAST_WAIT);
pPSur->Flip( pBBuf, DDFLIP_WAIT );  //将Flip的第一个参数改为pBBuf试试

或者:
pPSur->BltFast(0,0,pOPla,CRect(0,0,640,480),DDBLTFAST_WAIT);
pPSur->Flip( NULL , DDFLIP_WAIT );  
pPBuf->BltFast(0,0,pOPla,CRect(0,0,640,480),DDBLTFAST_WAIT);//改为绘制到pPBuf试试
pPSur->Flip( NULL, DDFLIP_WAIT );   [em7]

30

主题

298

帖子

299

积分

中级会员

Rank: 3Rank: 3

积分
299
QQ
发表于 2004-4-13 00:22:00 | 显示全部楼层

Re:关于Flip()用法的问题

我也曾经遇到过这个问题。我发现在创建主图面后立即进行翻面,然后向后台缓冲写数据并不能成功的写入,而在进入渲染循环之后进行写入才能成功。这个问题一直都没能很好的解决。
于是我干脆放弃了使用FLIP,而直接创建一个后台缓冲,向主图面进行BLT。效率上来说都是一样的,只不过不能进行自动同步了。但是在安装有特殊的驱动程序的机器上,FLIP的同步功能也有被屏蔽的可能(如nv卡的Omage加速驱动,在我的机器上FLIP就被屏蔽了同步功能)。

60

主题

1319

帖子

1319

积分

金牌会员

Rank: 6Rank: 6

积分
1319
发表于 2004-4-16 15:56:00 | 显示全部楼层

Re:关于Flip()用法的问题

改成
pPBur->BltFast(0,0,pOPla,CRect(0,0,640,480),DDBLTFAST_WAIT);

pPSur->Flip( NULL , DDFLIP_WAIT );  //翻页
pBBuf->BltFast(0,0,pOPla,CRect(0,0,640,480),DDBLTFAST_WAIT);
pPSur->Flip( NULL , DDFLIP_WAIT );  //翻页
试试

60

主题

1319

帖子

1319

积分

金牌会员

Rank: 6Rank: 6

积分
1319
发表于 2004-4-16 16:00:00 | 显示全部楼层

Re:关于Flip()用法的问题

Flip以后主表面就和副表面换了,一直往副表面画,然后翻页就得了。
不用直接往主表面上画

1

主题

5

帖子

13

积分

新手上路

Rank: 1

积分
13
 楼主| 发表于 2004-4-16 20:59:00 | 显示全部楼层

Re:关于Flip()用法的问题

这样两个页面就一起出现。
我看只有在出第一张时延时一会,再出第二张。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-6-30 07:14

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表