




已阅读5页,还剩9页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第一章 游戏基础 一 动画游戏是动画的延伸,只要知道了动画的原理,在动画变化时,使它根据键盘或鼠标的输入操作而变化,就是游戏了。所以在介绍游戏编程之前,先讲讲动画。动画一般分三种形式:形变、位变、色变。如下:1 1 形变 即几种形状的图形或位图依次转变而成。(图1-1) 图1-1先看一个简单的实例:a a 新建工程1_1,选择单文档,完成。b b 在view类加变量int ituxing,并在构造函数里赋值为ituxing=0;c c 在OnDraw(CDC* pDC)函数上添上以下语句: void CMy1_1View:OnDraw(CDC* pDC)CMy1_1Doc* pDoc = GetDocument();ASSERT_VALID(pDoc);/ TODO: add draw code for native data here /清除当前图形CBrush mybrush1;mybrush1.CreateSolidBrush(RGB(255,255,255);CRect myrect1(0,0,1024,768);pDC-FillRect(myrect1,&mybrush1);/判断当前图形ituxingif(ituxing=1) /ituxing=1,画矩形pDC-Rectangle(20,20,89,89);else if(ituxing=2)/ituxing=2,画圆 pDC-Ellipse(20,20,89,89); else/否则,画三角形pDC-MoveTo(20,20);pDC-LineTo(89,45); pDC-LineTo(20,89);pDC-LineTo(20,20);d d 添加OnTimer(UINT nIDEvent)和OnCreate(LPCREATESTRUCT lpCreateStruct),并加上语句如下: void CMy1_1View:OnTimer(UINT nIDEvent) / TODO: Add your message handler code here and/or call default/获取指针pdcCDC *pDC=GetDC();/调用OnDraw(pDC)重画OnDraw(pDC);/使ituxing循环ituxing=(ituxing+1)%3;CView:OnTimer(nIDEvent);int CMy1_1View:OnCreate(LPCREATESTRUCT lpCreateStruct) if (CView:OnCreate(lpCreateStruct) = -1)return -1;/ TODO: Add your specialized creation code here/设置更新时间SetTimer(1, 750, NULL);return 0;e e 完成。2 2 位变 即同一个图形或位图依次在不同的位置上出现而形成动画。(图1-2) 图 1-2见实例1_2:a. a. 复制实例1_1文件夹,改名为1_2。把void CMy1_1View:OnTimer(UINT nIDEvent)中的ituxing=(ituxing+1)%3;改为ituxing=(ituxing+1)%10;b. b. 把OnDraw(CDC* pDC)函数改为: void CMy1_1View:OnDraw(CDC* pDC)CMy1_1Doc* pDoc = GetDocument();ASSERT_VALID(pDoc);/ TODO: add draw code for native data here/清除当前图形CBrush mybrush1;mybrush1.CreateSolidBrush(RGB(255,255,255);CRect myrect1(0,0,1024,768);pDC-FillRect(myrect1,&mybrush1);/用当前图形位置ituxing/画圆pDC-Ellipse(30*ituxing,30*ituxing,30*ituxing+50,30*ituxing+50); c. c. 执行,OK! 3 3 色变 即利用不同颜色的转变而形成有动感的图画。(图1-3) 图1-3 实例1_3:a. a. 新建单文档工程1_3。b. b. 添加参数int icolor并赋值为0。c. c. 添加函数OnTimer(UINT nIDEvent)和OnCreate(LPCREATESTRUCT lpCreateStruct),并添加语句如下: void CMy1_3View:OnTimer(UINT nIDEvent) / TODO: Add your message handler code here and/or call defaulticolor+=1; /此函数使客户区失效,以致重画Invalidate();CView:OnTimer(nIDEvent);int CMy1_3View:OnCreate(LPCREATESTRUCT lpCreateStruct) if (CView:OnCreate(lpCreateStruct) = -1)return -1;/ TODO: Add your specialized creation code hereSetTimer(1,750,NULL);return 0;d. d. 最后在OnDraw(CDC* pDC)加上画圆语句: void CMy1_3View:OnDraw(CDC* pDC)CMy1_3Doc* pDoc = GetDocument();ASSERT_VALID(pDoc);/ TODO: add draw code for native data here/获取icolor值 int i=icolor; /在不同位置画四个不同颜色的圆 CBrush brush1(RGB(20+(64*i)%255,140+(64*i)%255,210*(64+i)%255);CBrush*pOldBrush1=pDC-SelectObject(&brush1); pDC-Ellipse(300,200,350,250); pDC-SelectObject(pOldBrush1);CBrush brush2(RGB(84+(64*i)%255,204+(64*i)%255,24+(64*i)%255);CBrush*pOldBrush2=pDC-SelectObject(&brush2); pDC-Ellipse(350,200,400,250); pDC-SelectObject(pOldBrush2);CBrush brush3(RGB(148+(64*i)%255,14+(64*i)%255,88+(64*i)%255);CBrush*pOldBrush3=pDC-SelectObject(&brush3); pDC-Ellipse(300,250,350,300); pDC-SelectObject(pOldBrush3);CBrush brush4(RGB(212+(64*i)%255,78+(64*i)%255,152+(64*i)%255);CBrush*pOldBrush4=pDC-SelectObject(&brush4); pDC-Ellipse(350,250,400,300);pDC-SelectObject(pOldBrush4); e. e. 完成。以上是三种最基本的动画。当然,具体情况不会这么简单,而往往的其中二或三种的复杂的结合。而作为游戏,它的关键在:在动画的基础上加一些主观的操作。如先画一个球,然后用方向键或鼠标移动。如实例1_4:a. a. 新建单文档工程1_4。b. b. 添加半径和圆心 int ir;/半径 CPoint center;/圆心在CMy1_4View()中赋值如下: CMy1_4View:CMy1_4View()/ TODO: add construction code here center.x=400;center.y=200;ir=50;c. c. 在OnDraw(CDC* pDC)函数中画圆 void CMy1_4View:OnDraw(CDC* pDC)CMy1_4Doc* pDoc = GetDocument();ASSERT_VALID(pDoc);/ TODO: add draw code for native data here/画圆 pDC-Ellipse(center.x-ir,center.y-ir,center.x+ir,center.y+ir); d. d. 添加OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags),使它按照键盘方向键的操作而移动圆的位置。如下: void CMy1_4View:OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) / TODO: Add your message handler code here and/or call default/利用方向键左右上下移动20switch(nChar)case VK_LEFT: center.x-=20;break;case VK_RIGHT: center.x+=20;break;case VK_UP: center.y-=20;break;case VK_DOWN: center.y+=20;break;/重画Invalidate();CView:OnKeyDown(nChar, nRepCnt, nFlags); e. e. 执行,看看效果,你就可以操纵了。f. f. 那么,利用鼠标又是怎样操作呢?添加OnLButtonDown(UINT nFlags, CPoint point)如下: void CMy1_4View:OnLButtonDown(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call default/把圆移动鼠标指定位置/圆心赋值为pointcenter=point; /重画Invalidate();CView:OnLButtonDown(nFlags, point); g. g. 再执行,你现在键盘鼠标都可以操作了。真正的游戏,也就是以上简单的图形或位图的复杂化和简单操作的复杂化而已。 二 部分图更新既然游戏是动画,就离不开“动”,而所谓“动”,就是利用画面的刷新,用新的要求的图画或位置去代替原先的图画或位置。图画储存在哪里?内存。画图需要什么?系统资源。而它们有什么关系?成正比。为什么说这些呢?因为这关系到游戏编程一个极大的问题:速度!上面那些简单的例子,我们是怎样实现的呢?不就是利用一个控制时间的函数定期地对画面进行重画吗?它们的速度快吗?快。是的,但如果你编一个大屏幕的画面,并在上面画上几十种图形,添上几十种颜色,然后再利用上面的方法试试,速度还快吗?慢了。为什么?因为这个图画太占用内存,需要太多的系统资源,我们的机器满足不了要求,变慢了。怎样解决呢?一切的计算机图形都是利用部分图形重画的原理!一种是:只保存要改变的那部分图形,然后把要改变的新图接在已保存过画面的范围内,形成新的图。接着把刚才保存的图画还原,变成原先的图画。再保存另一个地方,贴上新图,变成新图画,再还原。反复进行(如下图1-4)。一种是:不重画,直接在要变化的位置变化。 图1-4 实例1_5:一个正方形在复杂的画面上移动。要求:先用全部重画做一次,再用部分重画做一次,对比一下。a. a. 新建单文档工程,添加两个变量: int ixunhuan; CBitmap m_Bitmap;b. b. 添加位图 IDB_BITMAP1,即狮子图象。 图1-5c. c. 在构造函数里面添加两个语句: CMy1_5View:CMy1_5View()/ TODO: add construction code here/获得位图 m_Bitmap.LoadBitmap(IDB_BITMAP1);ixunhuan=0; d. d. 添加虚函数OnInitialUpdate() ,初始化位图变量 e. e. 添加OnCreate(LPCREATESTRUCT lpCreateStruct)和OnTimer(UINT nIDEvent)函数如下: int CMy1_5View:OnCreate(LPCREATESTRUCT lpCreateStruct) if (CView:OnCreate(lpCreateStruct) = -1)return -1;/ TODO: Add your specialized creation code hereSetTimer(1,1200,NULL);return 0;void CMy1_5View:OnTimer(UINT nIDEvent) / TODO: Add your message handler code here and/or call default/ TODO: Add your message handler code here and/or call default /即大于400后变小 ixunhuan=(ixunhuan+30)%400;Invalidate(); CView:OnTimer(nIDEvent);f. f. 在OnDraw(CDC* pDC)函数中添加画多图形多颜色的语句,并加上狮子位图如下: void CMy1_5View:OnDraw(CDC* pDC)CMy1_5Doc* pDoc = GetDocument();ASSERT_VALID(pDoc);/ TODO: add draw code for native data here CDC Dc; if(Dc.CreateCompatibleDC(pDC)=FALSE) AfxMessageBox(Cant create DC); /画复杂图形,有多种颜色for(int j=0;j25;j+) for(int i=0;iFillRect(myrect1,&mybrush1); /圆 pDC-Ellipse(20*i,20*j,20*i+20,20*j+20);/小正方形CRect myrect2(20*i+4,20*j+4,20*i+16,20*j+16);pDC-FillRect(myrect2,&mybrush1);/小圆pDC-Ellipse(20*i+4,20*j+4,20*i+16,20*j+16);/更小正方形 CRect myrect3(20*i+7,20*j+7,20*i+13,20*j+13);pDC-FillRect(myrect3,&mybrush1);/更小圆pDC-Ellipse(20*i+7,20*j+7,20*i+13,20*j+13);/最小正方形 CRect myrect4(20*i+9,20*j+9,20*i+11,20*j+11);pDC-FillRect(myrect4,&mybrush1); /在不同位置显示位图 Dc.SelectObject(m_Bitmap); pDC-StretchBlt(70+ixunhuan,70,160,160,&Dc,0,0,71,71,SRCCOPY); g. g. 执行,你就可以看到它重画时有多慢了。h. h. 现在,再用部分重画做:把OnTimer(UINT nIDEvent)函数改为如下: void CMy1_5View:OnTimer(UINT nIDEvent) / TODO: Add your message handler code here and/or call default/ TODO: Add your message handler code here and/or call default ixunhuan=(ixunhuan+30)%400;/如果图象回到开头,全部重画 if(ixunhuanFillRect(myrect1,&mybrush1); g. g. 运行,怎么样?图象还会变大呢! 四 显示对称图像上面既然谈到了位图的透明显示,那么,我们经常用到的另外一种显示方式:对称,也就该接着说明一下。毕竟,无论是人,或是景,我们都讲究对称,特别是中国人;无论你向左,还是向右,它的图像一般也是讲究对称的。既然对称在我们的社会里,在我们的文化中是多么地受到人们的追求,人们是非常强烈地以对称为美,我们就必须学会怎样用程序来实现它。这也就是我把它放在前面讲的原因。下面,我们就来说明对称位图的实现。我们的程序语言里面有许多关于位图的操作,包括位图的复制,放大缩小,位图的反转甚至布尔运算。但是,我们找不到对称的操作。开始,我也不知道该怎么办,难道一边看着位图,一边对称地画另一张位图吗?事实上,我差一点就这么做了。但是,我突然发现,我可以一行一行地利用复制的方法,在原来的位图上面复制一行或一列,然后粘贴到另一张位图上面对称的地方去。我是这么做了,并且由于我的这个实践,我发现,我根本就可以利用程序的for循环来帮助我完成这一件事。甚至,让它能够按照我们的意愿放大缩小,按照我们的意愿在我们希望的位置显示。实例如下:添加单文档工程1_7,添加一个位图,改变如下函数:由于下面说明清楚,不再细说。 void CMy1_7View:OnDraw(CDC* pDC)CMy1_7Doc* pDoc = GetDocument();ASSERT_VALID(pDoc);/ TODO: add draw code for native data hereint x,y,width,height,i;/设置反面显示位图的起点和大小/可以在别的地方设置,赋值x=350;y=30;width=240;height=200; BITMAP m_bm;CDC Dc;if(Dc.CreateCompatibleDC(pDC)=FALSE)AfxMessageBox(Cant create DC);/ 选入位图 Dc.SelectObject(bitmap);GetObject(bitmap, sizeof(BITMAP), (LPSTR)&m_bm); /显示位图宽高 POINT ptSize; / 取得位图的宽度 ptSize.x = m_bm.bmWidth; / 取得位图的该度 ptSize.y = m_bm.bmHeight; /显示正面位图 pDC-StretchBlt(10,30,240,200,&Dc,0,0,ptSize.x,ptSize.y,SRCCOPY); /显示反面位图/以下参数的说明:/x+(i*width/ptSize.x)表示每个循环的起点位置,/其中width/ptSize.x表示每次移动的大小/y为显示的top/height为显示位图的高度/ptSize.x-i为每次SRCCOPY的起点x /在不同位置显示位图 for( i=0;iStretchBlt(x+(i*width/ptSize.x),y,width/ptSize.x,height,&Dc,ptSize.x-i,0,1,ptSize.y,SRCCOPY);运行,效果就在第一页。 五 游戏的内核上面所说的,并不是游戏,它只能算是游戏中的一些元素。一个游戏,不可能只是表面图形这么简单,我们还没有谈到它的实质的东西内核。我们后面将讲到的挖雷游戏、俄罗斯方块等,都是一些简单的游戏,可是,第一次接触时,你能说出它的原理吗?它是怎么实现的吗
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 供应商年度供货协议合同
- 个人土地股权放弃协议书
- 海燕说课稿说课稿
- 2026届福建省三明市尤溪县普通高中高二化学第一学期期中监测试题含解析
- 甘肃省兰州市兰州第一中学2026届化学高二上期末复习检测试题含答案
- 四川省成都市嘉祥教育集团2026届化学高二第一学期期末达标检测模拟试题含答案
- 四川省成都龙泉中学2026届化学高一第一学期期末监测试题含解析
- 2026届辽宁省大连市大世界高级中学化学高二上期末考试模拟试题含答案
- 2026届广东省广州仲元中学化学高二第一学期期末教学质量检测试题含答案
- 广东省深圳市红岭中学2026届高三上化学期中达标检测试题含解析
- CloudFabric云数据中心网解决方案-Underlay网络
- 场地平整工程合同范本
- 塑料注塑采购合同范本
- 供暖合同能源管理合同
- 快递驿站承包协议书
- 2024-2030年中国铁基纳米晶带材行业应用状况与需求趋势预测研究报告
- 低空经济基础知识 -彻底看懂低空经济 2024
- 手术室胃肠外科进修汇报
- 儿童骨龄评价及身高促进学习培训课件
- TCALC 003-2023 手术室患者人文关怀管理规范
- 九型人格测试108题官方标准版-直接出答案
评论
0/150
提交评论