安卓实验5.docx
- 文档编号:23966901
- 上传时间:2023-05-23
- 格式:DOCX
- 页数:78
- 大小:919.19KB
安卓实验5.docx
《安卓实验5.docx》由会员分享,可在线阅读,更多相关《安卓实验5.docx(78页珍藏版)》请在冰豆网上搜索。
安卓实验5
实验五推箱子游戏实现
一、实验目的
1)了解益智游戏开发的概念
2)了解游戏的开发过程
3)综合利用Android的开发技术实现推箱子游戏
2、实验环境与设备
实验分组进行,每组包括已安装Windows操作系统(WindowsXp)的2台计算机,Eclipse的Android实验环境,教师提供游戏的开发素材
三、预备知识
•开发背景
推箱子是一款来自日本的古老游戏,其设计目的是训练人的逻辑思维能力。
游戏场景一般是设定在空间狭小的仓库中,要求把箱子摆放到指定位置。
这就要求玩家巧妙的运用有限的空间和通道,合理的安排箱子的位置和移动次序才可能完成任务。
随着计算机游戏的发展,很多编程爱好者基于该游戏的思想开发了出各种版本、各种类型的推箱子。
这其中也包括很多手机版本的实现,伴随着手机与计算机的普及,很快推箱子游戏便进入了千家万户。
•功能需求
在游戏开发之前,首先需要对游戏所应该具有的功能进行分析,功能分析是游戏开发的前提,有了需求才可能游戏的开发,并且需求分析必须非常详细,以免造成不必要的损失。
具体的功能如下:
欢迎动画界面,游戏运行后首先进入的界面。
菜单的选择,还需要设计出菜单界面,并且在菜单界面至少有四种菜单供用户选择。
游戏的音效,游戏的过程中需要在适当的位置添加上音效,并且可以对音效进行开与关闭的设置。
游戏帮助,还需要为本游戏添加帮助界面,简单介绍游戏的基本功能及玩法。
键盘操控,主要是完成玩家与游戏的交互。
游戏的胜利,游戏需要设计适当的难度,使玩家能够经过努力完成游戏。
•游戏的策划
游戏的策划主要包括游戏的情节、目标受众、运行的目标平台、采用的呈现技术、操作方式等几个方面。
下面就针对本游戏对上述几个方面进行简单的介绍,如下所列。
游戏情节,本游戏为轻量级的益智游戏,因此不存在很复杂的情节。
这方面主要要做的工作主要为设计游戏各关仓库的形状、大小、可通过区域,以及各关中箱子的初始位置与目的地。
目标受众,这个游戏受众面比较广,应该是老少皆宜的。
考虑到受众面广的原因,应该将操作方式设计得更加人性化,画面更加清新。
运行的目标平台,本游戏的目标平台为Android2.1。
采用的呈现技术,推箱子游戏一般采用的都是2D的呈现技术,本案例为了增强游戏的吸引力,拟采用2.5D呈现技术。
2.5D呈现技术也有多种视角可供选择,本游戏采用45度视角。
操作方式,本游戏拟采用手机键盘进行操作,对于没有键盘的型号也可以考虑采用虚拟键盘。
4、实验内容
•开发前准备工作
由于该游戏使用Eclipse作为主要的开发工具,所以在开发之前需要检查Eclipse是否已经配置好。
准备游戏用到的图片资源
准备游戏用到的声音资源
•游戏的类框架
•各个类的组成
该游戏中开发的类比较多,为了让读者能够更好的理解各个类的在游戏中所扮演的角色。
共有类
欢迎界面相关类
菜单界面相关类
游戏界面相关类
•欢迎动画界面的设计与实现
当玩家运行游戏时,首先看到的是欢迎界面,欢迎界面是整个游戏的门面,良好的欢迎界面会增加玩家对游戏的视觉体验。
下面将开始对欢迎动画界面的开发进行介绍。
PushBoxActivity类框架的搭建
欢迎界面WelcomeView类的实现
刷帧线程WelcomeViewDrawThread的实现
动画线程WelcomeViewGoThread的实现
•菜单界面的设计与实现
欢迎动画界面已经开发完成,接下来将进入菜单相关界面的开发
•游戏界面的框架设计与实现
经过前面的开发,欢迎界面及菜单界面已经开发完成。
接下来将进入本游戏最复杂的界面——游戏界面的开发,首先需要对该界面的框架进行介绍。
•角色相关类的开发
经过前面的开发,游戏界面的框架已经搭建完成,但是此时还不能绘制任何物体,本节将对游戏的地图、各个实体以及相关线程进行介绍,为之后游戏界面的完善做好准备。
地图类MapList的实现
角色类MySprite的实现
键盘监听线程KeyThread的实现
角色移动线程SpriteMoveThread的实现
换帧线程SpriteThread的实现
•游戏界面的完善
前面已经将游戏界面需要的地图以及实体进行了介绍,接下来将使用之前开发的各个类来完善游戏的主界面,完成本游戏的开发。
箱子移动线程BoxThread的实现
刷帧线程GameViewDrawThread的实现
游戏界面GameView的完善
•游戏的优化与改进
本游戏的功能基本开发完全,但仍有很多方面可以进行优化和改进,本节将列出其中一部分,有能力的读者可以进一步对本游戏进行优化,提高游戏的档次。
音效的提升,本游戏中,并没有过多添加对音效的处理,有兴趣的玩家可以再添加一些适当的音效,以提升玩家的体验。
玩家的定制,本游戏中,应该添加上游戏难度的选择功能,使玩家根据自己的情况选择不同的等级进行游戏,这样才更加合理。
成绩的存储,如果能在游戏的最后加上游戏成绩的存储与排行,那更会大大提高玩家对本游戏的体验,增强游戏的人性化。
5、实验要求
基本要求
1)搭建Android开发环境
2)理解游戏框架结构
3)实现游戏菜单
4)完成声音控制
5)完成游戏说明
6)实现游戏确保游戏基本能运行
提高要求
1)添加音效
2)提高游戏难度
六、实验心得
本次实验属于综合性的实验,需要实现的内容比较多,一开始拿到题目还是疑惑比较大的,不知从何下手,后来根据老师提供的教学视频,大致知道了编写的顺序,以及具体的功能实现的编写。
在教学视频的帮助下,代码编写部分没有太大问题,主要难点在于明白代码的作用及其实现的功能,还有就是理清头绪,分布完成整个实验。
在原来程序的基础上,还进行了帮助界面的代码编写,实现帮助界面的呈现。
在运行时遇到了一些问题,由于在建立虚拟机时没有注意功能选项,使得建立起来的虚拟机的上下左右键是锁定,无法按下的,则使得游戏无法试玩,后来通过网上搜索找到了问题的所在,即将C:
\Users\sony\.android\avd\AVD_for_3_2in_HVGA_slider_ADP1.avd目录下的config文件中“dPad=no”改为“dPad=yes”即可,修改后使得游戏能够进行。
通过本次实验,能够将本学期所学的知识综合性的进行运用操作,不仅巩固了理论知识,加深了对安卓编程的熟悉,而且也学到了其他一些知识,加深了对安卓开发的兴趣。
除此之外,也发现了自身的很多的不足,对android相关知识的学习还不够深入,还需要以后更加深入的学习。
七、实验过程及代码、运行结果
1.导入图片素材
2.导入音频素材
3.欢迎界面
MainActivity类框架的搭建
设置全屏
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);
初始化背景音乐、开始音乐
backSound=MediaPlayer.create(this,R.raw.sound1);//背景音乐
backSound.setLooping(true);//设置循环
startSound=MediaPlayer.create(this,R.raw.sound3);
startSound.setLooping(true);
启动欢迎界面线程(睡眠时间200)
welcomeView=newWelcomeView(this);
if(isSound){
startSound.start();
}
this.setContentView(welcomeView);
welcomeViewGoThread=newWelcomeViewGoThread(this);
welcomeViewGoThread.start();
异步启动菜单
HandlermyHandler=newHandler(){//用来更新UI线程中的控件
publicvoidhandleMessage(Messagemsg){
if(msg.what==1){//收到WelcomeViewGoThread/Welcome发来的消息
welcomeViewGoThread.setFlag(false);
if(welcomeView!
=null){
welcomeView=null;
}
initAndToMenuView();//启动菜单
}
}
};
欢迎界面WelcomeView类的实现(欢迎界面实现类,负责欢迎界面的绘制工作)
packagecom.example.pushboxn;
importandroid.annotation.SuppressLint;
importandroid.graphics.Bitmap;
importandroid.graphics.BitmapFactory;
importandroid.graphics.Canvas;
importandroid.graphics.Color;
importandroid.graphics.Paint;
importandroid.view.SurfaceHolder;
importandroid.view.SurfaceView;
importandroid.view.View;
importandroid.view.View.OnClickListener;
@SuppressLint("ViewConstructor")
publicclassWelcomeViewextendsSurfaceViewimplementsSurfaceHolder.Callback,OnClickListener{//实现两个借口
MainActivitypushBoxActivity;
WelcomeViewDrawThreadwelcomeViewDrawThread=null;
Bitmapbitmap;
BitmapwallLeft;//左面的墙
BitmapwallRight;//右面的墙
Bitmapiron;//铁门
BitmapwoodLeft;//左面的木门
BitmapwoodRight;//右面的木门
Bitmapbackground;
Bitmapmountain;//背景的山
intwallLeftX=15;//墙的坐标
intwallLeftY=10;
intwallRightX=150;
intwallRightY=10;
intironX=15;//铁门的坐标
intironY=10;
intwoodLeftX=15;//木门的坐标
intwoodLeftY=10;
intwoodRightX=150;
intwoodRightY=10;
publicWelcomeView(MainActivitypushBoxActivity){//构造器
super(pushBoxActivity);
this.pushBoxActivity=pushBoxActivity;//得到引用
getHolder().addCallback(this);//添加接口的实现
welcomeViewDrawThread=newWelcomeViewDrawThread(this,getHolder());//初始化绘制线程
//图片初始化
wallRight=BitmapFactory.decodeResource(getResources(),R.drawable.wallright);
wallLeft=BitmapFactory.decodeResource(getResources(),R.drawable.wallleft);
bitmap=BitmapFactory.decodeResource(getResources(),R.drawable.image4);
iron=BitmapFactory.decodeResource(getResources(),R.drawable.image2);
woodLeft=BitmapFactory.decodeResource(getResources(),R.drawable.image33);
woodRight=BitmapFactory.decodeResource(getResources(),R.drawable.image3);
background=BitmapFactory.decodeResource(getResources(),R.drawable.background);//背景的水
mountain=BitmapFactory.decodeResource(getResources(),R.drawable.mountain2);
}
protectedvoidonDraw(Canvascanvas){//界面的绘制
canvas.drawColor(Color.WHITE);//背景白色
canvas.drawBitmap(background,0,0,newPaint());//绘制背景
canvas.drawBitmap(mountain,0,0,newPaint());//后面的山图片
canvas.drawBitmap(wallLeft,wallLeftX,wallLeftY,newPaint());//墙的左面
canvas.drawBitmap(wallRight,wallRightX,wallRightY,newPaint());//墙的右面
canvas.drawBitmap(iron,ironX,ironY,newPaint());//铁门
canvas.drawBitmap(woodLeft,woodLeftX,woodLeftY,newPaint());//木头门左面
canvas.drawBitmap(woodRight,woodRightX,woodRightY,newPaint());//木头门右面
canvas.drawBitmap(bitmap,0,0,newPaint());
this.setOnClickListener(this);//屏幕监听
}
publicvoidsurfaceChanged(SurfaceHolderholder,intformat,intwidth,
intheight){
}
publicvoidsurfaceCreated(SurfaceHolderholder){//创建时被调用
welcomeViewDrawThread.setFlag(true);//刷帧线程的循环变量
welcomeViewDrawThread.start();//启动刷帧线程
}
publicvoidsurfaceDestroyed(SurfaceHolderholder){//摧毁时被调用
booleanretry=true;//循环变量
welcomeViewDrawThread.setFlag(false);//停止刷帧线程
while(retry){
try{
welcomeViewDrawThread.join();//等待刷帧线程结束
retry=false;
}
catch(InterruptedExceptione){//不断地循环,直到等待的线程结束
}
}
}
publicvoidonClick(Viewv){//点击屏幕时被调用
pushBoxActivity.myHandler.sendEmptyMessage
(1);//向hander中发送类型为1的消息
}
}
刷帧线程WelcomeViewDrawThread的实现(继承Thread的线程类负责定时重绘欢迎界面)
packagecom.example.pushboxn;
importandroid.graphics.Canvas;
importandroid.view.SurfaceHolder;
publicclassWelcomeViewDrawThreadextendsThread{
privateintsleepSpan=200;//睡眠的毫秒数
privatebooleanflag=true;//循环标记位
WelcomeViewwelcomeView;//欢迎界面的引用
SurfaceHoldersurfaceHolder=null;
publicWelcomeViewDrawThread(WelcomeViewwelcomeView,SurfaceHoldersurfaceHolder){//构造器得到welcomeViewsurfaceHolder引用
this.welcomeView=welcomeView;
this.surfaceHolder=surfaceHolder;
}
publicvoidrun(){
Canvasc;//画布
while(flag){
c=null;//画布制空
try{
//锁定整个画布,在内存要求比较高的情况下,建议参数不要为null
c=surfaceHolder.lockCanvas(null);//锁定画布
synchronized(this.surfaceHolder){
try{
welcomeView.onDraw(c);//绘制
}
catch(Exceptione){}
}
}finally{//保证一面的代码一定会被执行
if(c!
=null){
//更新屏幕显示内容
surfaceHolder.unlockCanvasAndPost(c);//解锁画布
}
}
try{
Thread.sleep(sleepSpan);//睡眠sleepSpan毫秒每隔200ms循环一次
}
catch(Exceptione){
e.printStackTrace();
}
}
}
publicvoidsetFlag(booleanflag){//设置循环标记
this.flag=flag;
}
}
动画线程WelcomeViewGoThread的实现(生成欢迎界面中的动画是通过改变welcomeview中的图片坐标实现)
packagecom.example.pushboxn;
importcom.example.pushboxn.MainActivity;
publicclassWelcomeViewGoThreadextendsThread{
intsleepSpan=200;//睡眠的毫秒数
privatebooleanflag=true;
intstatus=0;
MainActivitypushBoxActivity;//activity的引用
publicWelcomeViewGoThread(MainActivitypushBoxActivity){
this.pushBoxActivity=pushBoxActivity;
}
publicvoidsetFlag(booleanflag){
this.flag=flag;
}
publicvoidrun(){//重写的run方法根据状态进行移到
while(flag){
switch(status){
case0:
//木门运动
pushBoxActivity.welcomeView.woodLeftX-=2;//左
pushBoxActivity.welcomeView.woodRightX+=2;//右
if(pushBoxActivity.welcomeView.woodLeftX<-90){
status=1;//到位后状态值设为1即进行铁门移动
}
break;
case1:
//铁门运动
pushBoxActivity.welcomeView.ironY-=8;//每次向上移动8个单位
if(pushBoxActivity.welcomeView.ironY<-380){
status=2;//到位后状态值设为2即进行墙的移动
}
break;
case2:
pushBoxActivity.welcomeView.wallLeftX-=3;
pushBoxActivity.welcomeView.wallRightX+=3;
if(pushBoxActivity.welcomeView.wallLeftX<-90){
status=3;
}
break;
case3:
this.flag=false;//标志位置为false即退出循环
pushBoxActivity.myHandler.sendEmptyMessage
(1);//向主activity发送Handler消息通知activity切屏动画界面完成
break;
}
try{
Thread.sleep(sleepSpan);//睡眠
}
catch(Exceptione){
e.printStackTrace();
}
}
}
}
4.菜单界面
MainActivity
启动重画元素线程
menuView=newMenuView(this);
this.setContentView(menuView);
启动菜单线程
menuViewGoThread=newMenuViewGoThread(this);
menuViewGoThread.start();
启动游戏界面
if(msg.what==2){
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验