游戏程序设计报告.docx
《游戏程序设计报告.docx》由会员分享,可在线阅读,更多相关《游戏程序设计报告.docx(20页珍藏版)》请在冰豆网上搜索。
![游戏程序设计报告.docx](https://file1.bdocx.com/fileroot1/2023-2/1/58d59a75-f560-4688-8779-290d71a41f46/58d59a75-f560-4688-8779-290d71a41f461.gif)
游戏程序设计报告
游戏程序设计课程报告
报告题目太空大战游戏程序设计
学院名称信息科学与技术学院
专业名称软件工程
学生姓名
学生学号
任课教师
报告成绩
教务处制
2015年07月04日
第1章引言
1.1游戏设计背景
本次设计游戏为一款飞行射击类游戏,名字为太空大战。
该游戏具有普通游戏一样的功能,比如场景设计,纹理贴图,人物移动,碰撞检测,生命值等元素。
和团队一起设计并实现该游戏一方面巩固课堂学到的知识,学以致用,加深理论知识的理解,另一方面也锻炼了自己的实际编码能力和团队协作的能力,是一次难得又宝贵的开发经历。
目前市面上的飞行射击游戏还算火爆,随着智能手机的普及,人们越来越多的使用手机玩手机游戏,其中以休闲类游戏为代表,比如成绩火爆过的《愤怒的小鸟》,《flappybird》,《雷电3D》,《现代战争》等游戏都广受好评。
1.2游戏规则
本款太空大战游戏分为两种模式:
挑战模式和生存模式。
玩家可在游戏主界面进行选择,如下图:
其中挑战模式分为4个关卡,每个关卡的难度依次递增,玩家必须消灭一定数量的敌人,得到规定的分数才可以进入下一关。
每一关的敌人会有所不同,难度也依次增加。
最后一关为挑战终极BOSS,消灭BOSS后即可通关。
下图分别为第二关和终极BOSS:
生存模式中没有关卡限制,以计分为主,随着玩家分数的增加,游戏难度会逐渐加大,以敌人数量增加和类型增多来表现,玩家每次得到一百分,自己生命值就会增加一,初始生命为10,玩家生命耗尽则游戏结束,如下图:
1.3主要研究内容
在本次太空大战游戏设计中,我主要负责编码实现,精确碰撞技术的研究等内容。
第2章游戏开发工具和关键技术简介
2.1开发工具
本次游戏开发语言使用C#
采用Unity3d4.6游戏引擎开发
代码编写使用VS2012
模型制作采用3dMax2012
2.2关键技术
游戏中设计的关键技术主要有物体的精确碰撞检测,背景动画的循环播放。
精确碰撞检测:
物体的精确碰撞实现方法有很多,在这个游戏中使用的是制作模型来达到精确碰撞的目的。
首先在3dMax中制作出敌人的模型和一个同模型相接近的骨骼,并依附在模型中一起打包成FBX格式的模型,然后在Unity3d中直接导入该模型,就可以直接使用之前制作好的骨骼来做精确碰撞处理,如下图:
背景动画的循环播放:
实现背景的循环播放方法也很多,常见的比如直接使用2张可以前后对接的图片,当一张图片播放完成后直接在后面接入另一张图片,重复此过程,即可达到动画循环的目的。
在这个有些中,我直接使用的Unity3d中的动画系统来制作UV动画,如下图:
第3章游戏程序总体设计
3.1游戏总体流程:
首先玩家进入游戏主界面,进行选择,点击退出则直接退出游戏。
选择挑战模式则进入游戏,游戏失败可以选择继续或者返回主界面,选择生存模式则当声明值耗尽时显示玩家分数并显示回退按钮退回到主界面,选择游戏帮助,则进入帮助界面。
3.2游戏类图:
(1)敌人类图:
游戏中有4种敌人,如上图所示,其中最原始的敌人是Enemy类,其它3中敌人都继承于Enemy,只是重写了移动方法和少量属性。
(2)玩家类图:
玩家类中有MovwTo()方法,该方法实现玩家追随鼠标移动的方法,在手机上即让玩家追随手指移动。
其中的OnTriggerEnter()方法检测碰撞并作出相应的逻辑计算。
(3)子弹类:
子弹类分为玩家子弹和敌人子弹,其中敌人子弹继承于玩家子弹,重新了碰撞检测逻辑,由于Unity3d可直接在面板中设置脚本属性的值,因此每种敌人的子弹类不需要再重新写一个类,只需要依附EnemyRocket脚本后再重新设置值即可。
第4章游戏程序实现与测试
4.1敌人碰撞逻辑的实现:
voidOnTriggerEnter(Colliderother)
{
if(other.tag.CompareTo("PlayerRocket")==0)//如果子弹发生碰撞
{
Rocketrocket=other.GetComponent();//获取子弹对象的引用
if(rocket!
=null)
{
m_life-=rocket.power;//减少生命值
if(m_life<=0)//敌机生命值用尽就销毁
{
if(GlobalPramameters.gameModel=="SurviveModel")//如果是生存模式
{
SurviveModelManage.Instance.AddScore(m_point);
if(SurviveModelManage.Instance.GetScore()-100*GlobalPramameters.lifeAddCount>=0)
{
mplayer.m_life+=1;//增加生命
GlobalPramameters.lifeAddCount+=1;
}
}
else
GameManager.Instance.AddScore(m_point);//消灭敌人后增加分数
Instantiate(m_explosionFX,m_transform.position,Quaternion.identity);//播放爆炸特效
Destroy(this.gameObject);
}
}
}
if(other.tag.CompareTo("Player")==0&&this.gameObject.tag.CompareTo("Model_Helicopters_Apache")!
=0)
{
m_life=0;
Instantiate(m_explosionFX,m_transform.position,Quaternion.identity);//播放爆炸特效
Destroy(this.gameObject);
}
if(other.tag.CompareTo("bound")==0)
{
m_life=0;
Instantiate(m_explosionFX,m_transform.position,Quaternion.identity);//播放爆炸特效
Destroy(this.gameObject);
}
}
4.2终极BOSS的移动实现:
protectedoverridevoidUpdateMove()
{
m_fireTimer-=Time.deltaTime;
if(m_fireTimer<=0)
{
m_fireTimer=1;
if(m_player!
=null)
{
Vector3relativePos=m_transform.position-m_player.position;//敌机位置减去玩家位置,得到一个向量差
Vector3leftPos1=m_transform.position;//左边发射导弹位置
Vector3leftPos2=m_transform.position;//左边发射导弹位置
Vector3rightPos1=m_transform.position;//右边发射导弹位置
Vector3rightPos2=m_transform.position;//右边发射导弹位置
leftPos1.x-=0.9f;
leftPos2.x-=1.3f;
rightPos2.x+=0.9f;
rightPos1.x+=1.2f;
Instantiate(m_rocket,leftPos1,Quaternion.LookRotation(relativePos));//让子弹朝着玩家飞
Instantiate(m_rocket,leftPos2,Quaternion.LookRotation(relativePos));//让子弹朝着玩家飞
Instantiate(m_rocket,rightPos2,Quaternion.LookRotation(relativePos));//让子弹朝着玩家飞
Instantiate(m_rocket,rightPos1,Quaternion.LookRotation(relativePos));//让子弹朝着玩家飞
}
}
//前进:
Z方向直线往下走
floatrx=Mathf.Sin(Time.time-GlobalPramameters.time)*Time.deltaTime*6.0f;//左右移动
floatrz=0f;
int[]myArray={1,2};
floatelement=myArray[Random.Range(0,myArray.Length)];
if(element%2==0)
rz=Mathf.Sin(Time.time)*Time.deltaTime*(-1.0f);//上下移动
else
rz=Mathf.Sin(Time.time)*Time.deltaTime*(1.0f);//上下移动
m_transform.Translate(newVector3(rx,0,rz));
}
4.3玩家移动逻辑实现
voidMoveTo()
{
if(Input.GetMouseButton(0))
{
Vector3ms=Input.mousePosition;//获得鼠标屏幕的位置
Rayray=Camera.main.ScreenPointToRay(ms);//将屏幕位置转为射线
RaycastHithitinfo;//用来记录射线碰撞信息
booliscast=Physics.Raycast(ray,outhitinfo,1000,m_inputMask);//产生射线
if(iscast)
{
m_targetPos=hitinfo.point;//如果射中目标,记录射线碰撞点
}
}
Vector3pos=Vector3.MoveTowards(this.transform.position,m_targetPos,(m_speed+20)*Time.deltaTime);//获得朝目标移动的位置,第三个参数数移动的最大速度
this.m_transform.position=pos;//更新当前的位置
}
4.4玩家碰撞逻辑实现:
voidOnTriggerEnter(Colliderother)
{
if(other.tag.CompareTo("PlayerRocket")!
=0&&other.tag.CompareTo("Quad")!
=0)
{
if(other.tag.CompareTo("HelicoptersRocket")==0)
m_life-=2;
else
m_life-=1;
if(m_life<=0)
{
Instantiate(m_explosionFX,m_transform.position,Quaternion.identity);//播放爆炸特效
Destroy(this.gameObject);
}
}
}
4.5游戏界面GUI显示逻辑实现:
voidOnGUI()
{
//游戏暂停
if(Time.timeScale==0)
{
if(nextLevel)
{
switch(GlobalPramameters.currentLevel)
{
case1:
GUI.skin.label.fontSize=50;//放大字体
GUI.Label(newRect(0,Screen.height*0.2f,Screen.width,60),"通关成功");
GUI.skin.label.fontSize=20;
//进入下一关按钮
if(GUI.Button(newRect(Screen.width*0.5f-50,Screen.height*0.4f,100,30),"进入下一关"))
{
Application.LoadLevel("level_2");//载入下一关
}
break;
case2:
GUI.skin.label.fontSize=50;//放大字体
GUI.Label(newRect(0,Screen.height*0.2f,Screen.width,60),"通关成功");
GUI.skin.label.fontSize=20;
//进入下一关按钮
if(GUI.Button(newRect(Screen.width*0.5f-50,Screen.height*0.4f,100,30),"进入下一关"))
{
Application.LoadLevel("level_3");//载入下一关
}
break;
case3:
GUI.skin.label.fontSize=50;//放大字体
GUI.Label(newRect(0,Screen.height*0.2f,Screen.width,60),"通关成功");
GUI.skin.label.fontSize=20;
//进入下一关按钮
if(GUI.Button(newRect(Screen.width*0.5f-50,Screen.height*0.4f,100,30),"挑战终极BOSS"))
{
GlobalPramameters.time=Time.time;
Application.LoadLevel("level_4");//载入下一关
}
break;
default:
break;
}
}
else
GamePause();
}
if(m_player!
=null)
{
m_life=(int)m_player.m_life;//获得生命值
}
else//游戏结束
{
m_life=0;
GUI.skin.label.fontSize=50;//放大字体
GUI.Label(newRect(0,Screen.height*0.2f,Screen.width,60),"游戏失败");
GUI.skin.label.fontSize=20;
if(GUI.Button(newRect(Screen.width*0.5f-50,Screen.height*0.5f,100,30),"返回主菜单"))
{
Application.LoadLevel("start");//读取关卡
m_score=0;
m_life=GlobalPramameters.playerLife;
GlobalPramameters.currentLevel=0;
}
}
if(GlobalPramameters.currentLevel==4&&Helicopters_Apache==null)
{
GUI.skin.label.fontSize=50;//放大字体
GUI.Label(newRect(0,Screen.height*0.2f,Screen.width,60),"YOUAREWINNER!
");
GUI.skin.label.fontSize=20;
//进入下一关按钮
if(GUI.Button(newRect(Screen.width*0.5f-50,Screen.height*0.4f,100,30),"返回主菜单"))
{
Application.LoadLevel("start");//读取关卡
m_score=0;
m_life=GlobalPramameters.playerLife;
GlobalPramameters.currentLevel=0;
}
}
GUI.skin.label.fontSize=15;
GUI.Label(newRect(150,5,100,30),"生命值:
"+m_life);//显示生命值
//显示记录
GUI.skin.label.alignment=TextAnchor.LowerCenter;
GUI.Label(newRect(0,5,Screen.width,30),"记录:
"+m_hisore);
//显示当前得分
GUI.Label(newRect(0,25,Screen.width,30),"得分:
"+m_score);
}
4.6敌人生成逻辑实现:
voidUpdate()
{
canInstance=false;
if(m_gameModel=="SurviveModel")
{
//控制生成不同敌人的时机
currentScore=SurviveModelManage.Instance.GetScore();
if(currentScore>=350)
canInstance=true;
elseif(currentScore>=250&&this.gameObject.tag.CompareTo("Model_Helicopters_Apache")!
=0)
canInstance=true;
elseif(currentScore>=100&&(this.gameObject.tag.CompareTo("Enemy")==0||this.gameObject.tag.CompareTo("SuperEnemy")==0))
canInstance=true;
elseif((this.gameObject.tag.CompareTo("Enemy")==0))
canInstance=true;
}
//控制挑战模式下游戏难度
if(GlobalPramameters.currentLevel==3&&this.m_enemy.tag.CompareTo("Model_Helicopters_Transport")==0)
enemyNumber=25.0f;
elseif(GlobalPramameters.enemyCount>20)
enemyNumber=5.0f;
elseif(GlobalPramameters.enemyCount>10)
enemyNumber=10.0f;
else
enemyNumber=15.0f;
m_timer-=Time.deltaTime;
if(m_timer<=0)
{
m_timer=Random.value*enemyNumber;//Random.value随机生成0.0到1.0的数
if(GlobalPramameters.currentLevel==3&&this.m_enemy.tag.CompareTo("Model_Helicopters_Transport")==0)
m_timer=17;
elseif(m_timer<4)
m_timer=4;
if(m_gameModel=="SurviveModel"&&canInstance)
{
Instantiate(m_enemy,m_transform.position,Quaternion.identity);
}
elseif(m_gameModel!
="SurviveModel")
{
Instantiate(m_enemy,m_transform.position,Quaternion.identity);
GlobalPramameters.enemyCount+=1;
}
}
}
第五章收获
在这次游戏设计开发中,使用了Unity3d,VS2012,3dMax等开发工具,涉及到的关键技术有UV动画的制作,物体精确碰撞检测的实现,物体追随鼠标移动,需要改进的地方,游戏背景比较单调,战机类型较少,敌机级别种类太少,战机的功能、子弹种类。
特效等等。
第六章参考文献
【1】Unity3D游戏开发_宣雨松著_人民邮电出版社
【2】Unity3D手机游戏开发金玺曾 著清华大学出版社
【3】3dsmax总动员Modeling人体建模篇(4DVD)作者:
窦项东出版社:
科学出版社
【4】从零开始:
3dsmax基础培训教程(3dsmax7中文版)作者:
詹翔,王海英出版社:
人民邮电出版社
学生学习心得
通过本次游戏开发,加深了我对游戏设计与实现的理解,增强了对理论知识的运用和理解,同时也发现了自己的很多不足之处,学到了自学到一些其他方面的知识。
也锻炼了团队协作能力。
同时要感谢技术好的同学和老师对我们帮助和指导。
学生(签名):
杨鹤
2015年07月04日
诚信承诺
本人郑重声明所呈交的课程报告是本人在指导教师指导下进行的研究工作及取得的研究成果。
据我所知,除了文中特别加以标注的地方外,论文中不包含其他人已经发表或撰写过的研究成果。
与我一同工作的同学对本文研究所做的贡献均已在报告中作了明确的说明并表示谢意。
学生(签名):
杨鹤
任课
教师
评语
成绩评定:
任课教师(签名):
年月日