奇怪,编译DIRECTX例子正常,新建一工程后改写主文件后运行BltFast函数为何这样?

SingleStar 2001-07-31 01:57:36
DDSetColorKey(g_pDDSOne,RGB(0,0,0));
hRet=g_pDDSBack->BltFast(sPoint.x,sPoint.y,g_pDDSOne,&rcRect,DDBLTFAST_SRCCOLORKEY);
就是这两句话。在例子工程的环境下运行正常。新建一工程后改写主文件也可以运行,但不能把g_pDDSOne中的黑色象素挖去了。为什么?是否和某个编译选项有关?我差不多已经全试过。不知哪位大虾改写过此程序。例子是DDEX4.望赐教。
...全文
125 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
APIer 2001-08-04
  • 打赏
  • 举报
回复
16m色阿:)
ExitWindows 2001-08-01
  • 打赏
  • 举报
回复
up
ExitWindows 2001-08-01
  • 打赏
  • 举报
回复
up
SingleStar 2001-08-01
  • 打赏
  • 举报
回复
好了,在dx1.cpp中我把g_pDD->SetDisplayMode(640,480,8,0,0)改成
g_pDD->SetDisplayMode(640,480,16,0,0)就正常了。
为什么ddex4的编译环境下g_pDD->SetDisplayMode(640,480,8,0,0)可以呢?
还有8是256色么?16是16位色么?
SingleStar 2001-08-01
  • 打赏
  • 举报
回复
是独占模式。
SingleStar 2001-08-01
  • 打赏
  • 举报
回复
我的主文件名是dx1.cpp。奇怪的是我把dx1.cpp拷到ddex4目录下改名为ddex4.cpp,用ddex4的工程编译运行出的结果是正确的,把ddex4.cpp拷到dx1.cpp的位置并改名,用dx1的工程编译运行出的结果是不正确的,所以肯定是某个编译选项的问题。
ExitWindows 2001-07-31
  • 打赏
  • 举报
回复
up
Kevin_qing 2001-07-31
  • 打赏
  • 举报
回复

同上 colorkey 的map有问题
APIer 2001-07-31
  • 打赏
  • 举报
回复
你用的是窗口模式么?如果是请注意桌面的颜色深度,否则你设置的颜色健不是你需要的透明色:)
ExitWindows 2001-07-31
  • 打赏
  • 举报
回复
up
用DDraw实现射击游戏说明文档 要点一:画图自动切割 IDirectDrawSurface7::BltFast()方法中没有自动切割功能,即当画图元素超出窗口以外时不会自动切割,DDraw选择自动忽略不画,造成一旦超出窗口,画图元素会突然消失。 解决这一问题的方法是手动切割,代码如下: //自动切割 RECT scRect; //存放当前窗口大小区域 ZeroMemory( &scRect, sizeof( scRect ) ); GetWindowRect( GetActiveWindow(), &scRect ); //防止图片左上角超过窗口左上角 if ( x < 0 ) { m_rect.left -= x; x = 0; } if ( y scRect.right ? scRect.right : x; y = y > scRect.bottom ? scRect.bottom : y; m_rect.right = x + m_rect.right - m_rect.left > scRect.right ? scRect.right - x + m_rect.left : m_rect.right; m_rect.bottom = y + m_rect.bottom - m_rect.top > scRect.bottom ? scRect.bottom - y + m_rect.top : m_rect.bottom; 只需将上述代码加在CGraphic::BltBBuffer() 中的m_bRect = m_rect; 前即可。 要点二:背景的滚轴实现 画背景可以分为以下三种情况: 情况一:背景图片与窗口等高 情况二:背景图片高度小于窗口高度 情况三:背景图片高度大于窗口高度 上述讲解图与代码相对应地看,有助于容易理解。 另外,要点一实现之后,由于已经可以自动切割,画背景可以用其它方法。 要点三:精灵图的实现 在游戏中,如RPG游戏中的人物图、射击类游戏的飞机、爆炸等,叫做精灵图。 精灵图实际上是将所有帧的图片放在一个文件中,游戏时靠一个RECT来控制画图像文件中的哪一部分,进而控制游戏显示哪一帧图,只需控制好RECT的位置即可。如下图: 控制RECT的四个角的坐标的移动,有以下代码: if (m_timeEnd – m_timeStart > 100) //只有到了100ms之后才绘图 { m_ImageID++; if(m_ImageID - m_beginID >= num) { m_ImageID = m_beginID; //最后一帧的下一帧是第一帧 } m_timeStart = timeGetTime(); } int id = m_ImageID++; SetRect(&m_rect, 41 * id, 0, 41 * (id + 1), 41); //飞机精灵图大小是41×41 m_pGraph->BltBBuffer(m_pImageBuffer, true, m_Pos.x, m_Pos.y, m_rect); 这样就实现了精灵动画的效果。 要点四:拿STL进行子弹的实现 子弹的实现可以使用STL中的vector,当按下开火键时发出一颗子弹,就往vector中添加一个结点;当子弹飞出窗口或击中敌机时,再将结点从vector中删除。每帧游戏画面中子弹飞行时只需将vector中的所有子弹进行处理、绘画即可。 参考代码如下: 1.添加子弹 if (g_ctrlDown) //当ctrl键按下时开炮! { m_BulletEnd = m_Gtime->GetTime(); if ((m_BulletEnd - m_BulletStart) * 1000 > 120) //如果连续按着开火键不放,这里控制不会发出太多子弹 { m_BulletStart = m_BulletEnd; MBULLET tmpBullet; tmpBullet.pos.x = m_SPos.x - 1; //记录开火时的子弹位置 tmpBullet.pos.y = m_SPos.y - 26; tmpBullet.speed = 5; //该子弹的飞行速度 m_BulletList.push_back(tmpBullet); //将子弹添加到vector中

8,304

社区成员

发帖
与我相关
我的任务
社区描述
游戏开发相关内容讨论专区
社区管理员
  • 游戏开发
  • 呆呆敲代码的小Y
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧