加载中…
个人资料
jh_saya
jh_saya
  • 博客等级:
  • 博客积分:0
  • 博客访问:29,708
  • 关注人气:7
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
相关博文
推荐博文
谁看过这篇博文
加载中…
正文 字体大小:

GDI编程2(地图/循环/背景滚动)

(2012-03-19 06:02:28)
标签:

位图

坐标

进行

拼接

加载

分类: GDI/GDI+/DX图像学

地图(Map)

32*32图块:

  1. void map(HDC hdc)
  2. {
  3.     HDC mdc,mdc2;
  4.     HBITMAP fullmap;
  5.     const int rows = 8,cols = 8;
  6.     int mapindex[rows*cols] = {
  7.         0, 0, 0, 0, 0, 0, 0, 0,
  8.         0, 0, 0, 0, 0, 0, 0, 0,
  9.         0, 0, 2, 1, 2, 0, 0, 0,
  10.         0, 0, 1, 1, 1, 0, 0, 0,
  11.         0, 0, 2, 1, 2, 0, 0, 0,
  12.         0, 0, 0, 0, 0, 0, 0, 0,
  13.         0, 0, 0, 0, 0, 0, 0, 0,
  14.         0, 0, 0, 0, 0, 0, 0, 0
  15.     };
  16.     mdc = CreateCompatibleDC(hdc);
  17.     mdc2 = CreateCompatibleDC(hdc);
  18.     fullmap = CreateCompatibleBitmap(hdc, rows*32, cols*32);
  19.     SelectObject(mdc, fullmap);
  20.     HBITMAP map[3];
  21.     char filename[20] = "";
  22.     int rowNum, colNum;
  23.     int i, x, y;
  24.     for(i=0;i<3;i++)          // 加载各图块位图
  25.     {
  26.         sprintf(filename,"map%d.bmp",i);
  27.         map[i] = (HBITMAP)LoadImage(NULL, filename, IMAGE_BITMAP, 32, 32, LR_LOADFROMFILE);
  28.     }
  29.     for(i=0;i<rows*cols;i++)  // 按mapindex进行地图拼接
  30.     {
  31.         SelectObject(mdc2, map[mapindex[i]]);
  32.         rowNum = i / cols;    // 行(y)编号
  33.         colNum = i % cols;    // 列(x)编号
  34.         x = colNum * 32;      // 贴图x坐标
  35.         y = rowNum * 32;      // 贴图y坐标
  36.         BitBlt(mdc, x, y, 32, 32, mdc2, 0, 0, SRCCOPY);
  37.     }
  38.     SelectObject(mdc, fullmap);
  39.     BitBlt(hdc, 0, 0, cols*32, rows*32, mdc, 0, 0, SRCCOPY);
  40.     DeleteDC(mdc);
  41.     DeleteDC(mdc2);
  42.     DeleteObject(fullmap);
  43.     for(i=0;i<3;i++)
  44.         DeleteObject(map[i]);
  45. }

--------------------------------------------------------------------------------------------------

45度斜角地图

64*32图块:

  1. void map45(HDC hdc)
  2. {
  3.     HDC mdc,mdc2;
  4.     const int rows = 8,cols = 8;
  5.     int mapIndex[rows*cols] = {
  6.         0, 0, 0, 0, 0, 0, 0, 0,
  7.         0, 0, 0, 0, 0, 0, 0, 0,
  8.         0, 0, 2, 1, 2, 0, 0, 0,
  9.         0, 0, 1, 1, 1, 0, 0, 0,
  10.         0, 0, 2, 1, 2, 0, 0, 0,
  11.         0, 0, 0, 0, 0, 0, 0, 0,
  12.         0, 0, 0, 0, 0, 0, 0, 0,
  13.         0, 0, 0, 0, 0, 0, 0, 0
  14.     };
  15.     mdc = CreateCompatibleDC(hdc);
  16.     mdc2 = CreateCompatibleDC(hdc);
  17.  
  18.     HBITMAP fullmap;
  19.     HBITMAP map[3];
  20.     char filename[20] = "";
  21.     int rowNum, colNum;
  22.     int i, x, y;
  23.     int xstart,ystart;
  24.  
  25.     xstart = 32 * (rows-1);   // 起始贴图坐标
  26.     ystart = 0;
  27.     fullmap = (HBITMAP)LoadImage(NULL, "bj.bmp", IMAGE_BITMAP, 640, 480, LR_LOADFROMFILE);
  28.     SelectObject(mdc, fullmap);
  29.     for(i=0;i<3;i++)          // 加载各图块位图
  30.     {
  31.         sprintf(filename,"map%d.bmp",i);
  32.         map[i] = (HBITMAP)LoadImage(NULL, filename, IMAGE_BITMAP, 32, 32, LR_LOADFROMFILE);
  33.     }
  34.     for(i=0;i<rows*cols;i++)  // 按mapindex进行地图拼接
  35.     {
  36.         SelectObject(mdc2, map[mapIndex[i]]);
  37.         rowNum = i / cols;    // 行(y)编号
  38.         colNum = i % cols;    // 列(x)编号
  39.         x = xstart + colNum * 32 + rowNum * (-32);   // 贴图x坐标
  40.         y = ystart + rowNum * 16 + colNum * 16;      // 贴图y坐标
  41.         BitBlt(mdc, x, y, 64, 32, mdc2, 0, 0, SRCCOPY);
  42.     }
  43.     SelectObject(mdc, fullmap);
  44.     BitBlt(hdc, 0, 0, 640, 480, mdc, 0, 0, SRCCOPY);
  45.     DeleteDC(mdc);
  46.     DeleteDC(mdc2);
  47.     DeleteObject(fullmap);
  48.     for(i=0;i<3;i++)
  49.         DeleteObject(map[i]);
  50. }

--------------------------------------------------------------------------------------------------

 景物贴图

  1. void map45scene(HDC hdc)
  2. {
  3.     HDC mdc,mdc2;
  4.     const int rows = 8,cols = 8;
  5.     int mapIndex[rows*cols] = {
  6.         0, 0, 0, 0, 0, 0, 0, 0,
  7.         0, 0, 0, 0, 0, 0, 0, 0,
  8.         0, 0, 2, 1, 2, 0, 0, 0,
  9.         0, 0, 1, 1, 1, 0, 0, 0,
  10.         0, 0, 2, 1, 2, 0, 0, 0,
  11.         0, 0, 0, 0, 0, 0, 0, 0,
  12.         0, 0, 0, 0, 0, 0, 0, 0,
  13.         0, 0, 0, 0, 0, 0, 0, 0
  14.     };
  15.     int sceneIndex[rows*cols] = {
  16.         0, 0, 0, 0, 0, 0, 0, 0,
  17.         0, 0, 0, 0, 0, 1, 0, 0,
  18.         0, 0, 0, 0, 0, 0, 0, 0,
  19.         0, 0, 0, 0, 0, 0, 0, 0,
  20.         0, 0, 0, 0, 0, 0, 0, 0,
  21.         0, 0, 0, 0, 0, 0, 0, 0,
  22.         0, 2, 0, 0, 0, 0, 0, 0,
  23.         0, 0, 0, 0, 0, 0, 0, 0
  24.     };
  25.     mdc = CreateCompatibleDC(hdc);
  26.     mdc2 = CreateCompatibleDC(hdc);
  27.  
  28.     HBITMAP fullmap;
  29.     HBITMAP map[3],scene[2];;
  30.     char filename[20] = "";
  31.     int rowNum, colNum;
  32.     int i, x, y;
  33.     int xstart,ystart;
  34.  
  35.     xstart = 32 * (rows-1);   // 起始贴图坐标
  36.     ystart = 0;
  37.     fullmap = (HBITMAP)LoadImage(NULL, "bj.bmp", IMAGE_BITMAP, 640, 480, LR_LOADFROMFILE);
  38.     SelectObject(mdc, fullmap);
  39.     for(i=0;i<3;i++)          // 加载各图块位图
  40.     {
  41.         sprintf(filename,"map%d.bmp",i);
  42.         map[i] = (HBITMAP)LoadImage(NULL, filename, IMAGE_BITMAP, 32, 32, LR_LOADFROMFILE);
  43.     }
  44.     for(i=0;i<2;i++)          // 加载各场景位图
  45.    {
  46.         sprintf(filename,"scene%d.bmp",i+1);
  47.         scene[i] = (HBITMAP)LoadImage(NULL, filename, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
  48.     }
  49.     for(i=0;i<rows*cols;i++)  // 按mapindex进行地图拼接
  50.     {
  51.         SelectObject(mdc2, map[mapIndex[i]]);
  52.         rowNum = i / cols;    // 行(y)编号
  53.         colNum = i % cols;    // 列(x)编号
  54.         x = xstart + colNum * 32 + rowNum * (-32);   // 贴图x坐标
  55.         y = ystart + rowNum * 16 + colNum * 16;      // 贴图y坐标
  56.         BitBlt(mdc, x, y, 64, 32, mdc2, 0, 0, SRCCOPY);
  57.  
  58.         switch(sceneIndex[i])
  59.         {
  60.             case 1:  // 场景物1
  61.                 SelectObject(mdc2, scene[0]);
  62.                 BitBlt(mdc, x, y-32, 64, 64, mdc2, 0, 0, SRCCOPY);
  63.                 break;
  64.             case 2:  // 场景物2
  65.                 SelectObject(mdc2, scene[1]);
  66.                 BitBlt(mdc, x, y-96, 64, 128, mdc2, 0, 0, SRCCOPY);
  67.                 break;
  68.         }
  69.     }
  70.     SelectObject(mdc, fullmap);
  71.     BitBlt(hdc, 0, 0, 640, 480, mdc, 0, 0, SRCCOPY);
  72.     DeleteDC(mdc);
  73.     DeleteDC(mdc2);
  74.     DeleteObject(fullmap);
  75.     for(i=0;i<3;i++)
  76.         DeleteObject(map[i]);
  77.     for(i=0;i<2;i++)
  78.         DeleteObject(scene[i]);
  79. }

--------------------------------------------------------------------------------------------------

游戏循环

循环刷新有4种动作的图片

  1. HWND hWnd;  // 全局变量

InitInstance初始化后的循环改为:

  1. //  游戏循环:
  2. DWORD tPre = 0, tNow;
  3. HDC hdc;
  4. while (msg.message!=WM_QUIT)
  5. {
  6.     if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))  // 加速键
  7.     {
  8.         if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))  // 检测消息
  9.         {
  10.             TranslateMessage(&msg);    // 将虚拟键消息转换为字符消息 
  11.             DispatchMessage(&msg);     // 分发一个消息给窗口程序(WndProc自定义函数)进行处理
  12.         }
  13.         else
  14.         {
  15.             tNow = GetTickCount();
  16.             if (tNow-tPre >= 40)       // 40毫秒更新一次
  17.             {
  18.                 hdc = GetDC(hWnd);
  19.                 update(hdc);           // 更新函数update
  20.                 ReleaseDC(hWnd, hdc);
  21.                 tPre = GetTickCount();
  22.             }
  23.         }
  24.     }
  25. }
  26. void update(HDC hdc) // 更新动画
  27. {
  28.      HDC mdc;                       // 声明内存DC与位图对象
  29.      HBITMAP hbmp;
  30.      static int i;
  31.      mdc = CreateCompatibleDC(hdc); // 创建DC与位图
  32.      hbmp = (HBITMAP)LoadImage(NULL, "gif.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
  33.      SelectObject(mdc, hbmp);       // 选择位图对象到内存DC中
  34.      BitBlt(hdc, 0, 0, 65, 70, mdc, i*65, 0, SRCCOPY); // 内存DC位图在窗口DC显示
  35.      if(i>=3)
  36.          i = 0;
  37.      else
  38.          i++;
  39.      DeleteDC(mdc);                 // 释放内存DC与位图对象
  40.      DeleteObject(hbmp);
  41. }

--------------------------------------------------------------------------------------------------

循环背景滚动

  1. void update2(HDC hdc) // 更新背景滚动
  2. {
  3.     // 声明
  4.  HDC mdc,mdc_all;
  5.  HBITMAP hbmp,hbmp_all;
  6.  static int x;
  7.  // 创建DC
  8.  mdc = CreateCompatibleDC(hdc);
  9.  mdc_all = CreateCompatibleDC(hdc);
  10.  // 创建位图对象
  11.  hbmp = (HBITMAP)LoadImage(NULL, "bj.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
  12.  SelectObject(mdc, hbmp);
  13.  hbmp_all = CreateCompatibleBitmap(hdc, 640, 480);
  14.  SelectObject(mdc_all, hbmp_all);
  15.  // 贴图
  16.  BitBlt(mdc_all, -x, 0, 640, 480, mdc, 0, 0, SRCCOPY);
  17.  BitBlt(mdc_all, 640-x, 0, 640, 480, mdc, 0, 0, SRCCOPY);
  18.  BitBlt(hdc, 0, 0, 640, 480, mdc_all, 0, 0, SRCCOPY);
  19.  // 变量操作
  20.  if(x>=640)
  21.   x = 0;
  22.  else
  23.   x++;
  24.  // 释放
  25.  DeleteDC(mdc);
  26.  DeleteDC(mdc_all);
  27.  DeleteObject(hbmp);
  28.  DeleteObject(hbmp_all);
  29. }

0

阅读 评论 收藏 转载 喜欢 打印举报/Report
  • 评论加载中,请稍候...
发评论

    发评论

    以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

      

    新浪BLOG意见反馈留言板 电话:4000520066 提示音后按1键(按当地市话标准计费) 欢迎批评指正

    新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

    新浪公司 版权所有