游戏开发论坛

 找回密码
 立即注册
搜索
查看: 1505|回复: 3

blt问题!!!

[复制链接]

47

主题

145

帖子

3602

积分

论坛元老

Rank: 8Rank: 8

积分
3602
发表于 2004-6-14 14:17:00 | 显示全部楼层 |阅读模式
我最近在做一个下雨的模拟程序。。。里面遇到这样的问题。。
我试图用开在内存中的页面lpa    把后备缓冲中的图像拷贝到lpa中
程序如下:
  static long old_clock, new_clock; //延时变量
  new_clock=GetTickCount();
if( new_clock > old_clock + 35 )  
{
  old_clock=new_clock;
  
  lpDDSBack->BltFast( 0, 0, lpBack , &rect, DDBLTFAST_NOCOLORKEY);  //画背景到后备缓冲中
  

//==============================画雨点到后备缓冲里====================================
    if ( Rain.IsRain() )
     {
       for (int i=0;i<Rain.C_Rain;i++)
        {
          Rain.Rain();
          if (Rain.R_drop.IsRand)   
            {
             rect1=GetRect(Rain.R_drop.state*54,0,Rain.R_drop.state*54+54,50);
             lpDDSBack->BltFast( Rain.R_drop.x, Rain.R_drop.y, lpRain , &rect1, DDBLTFAST_SRCCOLORKEY);
             }  
        }   

     }
//===========此时后备缓冲中有背景画面和雨点的共同组合====================================

     
       lpsrc->BltFast( 0, 0, lpDDSBack , &rect, DDBLTFAST_NOCOLORKEY);   //把后备画面拷贝到里面   
  
      lpalpha=MixTwoFace(lpsrc,lpdest,30);  //混合后备画面内容+dest内容 到lpaphla
      
      lpDDSBack->BltFast( 0, 0, lpalpha, &rect, DDBLTFAST_NOCOLORKEY);//把混合后的结果方回后备缓冲
      
     lpDDSPrimary->Flip( NULL, 0 );
  }

但结果不尽人意。。。。。。谁知道为什么啊??我知道原因肯定出在lpsrc->BltFast( 0, 0, lpDDSBack , &rect, DDBLTFAST_NOCOLORKEY);   
。。。。到底为什么。。。

47

主题

145

帖子

3602

积分

论坛元老

Rank: 8Rank: 8

积分
3602
 楼主| 发表于 2004-6-14 14:25:00 | 显示全部楼层

Re:blt问题!!!

就相当与一个循环

先把地图页面拷贝到后备缓冲中去:
lpDDSBack->BltFast( 0, 0, lpBack , &rect, DDBLTFAST_NOCOLORKEY);

其次把雨点画到后备缓冲中去:
DrawRain();

然后把后备缓冲中的图像(背景+雨点)拷贝到内存页面lpsrc中:
lpsrc->BltFast( 0, 0, lpDDSBack , &rect, DDBLTFAST_NOCOLORKEY);

接着用个函数MixTwoFace(lpsrc,lpdest,30);把lpsrc和lpdest2个画面混合比例按%50,把混合后的图画区域指针给lpalpha,

再接着把混合后的图像拷贝到后备缓冲中去:
lpDDSBack->BltFast( 0, 0, lpalpha, &rect, DDBLTFAST_NOCOLORKEY);
这个时候后备缓冲中的图像因该是 (背景+雨点)的半透明  

最后用flip  :lpDDSPrimary->Flip( NULL, 0 );

按这个步骤来说没有错。。。。因该在屏幕上看见 背景+雨点的半透明效果
但当我运行程序的时候却发现画面慢慢得从背景图像转换成lpdest里设置的黑色
最后什么也看不见。。就一片黑//也就是说最后全部是lpdest的画面!!why???

47

主题

145

帖子

3602

积分

论坛元老

Rank: 8Rank: 8

积分
3602
 楼主| 发表于 2004-6-14 14:30:00 | 显示全部楼层

Re:blt问题!!!

但当我把上面的代码改成下面的时候。。。程序如我所愿地执行了效果
static long old_clock, new_clock; //延时变量
  new_clock=GetTickCount();
if( new_clock > old_clock + 35 )  
{
  old_clock=new_clock;
  
      lpsrc->BltFast( 0, 0, lpback , &rect, DDBLTFAST_NOCOLORKEY);   //把后备画面拷贝到里面   
  
      lpalpha=MixTwoFace(lpsrc,lpdest,30);  //混合后备画面内容+dest内容 到lpaphla
      
      lpDDSBack->BltFast( 0, 0, lpalpha, &rect, DDBLTFAST_NOCOLORKEY);
  

//==============================画雨点到后备缓冲里====================================
    if ( Rain.IsRain() )
     {
       for (int i=0;i<Rain.C_Rain;i++)
        {
          Rain.Rain();
          if (Rain.R_drop.IsRand)   
            {
             rect1=GetRect(Rain.R_drop.state*54,0,Rain.R_drop.state*54+54,50);
             lpDDSBack->BltFast( Rain.R_drop.x, Rain.R_drop.y, lpRain , &rect1, DDBLTFAST_SRCCOLORKEY);
             }  
        }   

     }
//===========此时后备缓冲中有背景画面和雨点的共同组合====================================

   
      
     lpDDSPrimary->Flip( NULL, 0 );
  }

从我修改当中就可以很明显的看出问题关键是:从显存中把把图像数据拷贝到内存有点问题?但到底是什么原因呢??

32

主题

377

帖子

378

积分

中级会员

Rank: 3Rank: 3

积分
378
发表于 2004-6-17 00:55:00 | 显示全部楼层

Re:blt问题!!!

楼主不如把一般页面都放在内存中,也不要什么翻页了,直接用拷贝的方式贴图,效果很不错。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-7-1 23:32

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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