BasketBallShot火力篮球项目分析报告.docx
《BasketBallShot火力篮球项目分析报告.docx》由会员分享,可在线阅读,更多相关《BasketBallShot火力篮球项目分析报告.docx(16页珍藏版)》请在冰豆网上搜索。
![BasketBallShot火力篮球项目分析报告.docx](https://file1.bdocx.com/fileroot1/2023-4/17/74ab8547-c5cb-48b6-8a5c-510ee4b8f5d3/74ab8547-c5cb-48b6-8a5c-510ee4b8f5d31.gif)
BasketBallShot火力篮球项目分析报告
BasketBall_Shot项目分析报告
一、项目简介
BasketBall_Shot是一款模拟街头投篮游戏机的安卓手机游戏。
火力篮球,通过模拟现实中的投篮游戏机,而投篮游戏机又是源于街头篮球,街头篮球起源于美国,现在已经流行于世界的体育竞技项目。
将投篮部分独立出来做成投篮游戏机,成为了专门的投篮类游戏设备。
本游戏就是将该投篮游戏机带到手机上,只需动一下手指即可享受投篮游戏机的乐趣。
火力篮球借助第三方物理引擎Bullet,使用OpenGLES2.0进行图像渲染,结合智能手机的触摸技术打造的一款小型手机游戏。
玩家通过触摸屏幕,点击球,然后移动手指,程序通过玩家移动的方向和距离来换算投篮的方向和初始速度。
下面我们将对该游戏进行一系列的项目结构、资源及类方面的分析。
二、项目结构
如图1所示,为整个BasketBall_Shot的一个结构树图,它主要包括以下几个部分——
1)源码部分(src),这个文件夹下包含了项目的代码包com.tn.tl,包中包含了BasketBall_Shot的全部实现代码,即各种类的java文件。
每个类都实现不同的游戏功能或者界面展示等等;
2)Gen文件夹,为系统自动生成的相关的java文件。
gen文件夹中的R.java文件是在建立项目时自动生成的,这个文件是只读模式,不能更改,R.java文件是定义该项目所有资源的索引文件。
这里定义了很多常量等,仔细一看就发现这些常量的名字都与res文件夹中的文件名相同,这再次证明R.java文件中所存储的是该项目所有资源的索引。
有了这个文件,在程序中使用资源将变得更加方便,可以很快地找到要使用的资源,由于这个文件不能被手动编辑,所以当我们在项目中加入了新的资源时,只需要刷新一下该项目,R.java文件便自动生成了所有资源的索引。
3)Assets和res,均为安卓的存放资源的文件。
在建立项目中一般会默认建立assets文件,当然我们还可以在res文件下面建立raw文件夹,这里面都可以存放一些图片,音频或者文本信息,可以供我们在程序当中进行使用,两者目录下的文件在打包后会原封不动的保存在apk包中,不会被编译成二进制,不过它们两个也有不同点。
assets下面的文件不会被编译,通过路径可以去访问其中的内容。
raw中文件会自动编译,我们可以在R.java文件中找到对应的ID;
4)Lib文件夹里头为程序实现过程中需要借助的第三方库函数,jbullet.jar为第三方物理引擎Bullet所需的支撑函数库,vetmath.jar为需要借助的3D函数库;
5)Res文件下的layout文件夹为系统的界面设计xml文件,raw下存放了该游戏需要引用的声音资源,如beijingyingyu.mp3,drawable-nodpi下放置了游戏需要使用到的图片资源;
6)Assets下面放置了篮筐的实现模型,lankuang.obj;
7)Values文件下存放了游戏的一些变量的名称等;
8)AndroidManifest.xml为是Android应用程序中最重要的文件之一。
它是Android程序的全局配置文件,是每个android程序中必须的文件。
它位于我们开发的应用程序的根目录下,描述了package中的全局数据,包括package中暴露的组件(activities,services,等等),以及他们各自的实现类,各种能被处理的数据和启动位置等重要信息。
图1项目结构树图
三、项目资源
游戏实现主要需要引用四种类型的资源——
1)库函数,除了android开发基本的库函数外,这里我们的游戏火力篮球另外引用了两个第三方的库函数,一者为BasketBall_Shot\lib目录下的jbullet.jar,它为第三方物理引擎Bullet所需的支撑函数库,二者同为该目录下的vetmath.jar,它为java3D建模开发需要的一个支撑函数库;
2)图片文件,这部分文件为游戏过程的一些背景图案,物体图片等等,主要存放在BasketBall_Shot\Res\drawable-nodpi中,我们的火力篮球一共采用了51张图片资源,这里就不一一列举了;
3)声音文件,这部分资源文件为游戏过程中调用的音乐文件,存放在BasketBall_Shot\Res\raw下;
4)物理模型,这个主要为篮圈的物理模型实现,存放在BasketBall_Shot\assets\lankuang.obj下。
四、项目类关系
该游戏中开发的类比较多,为了能够更好的理解各个类的在游戏中所扮演的角色,将图2中所示的游戏中涉及的全部类按照类所实现的不同功能进行分类,如下所示——
●共有类
●辅助界面相关
●游戏界面相关类
●相关着色器
图2游戏类框架
根据火力篮球游戏的具体实现代码,我整理了全部类之间的相互调用、依赖关系,得到了项目的类关系,如图3所示。
图3类关系示意图
五、项目类结构及其功能
5.1公共类介绍
BasketBall_Shot_Activity类是游戏的控制器,负责游戏的切屏等操作。
图4BasketBall_Shot_Activity类功能介绍
图4为BasketBall_Shot_Activity的类的主要方法:
ØonCreate():
父类方法的重载,完成游戏的初始化工作,包括界面、数据库、声音资源和消息处理器等;
ØgetGLVersion():
获取OPENGLES所支持的最高版本;
ØchushihuaScreen():
初始化屏幕分辨率;
ØonKeyDown():
父类方法的重载,用于响应按键消息;
ØchushihuaSounds():
初始化声音的方法;
ØshengyinBoFang():
用户声音播放的方法。
5.2辅助界面相关类介绍
5.2.1主菜单界面CaiDanView类介绍
CaiDanView类主要用于实现主菜单界面的显示及相应的触摸功能的实现。
图5CaiDanView类功能介绍
该类的主要方法介绍为——
ØCaiDanView():
类初始化函数;
ØonDraw():
初始化画布,并将菜单中的按钮添加到画布中;
ØonTouchEvent():
获取屏幕触摸事件,并定位触发的位置,从而得出事件类型;
ØdoDraw():
调用onDraw()方法进行画布的初始化;
ØsurfaceChanged():
父类方法的重载;
ØsurfaceCreated():
父类方法的重载,调用doDraw()方法;
ØsurfaceDestroyed():
父类方法的重载;
ØinitBitmap():
初始化定义的Bitmap类型参数。
5.2.2设置声音界面ShengyinKGJiemian类介绍
ShengyinKGJiemian类主要用于声音设计界面的绘制和实现声音的调节功能。
图6ShengyinKGJiemian类功能介绍
ShengyinKGJiemian类中的主要方法:
ØonDraw():
初始化画布,并将有关声音调节的按钮添加到画布中;
ØonTouchEvent():
获取屏幕触摸事件,并定位触发的位置,从而得出声音调节的请求类型;
ØonDrawcanvas():
调用onDraw()方法进行声音设置画布的初始化;
ØsurfaceChanged():
父类方法的重载;
ØsurfaceCreated():
父类方法的重载,调用onDrawcanvas()方法;
ØsurfaceDestroyed():
父类方法的重载;
ØinitBitmap():
初始化声音设置界面所定义的Bitmap类型参数。
5.2.3关于界面GuanYuView类介绍
GuanYuView类主要用于实现关于界面的绘制、相关的功能实现和响应。
图7GuanYuView类功能介绍
GuanYuView类中的主要方法:
ØonDraw():
初始化画布,并将关于菜单中的相关界面显示元素添加到画布中;
ØonTouchEvent():
获取屏幕触摸事件,并定位触发的位置,从而得出事件类型;
ØonDrawcanvas():
调用onDraw()方法进行关于界面画布的初始化;
ØsurfaceChanged():
父类方法的重载;
ØsurfaceCreated():
父类方法的重载,调用onDrawcanvas()方法;
ØsurfaceDestroyed():
父类方法的重载;
ØinitBitmap():
初始化关于界面所定义的Bitmap类型参数。
5.2.4记录界面JiLuView类介绍
JiLuView类用于绘制游戏记录查看界面,显示游戏过程中产生的分数和记录情况。
图8JiLuView类功能介绍
JiLuView类中的主要方法:
ØonDraw():
初始化画布,并将记录页面涉及的页面元素添加到画布中,如时间和分数滚动背景、颜色条等;
ØdrawRectBeijing():
绘制长方形背景;
ØdrawScoreStr():
绘制得分情况;
ØdrawRiQi():
根据获取的日期,绘制出相应的日期;
ØonTouchEvent():
获取屏幕触摸事件,并定位触发的位置,从而得出按照成绩排序或者按照时间排序等方式对成绩进行排序的事件类型;
ØonDrawcanvas():
调用onDraw()方法进行关于界面画布的初始化;
ØsurfaceChanged():
父类方法的重载;
ØsurfaceCreated():
父类方法的重载,调用doDraw()方法;
ØsurfaceDestroyed():
父类方法的重载;
ØinitBitmap():
初始化定义的Bitmap类型参数。
5.2.5游戏结束界面YouXiJieShuView类介绍
YouXiJieShuView类主要用户绘制当游戏结束时的界面,提供返回菜单和退出选项。
图9youxiujiemian类功能介绍
YouXiJieShuView类中的主要方法:
ØonDraw():
初始化画布,并将游戏结束页面中的相关界面元素添加到画布中;
ØonTouchEvent():
获取屏幕触摸事件,并定位触发的位置,从而得出事件类型;
ØonDrawcanvas():
调用onDraw()方法进行游戏结束界面画布的初始化;
ØsurfaceChanged():
父类方法的重载;
ØsurfaceCreated():
父类方法的重载,调用onDrawcanvas()方法;
ØsurfaceDestroyed():
父类方法的重载;
ØinitBitmap():
初始化关于界面所定义的Bitmap类型参数。
5.2.6数据库相关类SQLiteUtil类介绍
SQLiteUtil类主要用于进行对Android设备上轻量级数据库SQLite的操作,将游戏中需要存储的信息存入数据库中。
图10SQLiteUtil类功能介绍
SQLiteUtil类中的主要方法:
ØcreateOrOpenDatabase():
打开指定的数据库,如果不存在则新建相应的数据库;
ØcloseDatabase():
该方法用于关闭当前打开的数据库;
ØcreateTable():
用于新建数据库中的表;
Øinsert():
向数据库中插入记录;
Øquery():
从数据库中读取记录;
ØinitDatabase():
初始化数据库,当数据库中不存在记录排行榜的表时,调用createTable()方法创建表;
ØinsertTime():
向数据库的排行榜表中插入时间的记录。
5.3游戏界面相关类介绍
5.3.1游戏界面绘制类GLGameView
GLGameView类主要功能是调用OpenGLES所支持的功能,初始化游戏引擎,对游戏的画面、3D效果进行渲染。
图11GLGameView类功能介绍
GLGameView类中的主要方法:
ØinitWorld():
该方法用于初始化物理世界,包括创建碰撞检测配置信息对象、创建碰撞检测算法分配者对象(其功能为扫描所有的碰撞检测对,并确定适用的检测策略对应的算法)、创建推动约束解决者对象、创建物理世界对象、设置重力加速度、创建共用的立方体、创建共用的平面形状、创建篮球刚体等;
ØonTouchEvent():
获取游戏界面的屏幕触摸事件,并定位触发的位置,从而得出事件类型,从而触发投篮相关操作和效果;
ØinitObjectWelcome():
创建欢迎界面的物体对象;
ØinitObject():
初始化对象方法;
ØballControlUtil():
这里主要是用于对球的物理引擎部分进行操作;
ØinitBitmap():
这里主要是用于将图片加载成Bitmap;
ØloadTexture():
通过IO加载图片;
ØinitTexture():
初始化加载的图片,生成纹理ID。
5.3.2着色器程序管理器类ShaderManager
ShaderManager类主要用于实现着色器程序的管理功能。
图12ShaderManager类功能介绍
ShaderManager类中的主要方法:
ØloadCodeFromFile():
加载顶点着色器的脚本内容和片元着色器的脚本内容;
ØcompileShader():
这里主要是编译3D中欢迎界面中的shader;
ØcompileShaderReal():
编译3D物体的shader;
ØgetCommTextureShaderProgram():
返回普通的shader程序;
ØgetShadowshaderProgram():
返回影子的shader程序;
ØgetLightAndTextureShaderProgram():
返回光照纹理的shader程序;
ØgetBlackgroundShaderProgram():
返回仪表板背景为黑色的然后再着色器中转换成透明的shader程序;
ØgetBasketNetShaderProgram():
返回篮网的shader程序。
5.3.3添加刚体进物理世界类TianjiaBody
TianjiaBody主要的功能是实现创建刚体对象并初始化,然后将刚体添加进物理世界。
图13TianjiaBody类功能介绍
TianjiaBody类中的属性为:
Øgangti:
声明刚体变量,在构造函数中会对该变量进行初始化并加入到物理世界中;
isnoLanBan:
是否和篮板在前一刻碰撞了,0表示没有碰撞。
5.3.4添加胶囊刚体进物理世界类JiaoNangTianjiaBody
JiaoNangTianjiaBody主要的功能是创建胶囊刚体对象并初始化,然后将胶囊刚体添加进物理世界。
图14JiaoNangTianjiaBody类功能介绍
JiaoNangTianjiaBody类中的主要方法:
ØyAngle:
构造函数中使用到的Y轴方向的角度;
Øgangti:
声明刚体变量,在构造函数中会对该变量进行初始化并加入到物理世界中;
ØisnoLanBan:
是否和篮板在前一刻碰撞了,0表示没有碰撞。
5.3.5篮球控制类BasketBallForDraw
BasketBallForDraw类用来实现对篮球的控制,包括篮球的反弹系数、摩擦系数等信息初始化和状态变化。
图15BasketBallForDraw类功能介绍
BasketBallForDraw类中的主要方法:
ØdrawSelf():
获取篮球的变换信息对象,然后进行篮球的移位变换和旋转变换。
5.3.6纹理矩形绘制类WenLiJuXing
WenLiJuXing类首先通过构造函数传入的传入宽高和纹理坐标数组对顶点坐标数据缓冲mVertexBuffer和顶点着色数据缓冲mTextureBuffer进行初始化操作,然后完成对纹理矩形的绘制工作。
图16WenLiJuXing类功能介绍
WenLiJuXing类中的主要方法:
ØinitShader():
初始化shader,获取程序中顶点位置属性引用id、顶点纹理坐标属性引用id和总变换矩阵引用id;
ØdrawSelf():
在shader初始化后,将最终变换矩阵传入shader程序,然后传入顶点位置数据,进行纹理矩形绘制。
5.4游戏中的相关着色器介绍
OpenGLES着色语言是两种紧密关联的语言。
这些语言用来在OpenGLES处理管线的可编程处理器创建着色器。
在本文档中,除非另外说明,一个语言功能适用于所有语言,并且通用用法将把他们当作一个语言来看待。
特定语言将指出它们的目标处理器:
顶点(vertext)或片元(fragment)。
任何被着色器使用的OpenGLES状态值都会自动地被跟踪并且作用于着色器上。
这个自动状态跟踪机制允许应用程序为状态管理而使用OpenGLES状态命令,并且这些状态值自动地应用在着色器上。
5.4.1顶点处理器
顶点处理器是一个处理输入顶点和相关数据的可编程单元。
OpenGLES着色语言中运行这个处理器的编译单元叫做顶点着色器(vertexshader)。
一个顶点着色器同时只能处理一个顶点。
5.4.2元处理器
片元处理器是一个处理片元和相关数据的可编程单元。
OpenGLES着色语言中运行这个处理器的编译单元叫做片元着色器(fragmentshader)。
片元着色器不能更改片元的位置。
访问相邻的片元也是不允许的。
片元着色器计算的值最终用在更新帧缓冲区内存或纹理内存,这要取决于当前OpenGLES状态以及产生片元的命令。
在本游戏的绘制效果和渲染过程中,涉及到5种着色器:
Ø只有纹理的着色器
Ø光照着色器
Ø影子着色器
Ø仪表盘背景着色器
Ø篮网着色器
六、总结
如同项目分析报告所描述的那样,火力篮球使用openGL,在第三方库函数的基础上实现了安卓端的投篮计分游戏,运行后的游戏截图如下所示——
通过本次实验报告分析对于安卓多媒体开发有了进一步的认识。
虽然游戏的整体场景已经很绚丽,但大家可以根据个人的爱好和习惯做进一步的改进,总体风格可以根据自己喜好来重新设计。
本游戏只是一个一分钟投篮游戏,只有一个排行榜,如果添加进别的花样可能会使该游戏更具可玩性和挑战性,能让玩家多多停留于此游戏。
图17游戏截图展示