二维游戏程序部分
1、 VC中的绘图类(CBitmap,CBrush,CFont,CPen)的使用。
(1)CPen类是CGdiObject类的一个派生类,它封装了Windows图形设备接口(GDI)中有关画笔的操作。
CPen pen;
Pen.CreatePen(PS_SOLID,1,RGB(255,0,0));(画笔的风格,宽度,颜色)//定义一个CPen对象,用其成员函数CreatePen或 CreatePenIndirect对其进行初始化。CPen pen(PS_SOLID,1,RGB(255,0,RGB(255,0,0));//定义一个CPen对象,并一次性地初始化它的所有参数。
(2)CBrush类是CGdiObject类的一个派生类,它封装了Windows图形设备界面(GDI)中有关画刷的操作。
CBrush brush(RGB(255,0,0));//定义CBrush类对象,并利用构造函数对对象的参数进行初始化。
(3)CFont类是CGdiObject类的一个派生类,它封装了逻辑字体及方法。
CFont类只有一个构造函数,在定义了一个CFont类对象之后,必须用成员函数CreateFont或CreateFontIndirect来初始化CFont对象的参数。
BOOL CreateFont(
int nHeight, //以逻辑单位方式指定字体的宽度
int nWidth, //以逻辑单位方式指定字体中字符的平均宽度
int nEscapement, //指定偏离垂线和X轴在显示面上的夹角(单位:0.1度)
int nOrientation, //指定符串基线和X轴之间的夹角(单位:0.1度)
int nWeight, //指定字体镑数
BYTE bItalic, //指定字体是否为斜体
BYTE bUnderline, //指定字体是否带下划线
BYTE cStrikeOut, //指定是否是字体字符突出
BYTE nCharSet, //指定字体的字符集
BYTE nOutPrecision, //指定所需的输出精度
BYTE nClipPrecision, //指定所需的剪贴精度
BYTE nQuality, //指示字体的输出质量
英文情景对话BYTE nPitchAndFamily, //指定字体的间距和家族
LPCTSTR lpszFacename //指定字体字样的名称)
(4)CBitmap类和Cpen、CBrush类一样,是CGdiObject类的派生类,它封装了使用Windows GDI进行图形绘制中关于位图的操作。CreateBitmap 用一个指定宽度、高度和位图模式的依赖于设备的内存位图初始化位图对象。 CreateCompatibleBitmap 用一个位图初始化对象使之与指定设备兼容。在CBitmap类中重载了两个LoadBitmap函数,用于加载位图资源:
BOOL LoadBitmap( LPCTSTR lpszResourceName );
BOOL LoadBitmap( UINT nIDResource )
HBITMAP CreateBitmap(int nWidth,int nHeight, UINT cPlanes, UINT cBitsPeral,CONST VOID *lpvBits);
nWidth:指定位图宽度、单位为像素。
nHeight:指定位图高度、单位为像素。
CPlanes:指定该设备使用的颜色位面数目。
CBitsPerPel:指定用来区分单个像素点颜色的位数(比特数目)
LpvBits:指向颜色数据数组指针。
2 、argumentVC中显示位图的过程,需要掌握的函数包括:
GetClientRect( &rect);//取得客户区域大小
CreateCompatibleDC(&dc);//创建适合指定pDC内存设备环境 mdc->CreateCompatibleDC(&dc);
四级模拟题LoadImage(); //将位图装入内存
m[i]->m_hObject(HBITMAP)::LoadImage(NULL,str,IMAGE_BITMAP,440,74,LR_LOADFROMFILE);
photo booth
( 处理包含被装载图像模块的实例, 处理图像装载, 指定被装载图像类型, 指定图标或光标的宽度,指定图标或光标的高度, 根据参数lpszName的值装载图像)
SelectObject(); //恢复设备环境mdc1->SelectObject(bgbmp);
BitBlt();//显示位图dc.BitBlt(0,0,rect.right,rect.bottom,mdc,0,0,SRCCOPY);( 目标矩形区域左上角的X,y轴逻辑坐标, 目标矩形区域的逻辑宽度,高度,设备环境的句柄,源矩形区域左上角的X,y轴逻辑坐标,指定光栅操作代码)
3 镂空图的原理及相关函数实现。
(1) 获取图片背景设为黑色0,0,0,前景色为彩色1,2,3,图片蒙版前景色置为黑色0,0,0,背景色置为白色255,255,255,利用BitBlt函数将蒙版与背景图做AND运算,并贴图到目的DC。
再将要镂空的图与背景图做OR运算,贴图到目的DC:
(2)相关函数:
GetClientRect(&rect);//取得客户取大小
mdc->CreateCompatibleDC(pDC);//建立内存DC
bgbmp->m_hObject=(HBITMAP)::LoadImage(NULL,"b1.bmp",IMAGE_BITMAP,rect.right,rect.bottom,LR_LOADFROMFILE);//加载背景位图
bitmap->m_hObject=(HBITMAP)::LoadImage(NULL,"man.bmp",IMAGE_BITMAP,208,154,LR_LOADFROMFILE); mdc->SelectObject(m_bgBmp);//取得背景图
mdc->BitBlt(0,0,rect.right,rect.bottom,mdc,0,0,SRCCOPY);//贴背景图
mdc->SelectObject(m_manBmp);
mdc->BitBlt(250,150,104,154,mdc,104,0,SRCAND);//将蒙版与背景图做AND运算
mdc->BitBlt(250,150,104,154,mdc,0,0,SRCPAINT);//将要镂空的图与背景图做OR运算
4、定时器的使用方法。
(1)在WM_CREATE中设置定时器UINT SetTimer(1,100,NULL);(窗口句柄,定时器ID,时间间隔,单位为毫秒,) 设置并启动一个时间间隔为100ms的定时器,消息响应函数是onTimer();
(payme是什么意思2)在WM_TIMER消息中响应定时器
(3)调用KillTimer来取消定时器。在MFC程序中我们可以直接调用KillTimer(int nIDEvent)来取消定时器。
当设置多个定时器时if(nIDEvent==2)
5. 粒子系统的实现。
粒子系统都由大量的粒子构成,每个粒子都有一组属性,如位置、大小以及纹理度等属性。粒子属性的初始值常常都是随机值,而粒子的产生也常常是由位于空间中某个位置的粒子源产生的。我们会根据预定的要求,产生一定数目的新粒子。粒子的各项初始属性都可以用rand函数来在一定的范围内赋上随机的值。粒子有位置和移动速度,自旋速度等等属性,这就需要在每一帧当中根据原来的粒子的位置、移动速度和自旋速度重新进行计算和赋值更新。
struct snow
{ int x;
adults videos int y;
BOOL exist;};
int i,count;
snow drop[50];
void canvasFrame::OnTimer(UINT nIDEvent)
{ if(count<50)
{
drop[count].x = rand()%rect.right;
drop[count].y = rand()%rect. bottom;
drop[count].exist = true;
count++;
}贴图drop[i].y+=10;
wraps
}
6、 键盘交互的实现。
首先在相关类中建立起消息响应函数,选择该消息与函数对应,在消息响应函数中对于每个键写相关代码.
void canvasFrame::OnKeyDown(UINT nChar按得哪个键 ,UINT nRepCnt, UINT nFlags是否按下)
{ Switch(nChar)
{ ca VK_LEFT;Object1.left=Object1.left-5; 按下左键控件左移5个单位break;
ca VK_RIGHT;Object1.left=Object1.left+5; //按下右键控件右移5个单位break;
ca VK_p-5;//按下上键控件上移5个单位break;
ca VK_p+5; //按下下键控件下移charlie hebdo5个单位break;
defult: break;
}
7、鼠标交互的实现。
void canvasFrame::OnMouMove(UINTnFlags,CPointpoint);当鼠标移动时调用此函数 。
参数:nFlags指示各种虚拟按键是否按下 ,此参数可以是任何下列值的组合:
MK_CONTROL当CTRL键按下时。MK_LBUTTON当鼠标左键按下时。MK_MBUTTON当鼠标中键按下时。
MK_RBUTTON当鼠标右键按下时.MK_SHIFT当SHIFT按下时。
point:鼠标的X,Y坐标:该坐标为 鼠标距离截获该消息的窗口左上角的位置 是一个相对位置而不是在屏幕像素上的绝对位置。
较高要求:
物体间碰撞检测方法及相关实现。
(1)像素检测
hmask->GetObject(sizeof(BITMAP),&bm);
// int GetObject(HGDIOBJ hgdiobj, int cbBuffer, LPVOID lpvObject);(指向感兴趣的图形对象的句柄, 指定将要写到缓冲区的信息的字节数目, 英语配音网站指向一个缓冲区的指针 该缓冲区将要检索指定图形对象的信息)
unsigned char *px1 = new unsigned char[bm.bmHeight*bm.bmWidthBytes];
hmask->GetBitmapBits(bm.bmHeight*bm.bmWidthBytes,px1);
// LONG GetBitmapBits(HBITMAP hbmp, LONG cbBuffer, LPVOID lpvBits);( 指向感兴趣的gfh位图的句柄,;指定要从位图拷贝到缓冲区的字节数。指向接收位图位数据的缓冲区指针;这些位是按字节类型存储在数组中的)