⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 01_9_13_21.asp.html

📁 有用的VC教程,包括编程思想编程技巧程序效率等方面的指导
💻 HTML
📖 第 1 页 / 共 4 页
字号:
      <td class=a14> 安装完DirectX SDK,需要通知Visual C++ DirectX SDK的路径。具体做法是:在VC的编译环境中,依次把Tools-Options-Directories中的Show 
        Directories for一栏中的include files和library files中分别填入SDK的inc和lib目录,如图1所示。</td>
    </tr></table><table width=100% ><tr>
      <td class=a14> 再准备两幅bmp格式的位图,要求24位(16M色),其中background.bmp作背景,如图2;另一幅bird.bmp作为子画面,如图3。bird.bmp是由4幅小画面组成的,从左到右,从上到下,分别为动画的1至4帧。这样做的目的是避免过多位图文件带来的不必要的麻烦。还要注意一点的是子画面的背景要为黑色(RGB=(0,0,0)),因为在下面的程序中,色彩键码把黑色设为透明色。</td>
    </tr></table><table width=100% ><tr>
      <td class=a14> 好,一切准备就绪,让我们开始吧!</td>
    </tr></table><table width=100% ><tr>
      <td class=a14> 进入VC5的编程环境,File-New-Project,选择DirectDraw AppWizard,输入项目名Fly,按下Ok,以后每一步都按其缺省值即可,这样AppWizard就会自动创建一个项目Fly,属性如下:</td>
    </tr></table><table width=100% ><tr><td class=a14>
  APPLICATION STYLE</td></tr></table><table width=100% ><tr><td class=a14>
   Full-Screen</td></tr></table><table width=100% ><tr><td class=a14>
  SETTINGS</td></tr></table><table width=100% ><tr><td class=a14>
   640x480</td></tr></table><table width=100% ><tr><td class=a14>
   16-bit</td></tr></table><table width=100% ><tr><td class=a14>
  CLASS NAMES</td></tr></table><table width=100% ><tr><td class=a14>
   FlyApp</td></tr></table><table width=100% ><tr><td class=a14>
   FlyWin</td></tr></table><table width=100% ><tr><td class=a14>
  CONTENT</td></tr></table><table width=100% ><tr><td class=a14>
   Bitmap</td></tr></table><table width=100% ><tr>
      <td class=a14> 这时,按&ldquo;Ctrl+F5&rdquo;编译运行,你就会看到一个&ldquo;三角形&rdquo;在屏幕上撞来撞去。</td>
    </tr></table><table width=100% ><tr>
      <td class=a14> 在FlyWin.h中添加代码,如下所示:</td>
    </tr></table><table width=100% ><tr><td class=a14>
  #ifndef FLYWIN_H</td></tr></table><table width=100% ><tr><td class=a14>
  #define FLYWIN_H</td></tr></table><table width=100% ><tr><td class=a14>
  #include &ldquo;DirectDrawWin.h&rdquo;</td></tr></table><table width=100% ><tr><td class=a14>
  </td></tr></table><table width=100% ><tr><td class=a14>
  class FlyWin : public DirectDrawWin</td></tr></table><table width=100% ><tr><td class=a14>
  {</td></tr></table><table width=100% ><tr><td class=a14>
  public:</td></tr></table><table width=100% ><tr><td class=a14>
   FlyWin();</td></tr></table><table width=100% ><tr><td class=a14>
  protected:</td></tr></table><table width=100% ><tr><td class=a14>
   //{{AFX_MSG(FlyWin)</td></tr></table><table width=100% ><tr><td class=a14>
   afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);</td></tr></table><table width=100% ><tr><td class=a14>
   afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);</td></tr></table><table width=100% ><tr><td class=a14>
   afx_msg void OnTimer(UINT nIDEvent);</td></tr></table><table width=100% ><tr><td class=a14>
   afx_msg void OnDestroy();</td></tr></table><table width=100% ><tr><td class=a14>
   //}}AFX_MSG</td></tr></table><table width=100% ><tr><td class=a14>
   DECLARE_MESSAGE_MAP()</td></tr></table><table width=100% ><tr><td class=a14>
  private:</td></tr></table><table width=100% ><tr><td class=a14>
   int SelectDriver();</td></tr></table><table width=100% ><tr><td class=a14>
   int SelectInitialDisplayMode();</td></tr></table><table width=100% ><tr><td class=a14>
   BOOL CreateCustomSurfaces();</td></tr></table><table width=100% ><tr><td class=a14>
   void DrawScene();</td></tr></table><table width=100% ><tr><td class=a14>
   void RestoreSurfaces();</td></tr></table><table width=100% ><tr><td class=a14>
  private: </td></tr></table><table width=100% ><tr><td class=a14>
   void CopySurface(LPDIRECTDRAWSURFACE ts,</td></tr></table><table width=100% ><tr><td class=a14>
   LPDIRECTDRAWSURFACE ss,</td></tr></table><table width=100% ><tr><td class=a14>
  int x,int y);</td></tr></table><table width=100% ><tr><td class=a14>
   void SplitSurface(LPDIRECTDRAWSURFACE ts,</td></tr></table><table width=100% ><tr><td class=a14>
   LPDIRECTDRAWSURFACE ss,</td></tr></table><table width=100% ><tr><td class=a14>
   CRect& srcc,</td></tr></table><table width=100% ><tr><td class=a14>
   int x,int y);</td></tr></table><table width=100% ><tr><td class=a14>
  private:</td></tr></table><table width=100% ><tr><td class=a14>
   LPDIRECTDRAWSURFACE bksurf, //定义指向背景画面表面的指针</td></tr></table><table width=100% ><tr><td class=a14>
  flysurf, //指向总子画面表面的指针</td></tr></table><table width=100% ><tr><td class=a14>
  storesurf,//指向存储背景区域表面的指针</td></tr></table><table width=100% ><tr><td class=a14>
  flysurf1, //指向第一帧子画面表面的指针</td></tr></table><table width=100% ><tr><td class=a14>
  flysurf2, //指向第二帧子画面表面的指针</td></tr></table><table width=100% ><tr><td class=a14>
  flysurf3, //指向第三帧子画面表面的指针</td></tr></table><table width=100% ><tr><td class=a14>
  flysurf4, //指向第四帧子画面表面的指针</td></tr></table><table width=100% ><tr><td class=a14>
  cursurf; //指向当前移动的子画面表面的指针</td></tr></table><table width=100% ><tr><td class=a14>
  //背景画面指background.bmp;总子画面指bird.bmp</td></tr></table><table width=100% ><tr><td class=a14>
  </td></tr></table><table width=100% ><tr><td class=a14>
  int x,y,nPreX,nPreY;//定义子画面移动的坐标</td></tr></table><table width=100% ><tr><td class=a14>
  int nIncX,nIncY;// 定义子画面移动的像素数</td></tr></table><table width=100% ><tr><td class=a14>
   int nCount; //定义计数器</td></tr></table><table width=100% ><tr><td class=a14>
   DWORD fw,fh; //定义总子画面的宽和高</td></tr></table><table width=100% ><tr><td class=a14>
  };</td></tr></table><table width=100% ><tr><td class=a14>
  #endif</td></tr></table><table width=100% ><tr>
      <td class=a14> 其中,CopySurface()函数起保存被子画面覆盖掉的背景区域的作用。参数ts是指向目标表面的指针,ss是指向源表面的指针,x、y是源表面上需要拷贝的矩形区域左上角的坐标。</td>
    </tr></table><table width=100% ><tr>
      <td class=a14> SplitSurface()函数用于分离一个大的总子画面表面为4帧小子画面表面。参数ts是指向目标表面的指针,ss是指向源表面的指针,srcc是源表面上需要选取的矩形区域,x、y要拷贝到目标表面上的左上角坐标。</td>
    </tr></table><table width=100% ><tr>
      <td class=a14> 其实当我们看了下面FlyWin.cpp中这两个函数的原型后,细心的朋友也许会发现,两个函数完全可以写成一个函数。而本文特意写成两个函数,为的是程序的清楚易读,不易引起混淆。</td>
    </tr></table><table width=100% ><tr><td class=a14>
  下一步在FlyWin.cpp中添加代码,如下所示:</td></tr></table><table width=100% ><tr><td class=a14>
  #include &ldquo;Headers.h&rdquo;</td></tr></table><table width=100% ><tr><td class=a14>
  #include &ldquo;resource.h&rdquo;</td></tr></table><table width=100% ><tr><td class=a14>
  #include &ldquo;DriverDialog.h&rdquo;</td></tr></table><table width=100% ><tr><td class=a14>
  #include &ldquo;FlyWin.h&rdquo;</td></tr></table><table width=100% ><tr><td class=a14>
  #pragma comment (lib,&ldquo;ddraw.lib&rdquo;)</td></tr></table><table width=100% ><tr><td class=a14>
  #pragma comment (lib,&ldquo;dxguid.lib&rdquo;)</td></tr></table><table width=100% ><tr><td class=a14>
  </td></tr></table><table width=100% ><tr><td class=a14>
  const DWORD desiredwidth=640;</td></tr></table><table width=100% ><tr><td class=a14>
  const DWORD desiredheight=480;</td></tr></table><table width=100% ><tr><td class=a14>
  const DWORD desireddepth=16;</td></tr></table><table width=100% ><tr><td class=a14>
  </td></tr></table><table width=100% ><tr><td class=a14>
  const int nMoveSpeed=100; //设置动画速度为100毫秒/帧</td></tr></table><table width=100% ><tr><td class=a14>
  const int nMoveIncX=8; //设置子画面沿X轴移动8个像素</td></tr></table><table width=100% ><tr><td class=a14>
  const int nMoveIncY=8; //设置子画面沿y轴移动8个像素</td></tr></table><table width=100% ><tr><td class=a14>
  </td></tr></table><table width=100% ><tr><td class=a14>
  BEGIN_MESSAGE_MAP(FlyWin, DirectDrawWin)</td></tr></table><table width=100% ><tr><td class=a14>
   //{{AFX_MSG_MAP(FlyWin)</td></tr></table><table width=100% ><tr><td class=a14>
   ON_WM_KEYDOWN()</td></tr></table><table width=100% ><tr><td class=a14>
   ON_WM_CREATE()</td></tr></table><table width=100% ><tr><td class=a14>
   ON_WM_TIMER()</td></tr></table><table width=100% ><tr><td class=a14>
   ON_WM_DESTROY()</td></tr></table><table width=100% ><tr><td class=a14>
   //}}AFX_MSG_MAP</td></tr></table><table width=100% ><tr><td class=a14>
  END_MESSAGE_MAP()</td></tr></table><table width=100% ><tr><td class=a14>
  </td></tr></table><table width=100% ><tr><td class=a14>
  FlyWin::FlyWin()</td></tr></table><table width=100% ><tr><td class=a14>
  {</td></tr></table><table width=100% ><tr><td class=a14>
   x=nPreX=300; //子画面初始位置为(300,150)</td></tr></table><table width=100% ><tr><td class=a14>
   y=nPreY=150;</td></tr></table><table width=100% ><tr><td class=a14>
   nIncX=nMoveIncX;</td></tr></table><table width=100% ><tr><td class=a14>
   nIncY=nMoveIncY;</td></tr></table><table width=100% ><tr><td class=a14>
   nCount=1;</td></tr></table><table width=100% ><tr><td class=a14>
  //设置计数器 </td></tr></table><table width=100% ><tr><td class=a14>
  }</td></tr></table><table width=100% ><tr><td class=a14>
  BOOL FlyWin::CreateCustomSurfaces()</td></tr></table><table width=100% ><tr><td class=a14>
  {</td></tr></table><table width=100% ><tr><td class=a14>
   // create your surfaces here...</td></tr></table><table width=100% ><tr><td class=a14>
   //创建背景表面,并由指针bksurf指向这个表面</td></tr></table><table width=100% ><tr><td class=a14>
   bksurf=CreateSurface(&ldquo;background.bmp&rdquo;);</td></tr></table><table width=100% ><tr><td class=a14>
   //创建一个总子画面(由4帧子画面组成)的表面</td></tr></table><table width=100% ><tr><td class=a14>
   //由指针flysurf指向这个表面.</td></tr></table><table width=100% ><tr><td class=a14>
   flysurf=CreateSurface(&ldquo;bird.bmp&rdquo;);</td></tr></table><table width=100% ><tr><td class=a14>
  </td></tr></table><table width=100% ><tr><td class=a14>
   //得到总子画面表面的宽(fw),高(fh)</td></tr></table><table width=100% ><tr><td class=a14>
  GetSurfaceDimensions(flysurf,fw,fh);</td></tr></table><table width=100% ><tr><td class=a14>
  </td></tr></table><table width=100% ><tr><td class=a14>
   //创建4帧宽为fw/2,高为fh/2的子画面的表面,分别由</td></tr></table><table width=100% ><tr><td class=a14>
   //指针flysurf1,flysurf2,flysurf3,flysurf4指向它们。</td></tr></table><table width=100% ><tr><td class=a14>
   //现在这4个子表面还是空的。</td></tr></table><table width=100% ><tr><td class=a14>
   flysurf1=CreateSurface(fw/2,fh/2);</td></tr></table><table width=100% ><tr><td class=a14>
   flysurf2=CreateSurface(fw/2,fh/2);</td></tr></table><table width=100% ><tr><td class=a14>
   flysurf3=CreateSurface(fw/2,fh/2);</td></tr></table><table width=100% ><tr><td class=a14>
   flysurf4=CreateSurface(fw/2,fh/2);</td></tr></table><table width=100% ><tr><td class=a14>
  </td></tr></table><table width=100% ><tr><td class=a14>
   //清除4帧子画面表面的内容,使表面内所有像素为0,</td></tr></table><table width=100% ><tr><td class=a14>
   //即表面是透明的。</td></tr></table><table width=100% ><tr><td class=a14>
   ClearSurface(flysurf1,0);</td></tr></table><table width=100% ><tr><td class=a14>
   ClearSurface(flysurf2,0);</td></tr></table><table width=100% ><tr><td class=a14>
   ClearSurface(flysurf3,0);</td></tr></table><table width=100% ><tr><td class=a14>
   ClearSurface(flysurf4,0);</td></tr></table><table width=100% ><tr><td class=a14>
  </td></tr></table><table width=100% ><tr><td class=a14>
  //定义色彩键码,指明黑色(RGB=(0,0,0))为透明色</td></tr></table><table width=100% ><tr><td class=a14>
  //即在blt操作期间不拷贝黑色像素。</td></tr></table><table width=100% ><tr><td class=a14>
  DDCOLORKEY ddck;</td></tr></table><table width=100% ><tr><td class=a14>
  ddck.dwColorSpaceLowValue=0;</td></tr></table><table width=100% ><tr><td class=a14>
  ddck.dwColorSpaceHighValue=0;</td></tr></table><table width=100% ><tr><td class=a14>
  //将色彩键码赋给背景表面,总子画面表面和4个子画面表面</td></tr></table><table width=100% ><tr><td class=a14>
  bksurf&rarr;SetColorKey(DDCKEY_SRCBLT,&ddck);</td></tr></table><table width=100% ><tr><td class=a14>
  flysurf&rarr;SetColorKey(DDCKEY_SRCBLT,&ddck);</td></tr></table><table width=100% ><tr><td class=a14>
  flysurf1&rarr;SetColorKey(DDCKEY_SRCBLT,&ddck);</td></tr></table><table width=100% ><tr><td class=a14>
  flysurf2&rarr;SetColorKey(DDCKEY_SRCBLT,&ddck);</td></tr></table><table width=100% ><tr><td class=a14>
  flysurf3&rarr;SetColorKey(DDCKEY_SRCBLT,&ddck);</td></tr></table><table width=100% ><tr><td class=a14>
  flysurf4&rarr;SetColorKey(DDCKEY_SRCBLT,&ddck);</td></tr></table><table width=100% ><tr><td class=a14>
  </td></tr></table><table width=100% ><tr><td class=a14>
  //定义总子画面表面上的4个矩形区域,即为4个子画面表面区域</td></tr></table><table width=100% ><tr><td class=a14>
  CRect r1(0,0,fw/2-1,fh/2-1);</td></tr></table><table width=100% ><tr><td class=a14>
  </td></tr></table><table width=100% ><tr><td class=a14>
  CRect r2(fw/2,0,fw-1,fh/2-1);</td></tr></table><table width=100% ><tr><td class=a14>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -