textMenu中的"退出"都要成功的将当前应用挂起的多个Acitivity和当前Android虚拟机显示的Activity顺利的停止,并销毁。
3.1.2 APP应用设置
设置应用系统背景音乐声音大小和游戏难度。
使用SeekBar来控制系统音量,使用RadioGroup来控制飞机难度。
3.1.3 玩家信息管理
在游戏结束时对于玩家的名称和得分进行记录,并在玩家查看排名情况时,以倒序形式显示前六名玩家的得分和等信息。
3.2 系统类关系图
系统实体类、边界类、控制类之间的关系如图3-1所示:
图3-1 实体类、控制类、边界类之间的关系
各个界面类之间的关系如图3-2所示:
图3-2 APP边界类关系
3.3 系统总体设计
系统的中只有玩家一种用户,不必向其他的网站或者是教务系统一样进行身份验证等操作。玩家点击应用图标直接进入应用的开始界面。用户的操作总体可以归并成如3-3玩家用例图所显示的内容,子弹的用例图如图3-4所示,飞机的用例图如图3-5所示。
用户的操作基本可以划分为"开始游戏","设置游戏","玩游戏","查看分数","退出游戏"这五个用例。
图3-3 玩家用例图
图3-4 子弹用例图
图3-5 飞机用例图
第4章 系统详细设计
4.1 开发工具简介
Android开发工具(ADT)是一个插件的Eclipse IDE,目的是给开发人员提供一个强大的、集成的环境中构建Android应用程序。
扩展能力的Eclipse ADT让你迅速建立新的Android项目,创建一个应用程序的用户界面,添加基于安卓框架的API,调试您的应用程序使用Android SDK工具,生成apk文件在使用Eclipse运行Android应用的时候Eclipse会自动的将生成的apk文件自动的注册到Android虚拟机中。
在Eclipse ADT发展与高度推荐,是一种最快的方式开始。与引导项目设置它提供,以及工具集成、定制XML编辑器和调试输出窗格,ADT给了你极大的提高在发展中Android应用程序。
使用Eclipse集成Android ADT做Android应用开发是目前企业中常用的Android应用开发方式。
本项目在开发环境:
* JDK 1.7
* Eclipse 3.7.0
* Android ADT4.03
4.2 数据库设计
本应用使用的是Android虚拟机做开发,因此使用的为Android虚拟机中自带的数据库SQLite。本应用只是在针对用户得分及用户等基本信息进行存储,因此数据库非常简单,仅仅是设计了一个用来存储用户排名信息的表结构。用来存储用户基本信息的compositor_table的字段信息如图4-1所示。
CREATE TABLE [compositor_table] (
id INTEGER PRIMARY KEY,
name VARCHAR(40) NOT NULL,
score INTEGER NOT NULL)
图4-1 compositor表
Android中自带的SQLiteOpenHelper 作用:一个帮助类,帮助创建数据库和数据库版本管理。
本应用直接创建一个SkyGameDataBaseHelper类继承Android自带的数据库操作类SQLiteOpenHelper。在onCreate()方法中创建表compositor_table。
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
String create_table = this.context.getResources().getString(R.string.create_compos_table);
// CREATE TABLE [compositor_table] (id INTEGER PRIMARY KEY,name VARCHAR(40) NOT NULL,score INTEGER NOT NULL);
db.execSQL(create_table);
}
4.2.1 DAO(数据库访问对象)
本应用中的数据库访问对象SkyGameDataBaseDao采用了单例模式,以保证当前应用中只存在一个DAO数据库访问对象。使用了最简单的单例,并未从线程安全的角度进行进一步的限制,原因在于考虑到当前应用中只有3个Activity使用了DAO,由图4-2可知Activity之间的切换类似于进程对于CPU的占用一样,当前显示在界面上的Activity是活动状态而其他Activity则是挂起状态,因此不必担心它们的线程同时去创建DAO对象以引起当前系统中多个DAO对象的状况。
public class SkyGameDataBaseDao {
private static SkyGameDataBaseDao instance = null;
private SQLiteDatabase database = null;
private Context context = null;
private SkyGameDataBaseHelper helper = null;
public static SkyGameDataBaseDao getInstance (Context context){
if(instance == null){
instance = new SkyGameDataBaseDao(context);
}
return instance;
}
private SkyGameDataBaseDao(Context context){
this.context = context;
helper = new SkyGameDataBaseHelper(context,1);
while((this.database = helper.getWritableDatabase())==null);
}
public void insertPlayer(SkyGamePlayer player){
String sql = context.getResources().getString(R.stringpos_table);
ContentValues values = new ContentValues();
values.put("score",player.getScore());
values.put("name", player.getName());
if(!this.database.isOpen()){
this.helper.onOpen(this.database);
}
try {
this.database.beginTransaction();
this.database.insert(sql, null, values);
this.database.setTransactionSuccessful();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
this.database.endTransaction();
}
}
public ArrayList
getPlayers(){
ArrayList players = new ArrayList();
String sql = context.getResources().getString(R.string.select_form_compos_table_count);
Cursor cursor = database.rawQuery(sql, null);
cursor.moveToFirst();
if(cursor.getCount() > 0){
int count = 0;
count++;
players.add(new SkyGamePlayer(count,cursor.getString(1),cursor.getInt(2)));
while(cursor.moveToNext()){
count ++;
players.add(new SkyGamePlayer(count,cursor.getString(1),cursor.getInt(2)));
}
}
return players;
}
public void delete(){
String sql = context.getResources().getString(R.string.delete_from_compos_table);
if(!this.database.isOpen()){
this.helper.onOpen(this.database);
}
try {
this.database.beginTransaction();
this.database.execSQL(sql);
this.database.setTransactionSuccessful();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
this.database.endTransaction();
}
}
public void close(){
if(this.database.isOpen()){
this.database.close();
}
}
}
图4-2 Android中Activity生命周期状态图
4.2.2 SQLite数据库
SQLite,是一款轻量级的关系型数据库。由于它占用的资源非常少,所以在很多嵌入式设备都是用SQLite来存储数据。
Android作为目前主流的移动操作系统,完全符合SQLite占用资源少的优势,故在Android平台上,集成了一个嵌入式关系型数据库-SQLite。
由于SQLite是轻量级的关系型数据库,它支持的SQL语句也是有限的,在使用SQL语句获得前6名玩家的信息时直接使用了SQLite不支持的TOP语句引起了异常。在查阅相关资料后才发现SQLite不支持TOP语句,因此使用语句DESC LIMIT来代替TOP达到了自己想要的只获得表compositor_table中的score字段值最大的前六个记录信息。
SELECT * FROM [compositor_table] ORDER BY [score] DESC LIMIT 6
4.3 游戏界面设计
4.3.1开始界面
使用SurfaceView将图4-3中的未被按下的按钮和图4-5游戏开始界面背景图片绘制成游戏开始界面图4-6。
图4-3 未被按下的按钮图标集图
4-4 被按下的按钮图标集
图4-5 开始界面背景图片
图4-6 开始界面
上一篇:基于android的资源管理器
下一篇:计算机网络毕业论文