实现敌机层EnemyLayer:让第三类敌机动起来

蒙娜丽宁
企业官方账号
领域专家: 后端开发技术领域
2023-01-13 10:49:00
...全文
223 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复
目 录 1. 概述 3 1.1 实训项目简介 3 1.2 实训功能说明 3 1.2.1 基本功能 3 1.2.2 附加功能 3 2. 相关技术 4 2.1 Windows定时器技术 4 2.2 透明贴图实现技术 4 2.3 CObList链表 5 2.4获取矩形区域 6 2.5使用AfxMessageBox显示游戏过程中的提示信息 6 2.6内存释放 6 2.7 CImageList处理爆炸效果 6 2.8对话框的应用 6 3. 总体设计与详细设计 7 3.1 系统模块划分 7 3.2 主要功能模块 8 3.2.1 系统对象类图 8 3.2.2 系统主程序活动图 9 3.2.3 系统部分流程图 9 4. 编码实现 12 4.1 绘制游戏背景位图程序 12 4.2 飞机大战游戏对象的绘制程序 13 4.3 飞机大战游戏对象战机位置的动态控制 15 4.4 飞机大战游戏对象之间的碰撞实现 17 4.5 游戏界面输出当前信息 19 5. 项目程序测试 20 5.1战机移动及子弹发射模块测试 20 5.2 及炸弹模块测试 20 5.3 爆炸模块测试 20 6. 实训中遇到的主要问题及解决方法 21 7. 实训体会 21 1. 概述 1.1 实训项目简介   本次实训项目是做一个飞机大战的游戏,应用MFC编程,完成一个界面简洁流畅、游戏方式简单,玩起来易于上手的桌面游戏。该飞机大战项目运用的主要技术即是MFC编程中的一些函数、链表思想以及贴图技术。 1.2 实训功能说明 1.2.1 基本功能   (1)设置一个战机具有一定的速度,通过键盘,方向键可控制战机的位置,空格键发射子弹。   (2)界面中出现的位置,以及炸弹的发射均为随机的,炸弹均具有一定的速度,且随着关卡难度的增大,数量和速度均增加。   (3)对于随机产生的炸弹,若超过矩形区域,则释放该对象。   (4)添加爆炸效果,包括战机子弹打中爆炸、炸弹打中战机爆炸、战机与相撞爆炸以及战机子弹与炸弹相撞爆炸四种爆炸效果。且爆炸发生后、子弹、炸弹均消失,战机生命值减一。 1.2.2 附加功能   (1) 为游戏界面添加了背景图片,并在战机发射子弹、战机击中击中战机、以及战机相撞时均添加了背景音效。   (2)为游戏设置了不同的关卡,每个关卡难度不同,炸弹的速度随着关卡增大而加快,进入第二关以后从上下方均会随机出现,且随机发射炸弹。   (3)第一关卡从上方飞出,速度一定,战机每打掉一直则增加一分,每积十分,则为战机增加一个生命值,当战机得分超过50分则可进入下一关;进入第二、三关时速度加快,分别从上下两方飞出,此时战机每得分20、30分,才会增加一个生命值,得分超过100、150分则进入下一关、通关。   (4) 在游戏界面输出当前游戏进行信息,包括当前得分、当前关卡以及击中数量。   (5)增加了鼠标控制战机位置这一效果,战绩的位置随着鼠标的移动而移动,并且点击鼠标左键可使得战机发射子弹。   (6)实现了暂停游戏的功能,玩家可通过键盘上的‘Z’键,对游戏进行暂停。   (7)通过对话框的弹出可提示玩家是否查看游戏说明、是否进入下一关、是否重新开始等消息,使得玩家可自己选择。 2. 相关技术 2.1 Windows定时器技术   Windows定时器是一种输入设备,它周期性地在每经过一个指定的时间间隔后就通知应用程序一次。程序将时间间隔告诉Windows,然后Windows给您的程序发送周期性发生的WM_TIMER消息以表示时间到了。本程序中使用多个定时器,分别控制不同的功能。在MFC的API函数中使用SetTimer()函数设置定时器,设置系统间隔时间,在OnTimer()函数中实现响应定时器的程序。 2.2 透明贴图实现技术   绘制透明位图的关键就是创建一个“掩码”位图(mask bitmap),这个“掩码”位图是一个单色位图,它是位图中图像的一个单色剪影。   在详细介绍实现过程之前先介绍下所使用的画图函数以及函数参数所代表的功能;整个绘制过程需要使用到BitBlt()函数。整个功能的实现过程如下:    (1) 创建一张大小与需要绘制图像相同的位图作为“掩码”位图;    (2) 将新创建的“掩码”位图存储至掩码位图的设备描述表中;    (3) 把位图设备描述表的背景设置成“透明色”,不需要显示的颜色;    (4) 复制粘贴位图到“掩码”位图的设备描述表中,这个时候“掩码”位图设备描述表中存放的位图与位图设备描述表中的位图一样;    (5) 把需要透明绘制的位图与对话框绘图相应区域的背景进行逻辑异或操作绘制到对话框上;    (6) 把“掩码”位图与这个时候对话框相应区域的背景进行逻辑与的操作;    (7) 重复步骤5的操作,把需要透明绘制的位图与对话框绘图相应区域的背景进行逻辑异或操作绘制到对话框上;    (8) 最后把系统的画笔还给系统,删除使用过的GDIObject,释放非空的指针,最后把新建的设备描述表也删除。 2.3 CObList链表 MFC类库中提供了丰富的CObList类的成员函数,此程序主要用到的成员函数如下:(1) 构造函数,为CObject指针构造一个空的列表。 (2) GetHead(),访问链表首部,返回列表中的首元素(列表不能为空)。(3) AddTail(),在列表尾增加一个元素或另一个列表的所有元素。   (4) RemoveAll(),删除列表中所有的元素。   (5) GetNext(),返回列表中尾元素的位置。   (6) GetHeadPosition(),返回列表中首元素的位置。   (7) RemoveAt(),从列表中删除指定位置的元素。   (8) GetCount(),返回列表中的元素数。 在CPlaneGameView.h文件中声明各游戏对象与游戏对象链表:   (1)//创建各游戏对象 CMyPlane *myplane; CEnemy *enemy; CBomb *bomb; CBall *ball; CExplosion *explosion; (2)//创建存储游戏对象的对象链表 CObList ListEnemy; CObList ListMe; CObList ListBomb; CObList ListBall; CObList ListExplosion; 2.4获取矩形区域   首先,使用CRect定义一个对象,然后使用GetClientRect(&对象名)函数,获取界面的矩形区域rect.Width() 为矩形区域的宽度,rect.Height()为矩形区域的高度。   使用IntersectRect(&,&))函数来判断两个源矩形是否有重合的部分。如果有不为空,则返回非零值;否则,返回0。 2.5使用AfxMessageBox显示游戏过程中的提示信息   AfxMessageBox()是模态对话框,你不进行确认时程序是否往下运行时,它会阻塞你当前的线程,除非你程序是多线程的程序,否则只有等待模态对话框被确认。   在MFC中,afxmessagebox是全局的对话框最安全,也最方便。 2.6内存释放   在VC/MFC用CDC绘图时,频繁的刷新,屏幕会出现闪烁的现象,CPU时间占用率相当高,绘图效率极低,很容易出现程序崩溃。及时的释放程序所占用的内存资源是非常重要的。   在程序中使用到的链表、刷子等占用内存资源的对象都要及时的删除。Delete Brush, List.removeall()等。 2.7 CImageList处理爆炸效果   爆炸效果是连续的显示一系列的图片。如果把每一张图片都显示出来的话,占用的时间是非常多的,必然后导致程序的可行性下降。CImageList是一个“图象列表”是相同大小图象的集合,每个图象都可由其基于零的索引来参考。可以用来存放爆炸效果的一张图片,使用Draw()函数来绘制在某拖拉操作中正被拖动的图象,即可连续绘制出多张图片做成的爆炸效果。 2.8对话框的应用    在设置游戏难度、炸弹的速度等,使用对话框进行设置非常方便,又体现出界面的友好。    对话框的应用过程如下:    (1). 资源视图下,添加Dialog对话框。然后添加使用到的控件,并修改控件的ID以便于后面的使用。    (2). 为对话框添加类,在对话框模式下,点击项目,添加类。    (3). 在类视图中,为对话框类添加成员变量(控件变量)。设置变量的名称、类型、最值等信息。    (4). 在资源视图菜单中,选择相应的菜单项,右击添加时间监听程序,设置函数处理程序名称。    (5). 在处理程序函数中添加相应的信息。 3. 总体设计与详细设计 3.1 系统模块划分   该飞机大战游戏程序分为游戏背景位图绘制模块、各游戏对象绘制模块、游戏对象之间的碰撞模块、爆炸效果产生模块、游戏界面输出玩家得分关卡信息模块。   其中在游戏对象绘制模块中,战机是唯一对象,在游戏开始时产生该对象,赋予其固定的生命值,当其与对象、炸弹碰撞时使其生命值减一,直至生命值为零,便删除战机对象。对象与炸弹对象的绘制中采用定时器技术,定时产生。爆炸对象初始化为空,当游戏过程中即时发生碰撞时,在碰撞位置产生爆炸对象,添加到爆炸链表中。 3.2 主要功能模块 3.2.1 系统对象类图            CGameObject是各个游戏对象的抽象父类,继承自CObject类,其他的类:战机类、类、爆炸类、子弹类、炸弹类、文字类都继承了此类。   每个游戏对象类中既继承了来自父类CGameObject的属性,又有自己的特有属性和方法。 3.2.2 系统主程序活动图    3.2.3 系统部分流程图 (1) 该飞机大战游戏执行流程图: (2) 利用定时器定时产生并绘制流程图 4. 编码实现 4.1 绘制游戏背景位图程序   CDC *pDC=GetDC();   //获得矩形区域对象   CRect rect;   GetClientRect(▭);   //设备环境对象类----CDC类。   CDC cdc;   //内存中承载临时图像的位图   CBitmap bitmap1;   //该函数创建一个与指定设备兼容的内存设备上下文环境(DC)   cdc.CreateCompatibleDC(pDC);   //该函数创建与指定的设备环境相关的设备兼容的位图。   bitmap1.CreateCompatibleBitmap(pDC,rect.Width(),rect.Height());   //该函数选择一对象到指定的设备上下文环境中,该新对象替换先前的相同类型的对象。   CBitmap *pOldBit=cdc.SelectObject(&bitmap1;);   //用固定的固体色填充文本矩形框   cdc.FillSolidRect(rect,RGB(51,255,255)); //添加背景图片   CBitmap bitmap_BackGround;   bitmap_BackGround.LoadBitmap(IDB_BACKGROUND);   BITMAP bimap2;//位图图像   bitmap_BackGround.GetBitmap(&bimap2;);   CDC cdc_BackGround;//定义一个兼容的DC   cdc_BackGround.CreateCompatibleDC(&cdc;);//创建DC   CBitmap*Old=cdc_BackGround.SelectObject(&bitmap;_BackGround);   cdc.StretchBlt(0,0,rect.Width(),rect.Height(),&cdc;_BackGround,0,0,bimap2.bmWidth,bimap2.bmHeight,SRCCOPY); 4.2 飞机大战游戏对象的绘制程序 //画战机对象(唯一) if(myplane!= NULL) { myplane->Draw(&cdc;,TRUE); } //设置定时器,随机添加,随机发射炸弹,此时速度与数量和关卡有关 SetTimer(2,300,NULL);//产生的定时器 SetTimer(3,500,NULL);//炸弹产生的定时器   if(myplane!=NULL&& is_Pause == 0) { switch(nIDEvent) { case 2://设置定时器产生 { if(pass_Num == 1)//第一关 { int motion =1;//设置的方向,从上方飞出 CEnemy *enemy=new CEnemy(motion); ListEnemy.AddTail(enemy);//随机产生 }//if else if(pass_Num >= 2)//第一关以后的关卡 { int motion1 = 1; //设置的方向,从上方飞出 CEnemy *enemy1=new CEnemy(motion1); enemy1->SetSpeed_en((rand()%5 +1)* pass_Num); ListEnemy.AddTail(enemy1);//随机产生 int motion2 = -1;//设置的方向,从下方飞出 CEnemy *enemy2=new CEnemy(motion2); enemy2->SetSpeed_en((rand()%5 +1)* pass_Num); ListEnemy.AddTail(enemy2);//随机产生 }//else if }//case break; }//switch //判断产生的是否出界,若已经出界,则删除该 POSITION posEn=NULL,posEn_t=NULL; posEn=ListEnemy.GetHeadPosition(); int motion = 1; while(posEn!=NULL) { posEn_t=posEn; CEnemy *enemy= (CEnemy *)ListEnemy.GetNext(posEn); //判断是否出界 if(enemy->GetPoint().xGetPoint().x>rect.right ||enemy->GetPoint().yGetPoint().y>rect.bottom) { ListEnemy.RemoveAt(posEn_t); delete enemy; }//if else { enemy->Draw(&cdc;,TRUE); switch(nIDEvent) { case 3://设置定时器产生炸弹 {   CBall*ball=newCBall(enemy->GetPoint().x+17,   enemy->GetPoint().y+30,enemy->GetMotion()); ListBall.AddTail(ball); }//case break; }//switch }//else }//while //判断产生的炸弹是否出界,若已经出界,则删除该炸弹 POSITION posball=NULL,posball_t=NULL; posball= ListBall.GetHeadPosition(); while(posball!=NULL) { posball_t=posball; ball= (CBall *) ListBall.GetNext(posball); if( ball->GetPoint().xGetPoint().x>rect.right || ball->GetPoint().yGetPoint().y>rect.bottom) { ListBall.RemoveAt(posball_t); delete ball; }//if else { ball->Draw(&cdc;,1); }//else }//while }//if 4.3 飞机大战游戏对象战机位置的动态控制 if(myplane!= NULL) { myplane->Draw(&cdc;,TRUE); } //获得键盘消息,战机位置响应,战机速度speed为30 if((GetKeyState(VK_UP) <0 || GetKeyState('W') GetPoint().ySetPoint( myplane->GetPoint().x,rect.bottom); else myplane->SetPoint(myplane->GetPoint().x,( myplane->GetPoint().y - speed) ); }//if if((GetKeyState(VK_DOWN) <0|| GetKeyState('S') < 0)&& is_Pause== 0)//下方向键{}//if if((GetKeyState(VK_LEFT) <0|| GetKeyState('A') < 0)&& is_Pause== 0)//左方向键{}//if if((GetKeyState(VK_RIGHT) <0|| GetKeyState('D') < 0)&& is_Pause== 0)//右方向键{}//if if((GetKeyState(VK_SPACE)GetPoint().x, myplane->GetPoint().y,1); ListBomb.AddTail(BombOne); CBomb*BombTwo=newCBomb(myplane->GetPoint().x+35, myplane->GetPoint().y,1); ListBomb.AddTail(BombTwo); PlaySound((LPCTSTR)IDR_WAVE2,AfxGetInstanceHandle(),SND_RESOURCE |SND_ASYNC); }//if if(GetKeyState('Z')SetPoint(point.x,point.y); } //鼠标控制战机,发射战机子弹 void CPlaneGameView::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: 在此添加消息处理程序代码和/或调用默认值 CView::OnLButtonDown(nFlags, point); if( is_Pause == 0) { CBomb *BombOne=new CBomb( myplane->GetPoint().x, myplane->GetPoint().y,1); PlaySound((LPCTSTR)IDR_WAVE2, AfxGetInstanceHandle(), SND_RESOURCE |SND_ASYNC); ListBomb.AddTail(BombOne); CBomb *BombTwo=new CBomb( myplane->GetPoint().x+35, myplane->GetPoint().y,1); ListBomb.AddTail(BombTwo); } } 4.4 飞机大战游戏对象之间的碰撞实现 本飞机大战游戏中的碰撞考虑了飞机子弹打中炸弹打中战机、战机与相撞、炸弹与战机子弹相撞四种情况,根据游戏对象的矩形区域是否有交叉,而确认两者是否相撞,而产生爆炸对象,添加到爆炸链表中。以战机与相撞为例: if(myplane != NULL&& is_Pause== 0) { POSITION enemyPos,enemyTemp; for(enemyPos= ListEnemy.GetHeadPosition();(enemyTemp=enemyPos)!=NULL;) { enemy =(CEnemy *) ListEnemy.GetNext(enemyPos); //获得的矩形区域 CRect enemyRect = enemy->GetRect(); //获得战机的矩形区域 CRect myPlaneRect = myplane->GetRect(); //判断两个矩形区域是否有交接 CRect tempRect; if(tempRect.IntersectRect(&enemyRect;,myPlaneRect)) { CExplosion *explosion = new CExplosion( enemy->GetPoint().x+18 , enemy->GetPoint().y + 18); PlaySound((LPCTSTR)IDR_WAVE,AfxGetInstanceHandle(), SND_RESOURCE |SND_ASYNC); ListExplosion.AddTail(explosion); //战机生命值减一 lifeNum_Me--; //删除 ListEnemy.RemoveAt(enemyTemp); delete enemy; if(lifeNum_Me == 0) { //删除战机对象 delete myplane; myplane=NULL; }//if break; }//if }//for }//if 战机子弹打中炸弹打中战机以及战机子弹与炸弹对象的碰撞实现同上。 4.5 游戏界面输出当前信息   if(myplane != NULL&& is_Pause== 0)    {    HFONT font;    font=CreateFont(20,10,0,0,0,0,0,0,0,0,0,100,10,0);    cdc.SelectObject(font);    CString str;    cdc.SetTextColor(RGB(255,0,0));    str.Format(_T("当前关卡:%d"),pass_Num);    cdc.TextOutW(10,20,str);    str.Format(_T("当前得分:%d"),score_Me);    cdc.TextOutW(10,40,str);    str.Format(_T("剩余生命:%d"),lifeNum_Me);    cdc.TextOutW(10,60,str);    }//if    if(myplane !=NULL && lifeNum_Me >0)    {    if(score_Me > 10*count_Life*pass_Num)    {    lifeNum_Me++;//生命值加1    count_Life++;//已增加生命值加1    }    } 游戏进入下一关,以及结束游戏界面设计代码与上类似。 5. 项目程序测试 5.1战机移动及子弹发射模块测试 用例 预期结果 实际结果 问题描述 修改方案 点击A键或鼠标左移 战机向左移动 战机向左移动 点击D键或鼠标右移 战机向右移动 战机向右移动 点击W键或鼠标上移 战机向上移动 战机向上移动 点击S键或鼠标上移 战机向下移动 战机向下移动 5.2及炸弹模块测试 用例 预期结果 实际结果 问题描述 修改方案 玩家得分50(通过第一关后) 从上下两方向均可飞出,且速度不断增加 从上下两方向均可飞出,且速度不断增加 5.3爆炸模块测试 用例 预期结果 实际结果 问题描述 修改方案 战机子弹打中 位置处爆炸,消失,战机生命-1 位置处爆炸,消失,战机生命-1 炸弹打中战机 战机位置处爆炸,战机生命-1 战机位置处爆炸,战机生命-1 战机相撞 位置处爆炸,消失,战机生命-1 位置处爆炸,消失,战机生命-1 战机子弹与炸弹相撞 炸弹处爆炸,子弹与炸弹均消失消失 炸弹处爆炸,子弹与炸弹均消失消失 战机生命值==0 战机消失,GameOver或者过关 战机消失,GameOver或者过关 6. 实训中遇到的主要问题及解决方法   (1)由于对C++的面向对象的思想和逻辑思路不熟悉,不明白其中的封装之类的以及多态的思想,致使开始真正的进入实训接触到项目时没有开发思路,通过逐步查询书籍整理C++面向对象编程思路,才逐步理清项目的开发步骤。   (2)本飞机大战的游戏要求使用链表实现各游戏对象的存储和释放,由于链表知识掌握的不牢固,使用起来总是出现这样那样的错误,给整个游戏开发带来了很大的障碍,通过不断的调试修改,最终使程序正确运行。   (3)在绘制各种游戏对象—炸弹时,开始使用随机函数,画出时而很少,总是打不到预定的效果,后来经过修改使用定时器产生炸弹,使整个游戏更加人性化。 7. 实训体会 (1)在本次飞机大战游戏项目的开发过程中遇到很多问题,大部分是因为对MFC编程的不熟悉以及链表掌握不牢固所导致的。 (2)MFC编程中有很多可以直接调用的函数,由于之前缺乏对这方面编程的经验,以至于本次项目开发过程中走了很多弯路。 (3)通过寻求老师和同学的帮助,解决了开发中遇到的很多问题,也提升了自己调试错误的能力。 (4)通过本次实训,使我熟悉了MFC编程技术、巩固了链表的使用方法并加深了对面向对象编程思想的理解,对以后程序的编写打下了良好的基础。
第一章 J2ME手机游戏开发基础 2 1.1 J2ME 理论基础 2 1.1.1 J2ME简介 2 1.1.2 MIDlet Suites简介 3 1.1.3 MIDlet生存周期 3 1.1.4 MIDlet程序结构 4 1.1.5 MIDP类库 5 1.1.6 低级用户界面 6 1.1.7 高级用户界面 7 1.2 WTK2.5和集成开发环境 8 1.2.1 WTK2.5简介 8 1.2.2 WTK2.5的安装 8 1.2.3 WTK开发流程 10 1.2.4 设置工程属性 15 1.2.5 打包以及混淆 17 1.2.6 运行和部署JAR文件 19 1.2.7 集成开发环境 21 1.3 程序优化和图片处理 22 1.3.1 图片格式和透明背景 22 1.3.2 资源优化 25 1.3.4 程序优化 26 2.5.6 查看程序的执行性能 28 2.5.7 监视程序的执行情况 28 1.4 游戏类型划分 31 1.4.1 动作游戏 32 1.4.2 冒险游戏 34 1.4.3 射击游戏 36 1.4.4 角色扮演游戏 37 1.4.5 策略类游戏 39 1.4.6 体育游戏 40 1.4.7 棋牌游戏 42 1.4.8 竞速游戏 42 1.4.9 益智游戏 43 1.4.10 格斗游戏 44 1.4.11 模拟类游戏 45 1.5 手机游戏策划概述 46 1.5.1 手机游戏特征和设计原则 46 1.5.2 玩家需求分析 49 1.5.3 玩家行为分析 51 1.5.4 用户界面与操作性 53 1.5.5 游戏开发流程 55 1.6 游戏技术和游戏题材 56 1.6.1 3D游戏 56 1.6.2 网络游戏 58 1.6.3 经典题材 60 1.6.4 电影题材 61 1.6.5 小说题材 65 1.6.6 武侠题材 68 1.6.7 历史题材 69 1.7 本章小结 71 第二章 益智猜谜游戏-数独的设计与实现 2 2.1 数独游戏的策划和准备工作 3 2.1.1 数独游戏的历史和现状 3 2.1.2 数独游戏的规则和通用解法 4 2.1.3 数独题目的生成 5 2.1.4 游戏的准备工作 7 2.1.5 谜题数据的制作 8 2.2 数独的架构 10 2.2.1 游戏的类结构 10 2.2.2 用户界面流程 10 2.3 主类SuDoKuMIDlet类 11 2.3.1 闪屏界面 12 2.3.2 游戏菜单列表 12 2.3.3 继续游戏选项 13 2.3.4 填充完成后提示界面 14 2.2.5 通用加载图片方法 15 2.4 游戏闪屏SplashScreen类 15 2.4.1 加载闪屏图片 16 2.4.2 绘制闪屏屏幕 16 2.4.3 闪屏的线程 17 2.4.4 闪屏的取消 17 2.5 游戏菜单MenuList类 18 2.5.1 MenuList类的构造函数 18 2.5.2 游戏当前状态 19 2.5.3 菜单事件处理 19 2.6 游戏设置OptionsScreen类 20 2.6.1 OptionsScreen类的构造函数 21 2.6.2 参数设置按键事件处理 22 2.7 游戏说明InstructionsScreen类 22 2.7.1 InstructionsScreen类的构造函数 23 2.7.2 软键事件处理 24 2.8 游戏画布SuDoKuCanvas类 24 2.8.1 SuDoKuCanvas类的构造函数 24 2.8.2 设置游戏参数 27 2.8.3 绘制背景和单元格 27 2.8.4 填充数字 30 2.8.5 播放声音 32 2.8.6 游戏线程 32 2.8.7 键盘处理和绘制屏幕 34 2.8.8 开始和加载游戏 34 2.8.9 显示答案 35 2.8.10 软键事件响应 36 2.9 游戏控制SuDoKuModel类 37 2.9.1 构造函数 37 2.9.2 游戏难度和输入方式 38 2.9.3 谜题的产生 39 2.9.4 保存加载和开始新游戏 42 2.9.5 键盘处理 43 2.9.6 填充数字和显示结果 45 2.9.7 获取提示 46 2.10 数独逻辑SuDoKuLogic类 47 2.10.1 构造函数 47 2.10.2 获取属性和内容 49 2.10.3 填充和清空宫格 50 2.10.4 判断解决是否 51 2.10.5 获取数组字符串 52 2.11 游戏存储SuDoKuStore类 53 2.11.1 记录的读取 53 2.11.2 记录的保存 55 2.11.3 获取参数 56 2.12 游戏声效SoundEffects类 57 2.12.1 获取唯一实例 57 2.12.2 加载声音文件 58 2.12.3 播放声音 59 2.12.4 停止播放声音 60 2.13 数独的深度开发探讨 61 2.13.1 数独的界面改进 61 2.13.2 数独的情节策划 62 2.14 本章小结 63 第三章 射击策略游戏-坦克大战的设计与实现 2 3.1 坦克大战游戏的策划和准备工作 3 3.1.1 坦克大战游戏的背景 3 3.1.2 游戏的策划分析 3 3.1.3 游戏的准备工作 4 3.1.4 地图索引文件的制作 6 3.2 坦克大战的架构 8 3.2.1 游戏的类结构 8 3.2.2 用户界面流程 9 3.3 主类TankMIDlet类 10 3.3.1 TankMIDlet类的构造函数 10 3.3.2 游戏状态的改变 11 3.4 游戏画布和控制TankCanvas类 12 3.4.1 构造函数和初始化资源 12 3.4.2 初始化地图参数 15 3.4.3 游戏线程 17 3.4.4 游戏的绘制和输入 18 3.4.5 闪屏的绘制流程 20 3.4.6 片头动画的绘制流程 21 3.4.7 绘制菜单 24 3.4.8 设置关卡参数 29 3.4.9 读取地图 32 3.4.10 游戏绘制 34 3.4.11 对战时的用户输入 53 3.4.12 子弹发射 54 3.4.13 选择关卡 56 3.4.14 游戏说明 58 3.4.15 游戏结果 59 3.5 玩家坦克Hero类 67 3.5.1 构造函数 67 3.5.2 坦克的运动 70 3.5.3 坦克的初始状态 72 3.5.4 普通模式和无状态 75 3.5.5 爆炸状态 77 3.5.6 检测与障碍物的碰撞 78 3.5.7 运动物体检测 80 3.6 子弹Bullet类 81 3.6.1 构造函数 81 3.6.2 子弹与地图的碰撞 82 3.6.3 与其他物体的碰撞 84 3.6.4 坦克的控制和绘制 85 3.6.5 子弹爆炸 87 3.6.6 子弹的运动和方向 88 3.7 方坦克EnemyPool和Enemy类 90 3.7.1 图片加载工具EnemyPool类 90 3.7.2 Enemy类构造函数 93 3.7.3 坦克的绘制 95 3.7.4 障碍物碰撞检测 98 3.7.5 与运动物体的碰撞检测 101 3.7.6 坦克的人工智能 102 3.8 游戏道具Bonus类 104 3.8.1 加载和创建道具 104 3.8.2 道具的绘制 106 3.9 声音播放SoundPlayer类 107 3.9.1 获取唯一实例 107 3.9.2 加载声音资源 108 3.9.3 播放声音 109 3.10 坦克大战的深度开发探讨 110 3.10.1 坦克大战的道具和关卡改进 110 3.10.2 45度视角的坦克大战 113 3.11 本章小结 114 第四章 棋类游戏-五子棋的设计与实现 2 4.1 五子棋游戏的策划和准备工作 2 4.1.1 棋类游戏开发概述 2 4.1.2 游戏的背景知识 3 4.1.3 游戏的准备工作 5 4.2 五子棋游戏的架构 6 4.2.1 事件驱动游戏 6 4.2.2 游戏的类结构 6 4.2.3 游戏的流程 7 4.2.4 五子棋的人工智能 8 4.3 主类FIRMIDlet类 9 4.3.1 构造函数和软键声明 9 4.3.2 软键事件处理 11 4.3.3 程序状态改变 12 4.4 游戏设置和介绍表单实现 12 4.4.1 棋盘尺寸选择 12 4.4.2 先手选择 14 4.4.3 难度选择 15 4.4.4 创建设置表单 15 4.4.5 存储和加载默认选项 16 4.4.6 获取表单参数 18 4.4.7 游戏介绍表单的实现 19 4.5 棋子Dot类的实现 20 4.5.1 棋子的行列位置 20 4.5.2 棋子的三种构造函数 21 4.5.3 修改棋子的位置 21 4.5.4 检查越界 22 4.6 对战逻辑FIRLogic类的实现 22 4.6.1 构造函数和传递游戏参数 22 4.6.2 建立数据结构 24 4.6.3 落子和悔棋 24 4.6.4 基本检测方法 26 4.6.5 检测五子连珠(游戏结束) 29 4.6.6 双方落子 31 4.6.7 实现“连五” 32 4.6.8 实现“活四” 33 4.6.9 完成“冲四”、“活三” 36 4.6.10 完成“双四”、“四三”、“双三” 38 4.6.11 最佳落子点 40 4.6.12 棋型检测调度 41 4.7 游戏画布FIRCanvas类的实现 42 4.7.1 构造函数 42 4.7.2 屏幕绘制 44 4.7.3 新开局和软键布局 49 4.7.4 用户输入 50 4.7.5 提示字符串 52 4.8 棋类游戏的相关探讨 53 4.8.1 逻辑和表现的分离 53 4.8.2 自适应尺寸和可移植性 53 4.8.3 五子棋游戏设计概要 54 4.9 本章小结 55 第五章 休闲娱乐游戏-连连看的设计与实现 2 5.1 连连看游戏的策划和准备工作 2 5.1.1 连连看游戏概述 2 5.1.2 游戏的准备工作 3 5.2 连连看的架构 5 5.2.1 游戏的类结构 5 5.2.2 用户界面流程 6 5.2.3 游戏的算法分析 6 5.3 主类和菜单MainMenu类 9 5.3.1 主类LLKMIDlet类 9 5.3.2 MainMenu菜单类 10 5.3.3 MainMenu类的构造函数 11 5.3.4 主菜单 12 5.3.5 难度设置 13 5.3.6 操作说明和关于 14 5.3.7 键盘输入 14 5.4 矩阵LLKMatrix类 17 5.4.1 构造函数 18 5.4.2 初始化矩阵 19 5.4.3 设置和获取元素 21 5.4.4 判断是否可连 22 5.4.5 方块自动重排 41 5.4.6 方块自动上升 43 5.4.7 方块向下坠落 44 5.4.8 方块左方往下,右方往上 44 5.4.9 方块向左靠拢 46 5.4.10 方块上方向左,下方向右 46 5.4.11 方块上方向上,下方向下 48 5.4.12 方块左方向左,右方向右 49 5.4.13 方块上下向中间靠拢 50 5.4.14 方块左右向中间靠拢 51 5.4.15 组合变换 52 5.5 游戏画布LLKCanvas类 53 5.5.1 构造函数 54 5.5.2 读取游戏资源 55 5.5.3 播放声音 57 5.5.4 游戏计时 59 5.5.5 屏幕绘制 59 5.5.6 绘制游戏画面 61 5.5.7 键盘响应 70 5.5.8 返回菜单 75 5.5.9 通过本关 75 5.5.10 获取提示框 76 5.6 定时器和游戏胜利屏幕 76 5.6.1 定时器TimerTask类 76 5.6.2 走马灯提示信息的实现 77 5.6.3 GameWinCanvas类的构造函数 78 5.6.4 屏幕线程 79 5.6.5 屏幕绘制和键盘处理 81 5.7 连连看的相关探讨 82 5.7.1 连连看的图案变换 82 5.7.2 连连看的排列改进 83 5.8 本章小结 84 第六章 飞行射击游戏-雷电游戏的设计与实现 3 6.1 雷电游戏的策划和准备工作 4 6.1.1 雷电游戏概述 4 6.1.2 游戏的准备工作 4 6.2 雷电的架构 6 6.2.1 游戏的类结构 7 6.2.2 用户界面流程 7 6.3. 主类和游戏闪屏 8 6.3.1 显示闪屏和菜单 8 6.3.2 设置音效和震动 9 6.3.3 开始和退出游戏 11 6.3.4 暂停游戏 11 6.3.5 判断得分 12 6.3.6 读取存储记录 12 6.3.7 保存记录 13 6.3.8 转换时间格式 15 6.3.9 创建图片 17 6.3.10 游戏闪屏SplashScreen类 17 6.4 道具和子弹 19 6.4.1 游戏道具类 19 6.4.2 子弹类 20 6.5 游戏飞机的实现 22 6.5.1 Enemy1类的构造函数 22 6.5.2 屏幕参数和状态 24 6.5.3 运动循环 25 6.5.4 绘制屏幕和初始化参数 26 6.5.5 Enemy2类 27 6.5.6 Enemy3456类 30 6.5.7 玩家飞机Player类 33 6.6 游戏画布RaidenCanvas类 37 6.6.1 构造函数 37 6.6.2 加载资源 38 6.6.3 初始化游戏参数 40 6.6.4 游戏线程 41 6.6.5 处理键盘事件 42 6.6.6 游戏逻辑 43 6.6.7 绘制游戏画布 49 6.7 游戏音效Audio类 52 6.7.1 获取唯一实例 52 6.7.2 创建声音对象 53 6.7.3 播放声音 55 6.7.4 停止播放声音 56 6.7.5 释放声音资源 56 6.8 菜单画布MenuCanvas 56 6.8.1 构造函数 57 6.8.2 屏幕绘制和键盘输入 61 6.8.3 响应软键事件 62 6.8.4 显示弹出对话框 63 6.8.5 触发事件 64 6.8.6 固定标志菜单选项 66 6.8.7 菜单绘制类 67 6.9 菜单Menu类 68 6.9.1 构造函数 68 6.9.2 菜单的绘制 69 6.9.3 跳转页 70 6.9.4 菜单线程和切换页面 71 6.9.5 获取当前页、获取和设置选项 74 6.9.6 获取和设置参数 76 6.9.7 键盘输入 78 6.9.8 响应菜单事件 79 6.10 菜单页面MenuPage类 80 6.10.1 构造函数 80 6.10.2 设置标题和标题图片 81 6.10.3 添加菜单选项 82 6.10.4 索引与选项的对应 82 6.10.5 获取和设置索引 82 6.10.6操作菜单选项 84 6.11 菜单选项PageItem 85 6.11.1 构造函数 85 6.11.2 菜单选项的ID 86 6.11.3 激活和禁止选中 87 6.11.4 菜单选项的排列方式 88 6.11.5 帮助说明 89 6.11.6 双选菜单BinaryPageItem类 89 6.12 默认菜单绘制DefaultMenuPainter类 91 6.12.1 绘制菜单标题 93 6.12.2 绘制单个菜单选项 94 6.12.3 绘制所有菜单选项 96 6.12.4 菜单切换 97 6.12.5 菜单选项的宽度和高度 97 6.13 菜单的接口 98 6.13.1 菜单的绘制接口MenuPainter 98 6.13.2 菜单的事件监听接口MenuListener 99 6.13.3 菜单的事件触发ItemAction接口 100 6.14 软键控制SoftButtonControl类 101 6.14.1 初始化 101 6.14.2 设置软键 102 6.14.3 激活和禁止软键 103 6.14.4 软键按下事件 103 6.14.5 绘制软键 104 6.15 弹出对话框的实现 106 6.15.1 Popup类的构造函数 106 6.15.2 初始化对话框 108 6.15.3 划分字符串 110 6.15.4 屏幕绘制 112 6.15.5 键盘事件 114 6.15.6 线程和对话框超时 116 6.15.7 弹出对话框PopupListener接口 117 6.16 雷电的相关探讨 118 6.16.1 雷电的地图设计 118 6.16.2 雷电的子弹设计 119 6.16.3 雷电的道具设计 119 6.16.4 雷电的碰撞检测 120 6.16.5 雷电的关卡设计 120 6.17 本章小结 121 第七章 蓝牙游戏-五子棋对战游戏的设计与实现 2 7.1 蓝牙对战游戏游戏的策划和准备工作 2 7.1.1 蓝牙技术概述 2 7.1.2 蓝牙游戏现状 4 7.1.4 游戏的策划和准备工作 7 7.2 蓝牙通信流程简介 8 7.2.1 蓝牙API和OBEX API 8 7.2.2 蓝牙控制中心 10 7.2.3 协议栈 10 7.2.4 设备管理 11 7.2.5 搜索设备 12 7.2.6 搜索服务 12 7.2.7 建立通信 12 7.3 蓝牙对战五子棋的架构 13 7.3.1 游戏的用户界面设计 13 7.3.2 游戏的蓝牙连接流程 14 7.3.3 游戏的类结构 16 7.4 主类BTMIDlet类 16 7.4.1 BTMIDlet类的构造函数 16 7.4.2 软键事件处理 18 7.4.3 程序状态转换 18 7.5 逻辑类BTLogic类的实现 19 7.5.1 构造函数 19 7.5.2 双方落子 21 7.5.3 检测五子连珠 23 7.5.4 外部接口 26 7.6 游戏画布类BTFIRCanvas类的实现 27 7.6.1 构造函数 27 7.6.2 绘制棋盘 30 7.6.3 用户输入 34 7.6.4 网络连接 36 7.6.5 游戏开局 37 7.6.6 提示字符串 38 7.7 连接控制类Connection类 39 7.7.1 Connection类的构造函数 39 7.7.2 启动连接 40 7.7.3 信息的收发 40 7.8 服务器类Server类 41 7.8.1 构造函数 41 7.8.2 连接线程 43 7.8.3 客户端处理程序(内部类) 44 7.8.4 收发数据 47 7.9 客户端类Client类 48 7.9.1 构造函数 48 7.9.2 连接线程 49 7.9.3 搜索设备 51 7.9.4 搜索服务 52 7.9.5 收发信息 53 7.10 蓝牙五子棋游戏的相关探讨 54 7.10.1 游戏的改善方案 54 7.10.2 蓝牙游戏设计概要 54 7.11 本章小结 55 第八章 角色扮演游戏-剑神的设计与实现 2 8.1 剑神游戏的策划和准备工作 3 8.1.1 RPG游戏概述 3 8.1.2 多结局与重玩性 4 8.1.3 游戏的准备工作 5 8.2 剑神的架构 9 8.2.1 游戏的类结构 9 8.2.2 用户界面流程 10 8.3 游戏主类和菜单 12 8.3.1 主类SwordMIDlet 12 8.3.2 菜单类的构造函数 13 8.3.3 加载图片资源 15 8.3.4 绘制线程 15 8.3.5 绘制方法 16 8.3.6 键盘事件处理 17 8.3.7 创建游戏进度画面 20 8.4 加载画布LoadingCanvas类 21 8.4.1 构造函数 21 8.4.2 绘制线程 22 8.4.3 绘制加载界面 25 8.5 游戏画布SwordCanvas类 26 8.5.1 构造函数 26 8.5.2 游戏参数的初始化 28 8.5.3 地图系统 33 8.5.4 运动系统 41 8.5.5 键盘事件处理 51 8.5.6 菜单系统 69 8.5.7 战斗系统 79 8.5.8 玩家属性 87 8.5.9 对话系统 95 8.5.10 天气系统 99 8.5.11 绘制屏幕 101 8.6 精灵与定时器 112 8.6.1 游戏精灵Sprite类 112 8.6.2 定时器的构造函数 113 8.6.3 实现天气效果 113 8.6.4 进行场景切换 114 8.6.5 回血技能 115 8.6.6 补气技能 116 8.6.7 改变攻击顺序 118 8.6.8 人发动攻击 121 8.6.9 落日技能 123 8.6.10 乱电和残风技能 125 8.6.11 玩家发起的普通攻击 125 8. 7 游戏存储SwordStore类 127 8.7.1 检查存储是否存在 127 8.7.2 保存记录 128 8.7.3 读取记录 130 8.7.4 删除记录 131 8.8 游戏音效SoundEffects类 132 8.8.1 获取唯一实例 132 8.8.2 读取声音文件 133 8.8.3 播放声音 134 8.8.4 暂停声音 134 8.8.5 停止和释放声音 134 8. 9 绘制特效GraphicsEffects类 135 8.9.1 获取唯一实例 135 8.9.2 裁减绘制小图 136 8.9.3 绘制特效文字 137 8.10 RPG设计要点 137 8.10.1 战斗画面的设计 137 8.10.2 道具系统的设计 138 8.10.3 游戏对白的设计 139 8.11 武侠RPG手机游戏一览 139 8.11.1 《傲世奇侠传》 140 8.11.2 《仙剑奇侠传》 141 8.11.3 《佣兵天下》 142 8.11.4 《浪子剑客》 144 8.11.5 《侠侣仙踪》 145 8.12 本章小结 146

75

社区成员

发帖
与我相关
我的任务
社区描述
更多精彩内容请关注微信公众号:「极客起源」,UnityMarvel创始人,企业内训讲师、IT畅销书作者,CSDN学院讲师,拥有多年软件开发经验和培训经验。主要著作包括《鸿蒙征途:App开发实战》、《Python从菜鸟到高手》、《Python爬虫技术:深入理解原理、技术与开发》,培训企业学员数千人。制作在线课程数千小时。更多视频课程,请访问我的B站:https://space.bilibili.com/477001733
社区管理员
  • 蒙娜丽宁
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧