陈惠娥 CHEN Hui-e
(广东技术师范学院天河学院,广州 510540)
摘要:“互联网+”时代下的游戏产业发展浪潮席卷全国,游戏普遍成为人们学习、生活与工作之余释放压力的娱乐方式,本文基于Visual C++2010开发平台中的MFC类库,利用矩形碰撞检测算法原理实现一款羊躲狼的游戏。
教育期刊网 http://www.jyqkw.com
关键词 :MFC;碰撞检测算;timer
中图分类号:TP311 文献标识码:A 文章编号:1006-4311(2015)26-0189-02
作者简介:陈惠娥(1984-),女,广东茂名人,讲师,硕士,研究方向为课程与教学、数据库系统。
0 引言
在游戏开发中,经常会用到碰撞检测算法,进行碰撞检测的物体形状有规则的和不规则,当需要检测时,常把复杂的不规则物体处理成规则形状的物体(如圆或者矩形),然后分别进行圆或者矩形的碰撞检测。本文主要是对狼和羊的位图进行碰撞检测,可转化为规则物体中的矩形碰撞检测,其原理主要运用规则四边形的X,Y坐标进行检测,常态下物体的相遇都可以用矩形相遇检测算法进行测试,实现的原理就是检测两个矩形是否重叠。
1 矩形碰撞检测算法的原理
假设位图狼矩形的参数是:左上角的坐标是(wolf1x,wolf1y),宽度是w1,高度是h1;位图羊矩形的参数是:左上角的坐标是(sx,sy),宽度是w2,高度是h2。在检测时,关键比较中心点的坐标在x和y方向上的距离和宽度的关系。从数学角度理解,可转化为(求两个位图矩形中心点在x方向的距离的绝对值小于等于矩形宽度和的二分之一,同时y方向的距离的绝对值小于等于矩形高度和的二分之一)x方向:|(wolf1x+w1/2)-(sx+w2/2)|<|(w1+w2)/2|,y方向:|(wolf1y+h1/2)-(sy+h2/2)|<|(h1+h2)/2|。从编程角度思考,碰撞检测的判断条件可转化为if(wolf1x>=sx-w1 && wolf1x<=sx+w2 && wolf1y>=sy-h1 && wolf1y<=sy+h2)应用。
2 羊躲狼的MFC游戏系统设计
2.1 羊躲狼的游戏设计思想
基于MFC库类创建单文档项目为sheep,设计羊躲狼的二维游戏,游戏中狼的出现每次都由随机函数产生,玩家通过键盘上的“上、下、左、右”四个方向键来控制羊的移动,进而躲避狼的袭击。当狼与羊相遇时,显示羊被吃的消息框,及羊被吃产生的图像。通过创建位图类成员函数成员变量,编辑控件创建消息映射,调用消息函数完成数据的输入输出,实现功能。游戏界面简洁,规则易懂,在娱乐放松的同时又能锻炼人的反应能力。
2.2 羊躲狼的游戏资源设计
在资源视图中分别导入羊位图、狼位图、以及绘制出相遇产生的效果位图,羊位图的ID为(IDB_BITMAP1)、8只狼位图的ID为(IDB_BITMAP2~IDB_BITMAP9)和相遇产生被吃的位图(IDB_BITMAP10)。
3 羊躲狼游戏的核心变量与成员函数
主要成员变量:声明表示羊位图的变量(CBitmap m_sheep;坐标int sx,sy;)同时赋予初值(sx=300;sy=300;),分别声明表示八只狼位图的变量(CBitmap m_wolf1,m_wolf2,m_wolf3,m_wolf4,m_wolf5,m_wolf6,m_wolf7,m_wolf8;坐标int wolf1x,wolf1y;),狼与羊相遇产生的位图变量(CBitmap m_cross;坐标int cx,cy;),以及相遇的次数变量int n并赋予初值n=0;同时声明void Drawsheeps(CDC *pDC);//羊位图函数。void Drawcross(CDC *pDC);//相遇产生的位图函数。void Drawwolf1(CDC *pDC);//分别声明八只狼位图函数。
主要成员函数:整个程序的核心部分在于如何检测碰撞,其羊与狼的位图可转化成矩形的条件可转化为if(wolf1x>=sx-w1 && wolf1x<=sx+w2 && wolf1y>=sy-h1 && wolf1y<=sy+h2),程序中需要通过LoadBitmap(IDB_BITMAP1)函数,函数实现(IDB_BITMAP1- IDB_BITMAP10)对羊位图、狼位图、相遇产生的位图的调用。同时通过rand()函数分别实现八只狼位图随机产生的X,Y坐标上狼的数量。加载自定义的羊的位图函数void CsheepView::Drawsheep(CDC *pDC)实现绘制羊。
同时加载自定义狼的位图函数void CsheepView::Drawwolf1 (CDC *pDC)实现绘制狼。
void CsheepsView::Drawwolf1(CDC *pDC)
{
CDC pC;
pC.CreateCompatibleDC(pDC);
BITMAP bm1;
m_wolf1.GetObject(sizeof(BITMAP),&bm1);
CBitmap gBitmap,* pOldbm;
gBitmap.CreateCompatibleBitmap(pDC,bm1.bmWidth,bm1.bmHeight);
pOldbm =(CBitmap*) pC.SelectObject(&gBitmap);
pC.SelectObject(&m_wolf1);
pDC->BitBlt(wolf1x,wolf1y,bm1.bmWidth,bm1.bmHeight,&pC,0,0,SRCCOPY);
pC.SelectObject(pOldbm);
}
加载羊与狼相遇产生的自定义位图函数void CsheepView::Drawcross(CDC *pDC)。
void CsheepsView::Drawcross(CDC *pDC)
{
CDC pC;
pC.CreateCompatibleDC(pDC);
BITMAP bm;
m_cross.GetObject(sizeof(BITMAP),&bm);
CBitmap gBitmap,*pOldbm;
gBitmap.CreateCompatibleBitmap(pDC,bm.bmWidth,bm.bmHeight);
pOldbm =(CBitmap*) pC.SelectObject(&gBitmap);
pC.SelectObject(&m_cross);
pDC->BitBlt(sx,sy,bm.bmWidth,bm.bmHeight,&pC,0,0,SRCCOPY);
pC.SelectObject(pOldbm);
}
最后通过响应键盘函数voidCsheepsView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)实现控制羊向四个方向移动的范围以及羊移动的速度。
为了实现随机出现狼的位图,需要添加定时器函数来控制。可通过类视图菜单项,在MFC ClassWizard中,选择CsheepView类,选择WM_TIMER、WM_CREATE消息,自动生成对应的消息函数。在OnCreate函数中添加:SetTimer(1,100,NULL);//定时器,并在OnTimer函数中添加代码,控制羊随机出现的位置以及出现的速度,游戏结果如图2、图3。
4 羊躲狼游戏设计总结
在游戏开发中,圆和矩形的碰撞检测是最基本的碰撞检测算法,现实编程过程中遇到的碰撞检测问题要比这类问题复杂,同时需要运用其他形式的检测。此游戏用MFC的方法设计时遇到了很多问题,尤其是碰撞检测原理部分的处理。后期开发需要增加游戏的级别,添加障碍物以及工具,增加游戏的难度。
教育期刊网 http://www.jyqkw.com
参考文献:
[1]候俊杰.深入浅出MFC[M].武汉:华中科技大学出版社,2005.
[2]Conger C++游戏开发[M].北京:机械工业出版社,2007.
[3]郑丽.C++语言程序设计[M].北京:清华大学出版社,2010.
[4]黄明.VC++深入详解[M].北京:电子工业出版社,2012.
[5]杜青.VC++.NET(2008)课程设计经典案例[M].北京:清华大学出版社,2012.
[6]杨均匀.MFC编程及应用[M].二版.北京:清华大学出版社,2012.
[7]陈文宇.面向对象程序设计语言C++上机指导[M].北京:机械工业出版社,2009.
[8]刘玉英.程序设计基础——C++实验指导玉课程设计[M].人民邮电出版社,2007.