一、基本思路

1.首实现斜角贴图,需要显示菱形图块,使用矩形图块贴图,但是要将它的周围进行透明处理,只显示菱形部分

2.计算图块索引值的公式:

列编号 = 索引值 / 每一列的图块个数;

行编号 = 索引值 % 每一列的图块个数;

3.计算每一图块的贴图坐标公式,设矩形(菱形)长w,宽h,(xstart,ystart)为起始坐标

左上点x坐标 = xstart + 行编号 * (w/2)  -  列编号 * (w/2)

左上点y坐标 = ystart + 列编号 * (h/2)  -  列编号 * (h/2)

4.每贴好一块斜角地图,接着判断该地图是否需要贴景物?是的话,贴哪种景物?这要由sceneIndex[10*10]来决定,原理同取      图块一样,根据取出的值判断在该斜角地图贴什么景物或者不进行贴图,至于贴图坐标,斜角地图左上角坐标为参考,向右下    方挪个差不多就行了;

二、代码实现


#include "stdafx.h"
#include <stdio.h>HINSTANCE hInst;
HBITMAP fullmap;
HDC     mdc;const int rows = 10,cols = 10;ATOM                MyRegisterClass(HINSTANCE hInstance);
BOOL                InitInstance(HINSTANCE, int);
LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
void                MyPaint(HDC hdc);int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR     lpCmdLine,int       nCmdShow)
{MSG msg;MyRegisterClass(hInstance);if (!InitInstance (hInstance, nCmdShow)) {return FALSE;}while (GetMessage(&msg, NULL, 0, 0)) {TranslateMessage(&msg);DispatchMessage(&msg);}return msg.wParam;
}ATOM MyRegisterClass(HINSTANCE hInstance)
{WNDCLASSEX wcex;wcex.cbSize = sizeof(WNDCLASSEX); wcex.style          = CS_HREDRAW | CS_VREDRAW;wcex.lpfnWndProc = (WNDPROC)WndProc;wcex.cbClsExtra     = 0;wcex.cbWndExtra        = 0;wcex.hInstance     = hInstance;wcex.hIcon         = NULL;wcex.hCursor        = NULL;wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);wcex.hbrBackground   = (HBRUSH)(COLOR_WINDOW+1);wcex.lpszMenuName  = NULL;wcex.lpszClassName  = "canvas";wcex.hIconSm      = NULL;return RegisterClassEx(&wcex);
}BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{HWND hWnd;HDC hdc,bufdc;hInst = hInstance;hWnd = CreateWindow("canvas", "绘图窗口" , WS_OVERLAPPEDWINDOW,CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);if (!hWnd){return FALSE;}MoveWindow(hWnd,10,10,640,400,true);ShowWindow(hWnd, nCmdShow);UpdateWindow(hWnd);int mapIndex[rows*cols] = { 2,2,2,2,2,0,1,0,1,0,  //材13,3,2,2,0,0,0,1,1,0,  //材23,0,0,0,0,0,0,0,1,2,  //材32,2,0,0,0,0,0,2,2,2,  //材42,2,0,0,0,0,2,2,2,2,  //材52,2,0,0,0,2,2,0,0,2,  //材62,0,0,2,2,2,0,0,1,0,  //材70,0,2,0,0,0,1,1,1,1,  //材80,2,0,3,3,3,3,3,3,1,  //材92,0,3,3,3,3,3,3,3,3 };//材10int sceneIndex[rows*cols] = { 0,2,2,0,2,0,1,0,1,1,  //材10,0,0,0,0,0,0,1,1,0,  //材20,0,0,0,0,0,1,0,1,0,  //材30,0,1,0,1,0,0,0,2,0,  //材42,2,0,0,1,0,0,0,0,2,  //材50,0,0,0,0,0,0,0,0,0,  //材60,0,1,0,0,0,0,0,1,0,  //材70,0,0,0,0,0,1,1,1,1,  //材81,0,0,0,0,0,0,0,0,1,  //材92,0,0,0,0,0,0,0,0,0 };//材10hdc = GetDC(hWnd);mdc = CreateCompatibleDC(hdc);bufdc = CreateCompatibleDC(hdc);HBITMAP map[4],scene[2];//4种图块类型,2种景物类型char filename[20] = "";int rowNum,colNum;int i,x,y;int xstart,ystart;xstart = 32 * (rows-1);ystart = 0;fullmap = (HBITMAP)LoadImage(NULL,"bg.bmp",IMAGE_BITMAP,640,480,LR_LOADFROMFILE); SelectObject(mdc,fullmap);for(i=0;i<4;i++){sprintf(filename,"map%d.bmp",i);map[i] = (HBITMAP)LoadImage(NULL,filename,IMAGE_BITMAP,128,32,LR_LOADFROMFILE);}for(i=0;i<2;i++){sprintf(filename,"scene%d.bmp",i+1);//1和2两种景物scene[i] = (HBITMAP)LoadImage(NULL,filename,IMAGE_BITMAP,100,60,LR_LOADFROMFILE);}for (i=0;i<rows*cols;i++){SelectObject(bufdc,map[mapIndex[i]]);//根据map数组,取出相应的图块到bufdcrowNum = i / cols;     colNum = i % cols;     x = xstart + colNum * 32 + rowNum * (-32);  y = ystart + rowNum * 16 + colNum * 16;     BitBlt(mdc,x,y,64,32,bufdc,64,0,SRCAND);BitBlt(mdc,x,y,64,32,bufdc,0,0,SRCPAINT);switch(sceneIndex[i])            //根据景物数组,取出相应的景物,1或2就进行贴图.0不做操作{case 1:SelectObject(bufdc,scene[0]);BitBlt(mdc,x+7,y-44,50,60,bufdc,50,0,SRCAND);//(x+7,y-44)是先画图,然后在计算坐标!BitBlt(mdc,x+7,y-44,50,60,bufdc,0,0,SRCPAINT);break;case 2:SelectObject(bufdc,scene[1]);BitBlt(mdc,x+7,y-30,50,60,bufdc,50,0,SRCAND);BitBlt(mdc,x+7,y-30,50,60,bufdc,0,0,SRCPAINT);break;}}MyPaint(hdc);ReleaseDC(hWnd,hdc);DeleteDC(bufdc);return TRUE;
}void MyPaint(HDC hdc)
{SelectObject(mdc,fullmap);BitBlt(hdc,0,0,640,480,mdc,0,0,SRCCOPY);}LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{PAINTSTRUCT ps;HDC hdc;switch (message){case WM_PAINT:                     hdc = BeginPaint(hWnd, &ps);MyPaint(hdc);EndPaint(hWnd, &ps);break;case WM_DESTROY:                    DeleteDC(mdc);DeleteObject(fullmap);PostQuitMessage(0);break;default:                           return DefWindowProc(hWnd, message, wParam, lParam);}return 0;
}

三、效果

Visual C++游戏编程基础之景物贴图相关推荐

  1. Visual C++游戏编程基础之透明半透明效果

    一.基本思路 1.半透明的原理 一张位图由许多像素组成,而每一像素包含R.G.B三原色,三原色的值决定了像素的色彩,要实现半透明效果,需要把前景图    和背景图彼此对应的像素颜色按某一比例进行调配, ...

  2. Visual C++游戏编程基础之多背景循环动画

    一.基本思路 1.现在有三张背景图:天空和草地.山峦.房屋: 2.天空在最远处,其次是草地和山峦(因为山峦在草地上),最后是房屋: 3.背景的循环速度是天空最慢.然后是山峦.最后是草地和房屋: 4.恐 ...

  3. Visual C++游戏编程基础之摩擦力、加速度、重力

    一.基本思路 1.假设小球在空中只受到重力作用,一开始给它一个水平的速度,就像是平抛运动一样: 2.当小球碰到地面时,受到摩擦力作用,分为x方向和y方向: 3.在摩擦力作用下,1.减少水平方向的速度, ...

  4. Visual C++游戏编程基础之利用鼠标消息实现贴图

    一.鼠标键入消息 1.WM_LBUTTONDBLCLK       双击鼠标左键: 2.WM_LBUTTONDOWN         单击鼠标左键: 3.WM_LBUTTONUP            ...

  5. Visual C++游戏编程基础之追逐移动

    一.基本思路 1.追逐移动的实现与飞机追随鼠标光标原理类似: 2.现在小鸟作为追逐者,设定其贴图坐标为(nowX-25,nowY-16),其中(nowX,nowY)是飞机的贴图坐标: 3.通过判断小鸟 ...

  6. Visual C++游戏编程基础之键盘消息

    一.键盘 1.虚拟键码:Windows系统下所有的按键被视为虚拟键(包含鼠标在内),每一个虚拟键都有其对应的虚拟键码: 2.键盘消息 (1)VM_KEWDOWN:按下按键消息: (2)VM_KEYUP ...

  7. VC++游戏编程基础无法找到“d3d9.h”问题

    经反复查阅是缺少Direct X SDK导致的,我用的是VC++6.0,支持Direct X SDK 9.0b及之前的版本,最新版DX SDK(JUNE)VC6驾驭不了...下面是我解决问题的思路(只 ...

  8. 游戏编程基础(五)背景地图滚动显示

    在游戏过程中,背景地图需要跟着人物的移动而动态的滚动变换.C++游戏编程基础中介绍了2D游戏中常用的3种动态背景表现手法.其原理和实现技巧分析如下: 方法一:单一背景滚动         原理是:利用 ...

  9. 游戏编程基础之(一):实现物体在窗口上的往返运动

    近期在学习<C++游戏与图形编程基础>第2版  地址是:http://transbot.blog.163.com/blog/static/5421396120145108282739/ 里 ...

最新文章

  1. C++ 协程介绍[译]
  2. java频繁的new对象 优化方案
  3. js事件流的三个阶段
  4. 阿里新一代分布式任务调度平台Schedulerx2.0破土而出
  5. 【华为云技术分享】【论文阅读】增量式物体检测
  6. major头文件_第三讲,可选头文件格式,以及节表
  7. python学习第十六天 --继承进阶篇
  8. 深度学习实践指南(五)—— 求解异或问题
  9. js 随机数_JS常用方法和一些封装:随机数生成
  10. 删除linux分区后grub,删除Ubuntu分区后GRUB救援问题!
  11. 室内设计——健身房室内设计(包含预览图jpg和.psd文件)
  12. Linux C语言编程学习材料
  13. Redis开发运维实践开发者设计规范之延迟考虑
  14. Makefile--如何将当前文件下的所有*.cpp文件与*.c文件全部生成相应的可执行文件
  15. 网络攻防--网络防御技术(一)
  16. Datawhale组队学习 Task05:字符串(2天)
  17. 做测试为什么要掌握mysql_软件测试工作要掌握的知识
  18. zabbix邮箱告警
  19. python回车换行怎么不行_python回车不能换行怎么办
  20. matlab中停止调试快捷键,matlab软件中各种快捷键的用法,还有和断点有关的用法...

热门文章

  1. java计算机毕业设计高校网上报销系统MyBatis+系统+LW文档+源码+调试部署
  2. 阿斯汤加瑜伽(Ashtanga Yoga)第一序列学习与实践笔记(三)
  3. 史上最全—毕业设计答辩技巧
  4. 栅格图导入 tfw坐标信息文件
  5. 可能是其他人在试图访问您的 Google 帐号。为了安全起见,您暂时无法登录。 请稍后重试,或使用其他设备登录。
  6. 如何用ceres进行两帧之间的BA优化
  7. 泰勒级数展开与圆的轨迹方程曲线
  8. 硅谷之行 (16) 单身民工的生活
  9. 二维码图片怎么转链接?怎么分解二维码成链接网址?
  10. U盘大小的双核 Android 移动电脑:仅重21克