项目要求
- 请访问网站仔细观察“端午赛龙舟”的Scratch游戏,请将该游戏改写成基于Android平台的“端午赛龙舟”游戏(图片可自行设计、选择),具体要求如下:
(1) 河堤要不停向下移动(纵向屏幕);
(2) 可以通过能够触摸屏幕的方向控制龙舟左右移动,改变方向;手势在屏幕向右滑动,龙舟则向右移动,手势在屏幕向左滑动,龙舟则向左移动;
(3)在河面随机设置礁石、粽子,龙舟碰到礁石扣分1分,碰到粽子加分+2分;如果龙舟的分数小于0,则游戏失败,如果龙舟获得的分数超过100,游戏胜利结束。根据礁石的数量和相邻的位置设置游戏的难度等级(简单、中等、困难)。礁石的数量增加,难度增加。
(4)制作河岸两边的灌木能轻微摆动的动画;
(5)游戏可以分为单人版本,和网络多人版本。多人在线玩的时候,不同的龙舟不可以碰撞,一旦发生碰撞游戏重置;谁先得到100分谁就获胜,或者谁先得到负分,谁就失败。要求统计登录玩家的每次游戏获得的分数和参加游戏的时间;
(6)请配置游戏的背景音乐,以及龙舟碰撞礁石、粽子碰撞的音效。背景音乐和音效用户可以设置打开关闭,自行选择;
(7)请设置游戏的规则说明及帮助信息;
(8)请设置游戏的开发者信息,要求包括班级、学号、姓名
项目功能介绍
(一)登录注册
A.功能
①跳转注册页面
②跳转登录界面
③小功能:熊猫动画
④登录或注册失败则提示
⑤远程连接超时,不进行TCP连接
⑥无网络提示,不进行TCP连接
B.结果展示
C.关键代码
①BoatGameServer(服务器端)
1 | package Server; |
②SQLUtil(数据库工具类 服务器端)
1 | package Utils; |
③TCPUtil(TCP连接工具类 安卓端)
1 | package utils; |
④UserLoginTask:(异步任务进行网络连接 安卓端)
1 | /** |
(二)主菜单
A.功能
①选择游戏模式:简单、普通、困难
②设置背景音乐音量、游戏音效音量
③查看游戏说明
④查看开发者信息
⑤查看游戏记录
B.结果展示
(三)游戏主界面
A.开发思路
①绘制循环背景层
②绘制障碍和食物,维护一个List存储需要绘制的节点,如果节点移出屏幕,则从List移出
③上述开三个线程,背景更新线程,障碍生成线程和食物生成线程
④船体移动View,设置背景,并设置帧动画,主活动重写onTouchEvent方法
⑤船体闪烁线程,遭遇障碍,船体闪烁
B.功能
①背景绘制层SurfaceView:
绘制循环背景,绘制障碍和食物
开启障碍生成线程、食物生成线程、背景更新线程
②主活动:
开启检测线程:碰撞检测、计分
开启船体移动
设置游戏模式以及相关参数
开启游戏音频
开启船体闪烁线程:遭遇障碍触发
C.游戏说明
1.游戏分为简单、普通和困难三个模式
2.每种模式障碍和食物生成速率不同,船体移动速度不同
3.遇到障碍扣1分,捕获食物得2分,触发船体闪烁线程
4.触礁或者低于0分,则游戏失败
5.获得100分,则游戏胜利
6.船体只允许左右移动,不允许上下移动
7.食物和障碍随机生成
8.游戏记录:仅当游戏正常结束时才被记录,中途退出不做记录
9.后台切换至游戏界面即重新开始游戏,不做游戏中途保留
D.功能展示
E.关键代码
①BackgroundMediaService
1 | package service; |
②SingleModeActivity
1 | /** |
③BackgroundView
1 | /** |
④BoatView
1 | package layout; |
(四)游戏记录
A.开发逻辑
onResume中进行记录开始时间,terminateGame函数中记录结束时间并插入数据
B.功能
记录每次完整的游戏记录
C.功能显示
D.关键代码
I. 数据库配置
①Litepal.xml
1 |
|
②AndroidManifest.xml
1 | <application |
③Gradle
compile ‘org.litepal.android:core:1.3.2’
II. LitePalUtil(数据库工具类)
1 | package utils; |
(五)Android端项目目录简介
App
src
Main
Assets
Litepal.xml (开源库LitePal配置文件)
Java
Adapter
RecordAdapter.java (RecyclerView适配器)
Bean
Node.java (障碍或食物节点类)
Record.java (游戏记录类)
User.java (用户账户类)
Com.example.louris.Boatgame
AppEntryActivity.java (App入口界面Activity)
GameRecordActivity.java (游戏记录Activity)
LoginActivity.java (登录Activity)
MenuActivity.java (游戏菜单Activity)
SingleModeActivity.java (单人模式游戏主界面Activity)
BaseActivity (Activity基类,上述所有Activity继承自此基类)
Layout
BackgroundView.java (背景层SurfaceView子类)
BoatView.java (龙舟View子类)
TreeView.java (树木View子类)
Service
BackgroundMediaService.java (背景音乐服务类)
Utils
ActivityCollectorUtil.java (活动收集工具类)
CommonDateUtil.java (Date时间格式工具类)
GetActivityUtil.java (Activity强制类型转换工具类)
LitePalUtil.java (LitePal数据库操作工具类)
NetworkUtil.java (网络工具类)
ServiceUtil.java (服务工具类)
TCPUtil.java (TCP连接工具类)
Res
Drawable
Boat1.png (龙舟第一帧)
Boat2.png (龙舟第二帧)
Boat3.png (龙舟第三帧)
Boat_animation_list.xml (龙舟帧动画配置)
Btn_bg_normal.mxl (按钮正常时样式)
Btn_bg_pressed.xml (按钮按下时样式)
Entry_image.jpg (App入口背景)
Food.png (粽子图)
Gameover.png (游戏失败图)
Ic_launcher_background.xml
Panda1.png (熊猫第一帧)
Panda2.png (熊猫第二帧)
Panda3.png (熊猫第三帧)
Panda4.png (熊猫第四帧)
Panda5.png (熊猫第五帧)
Panda_animation_list.xml (熊猫帧动画配置)
Record_background.jpg (游戏记录界面背景图)
River.png (河道背景图)
Stone.png (障碍石头图)
Surface.jpg (菜单界面背景图)
Tree1.png (树木第一帧)
Tree2.png (树木第二帧)
Tree3.png (树木第三帧)
Tree_animation_list.xml (树木帧动画配置)
Win.png (游戏胜利图)
Layout
Activity_app_entry_layout.xml (游戏入口界面活动布局)
Activity_game_record_layout.xml (游戏记录活动布局)
Activity_login_layout.xml (登录界面活动布局)
Activity_menu_layout.xml (游戏菜单界面活动布局)
Activity_single_mode_layout.xml (单人模式活动布局)
Record_item.xml (游戏记录RecyclerView子项布局)
Raw
Background.mp3 (背景音乐)
Food.mp3 (捕获食物音频)
Gameover.mp3 (游戏失败音频)
Success.mp3 (游戏胜利音频)
Warning.mp3 (遭遇障碍音频)
Values
Color.xml (颜色属性)
Dimens.xml (登录样式属性)
Strings.xml (字符串属性)
Styles.xml (样式属性)
AndroidManifest.xml
Build.gradle
(六)服务器端项目目录简介
Src
Bean
User (用户账户类)
Server
BoatGameServer (服务程序类)
Utils
SQLUtil (SQL数据库操作工具类)
Lib
Commons-beanutils-1.7.0.jar
Commons-collections-3.2.1.jar
Commons-httpclient-3.1.jar
Commons-lang-2.3.jar
Commons-logging-1.1.1.jar
Ezmorph-1.0.3.jar
Json-lib-2.4-jdk15.jar
Mysql-connector-java-5.1.46.jar
(七)其他
异常分析与处理
(一)多线程访问临界资源异常
问题原因:多线程访问障碍或食物List,导致异常
解决方案:对临界资源加上同步锁,当该线程访问资源时,其他线程访问该资源时阻塞,达到多线程访问的目的
例:
1 | synchronized (list){ |
(二)Context转Activity异常解决方案
问题原因:在View中使用Activity的内置方法时,需要根据Context获得该View所在的Activity实例,强制转换((Activity)getContext)有时会发生异常。
解决方案:编写工具类
1 | package utils; |
(三)游戏记录时间格式问题
问题原因:Date date=new Date()的格式不是标准的xxxx-xx-xx xx:xx的形式
解决方案:编写转换工具类
1 | package utils; |
(四)获取网络状态异常
问题原因:由于登录需要网络,故需要获取网络状态,直接获取时,如果没有网络,NetworkInfo返回null,造成异常
解决方案:编写网络状态工具类
1 | /** |
(五)障碍和食物重叠异常
问题原因:食物和障碍有时生成会有重叠
解决方案:获取食物和障碍生成的间隔时间的公倍数,避免同一时刻产生食物和障碍
1 | /** |
(六)服务器端jar包缺失异常
问题原因:服务器端数据库操作需要导入jar包,刚开始导入包不足
解决方案:
导入:
Commons-httpclient-3.1.jar
Commons-lang-2.3.jar
Commons-logging-1.1.1.jar
Ezmorph-1.0.3.jar
Json-lib-2.4-jdk15.jar
Mysql-connector-java-5.1.46.jar
Commons-collections-3.2.1.jar
Commons-beanutils-1.7.0.jar
(七)内存溢出异常
问题原因:加载图片资源过多,或者图片资源过大
解决方案:
对加载的图片进行压缩处理,减少图片存储大小,本机不在报异常。
但是安装在其他手机中可能会出现内存溢出异常,这个未解决。
(八)其他
①许可异常
记得在注册配置文件中加入相应许可。
②服务异常
记得在注册配置文件中注册服务。
③安装APK异常
异常代码:java.lang.OutOfMemoryError: Failed to allocate a 18629292 byte allocation with 4194208 free bytes and 14MB until OOM
不同手机可能运行有异常,自己的手机调试安装没有问题,自己的模拟器测试有问题,解决了,但是其他手机安装有问题,怀疑是不同手机的APK版本问题,所以考虑是适配不同版本出现的问题。而后借其他手机进行测试,发现出现了上述内存溢出的问题,本机不会,故代码健壮性还需要加强,对于内存的管理同样也要加强,暂时没有解决该问题。
④服务器端连接MYSQL异常
连接MYSQL时需要在url中加入?useSSL=false,新版本的MYSQL传输安全性的问题,这里不使用SSL即可。
项目链接