学士学位论文基于j2me的推箱子游戏任务书.docx
《学士学位论文基于j2me的推箱子游戏任务书.docx》由会员分享,可在线阅读,更多相关《学士学位论文基于j2me的推箱子游戏任务书.docx(39页珍藏版)》请在冰豆网上搜索。
学士学位论文基于j2me的推箱子游戏任务书
石家庄科技信息职业学院
毕业设计(论文)任务书
专业:
软件开发(游戏方向)
学生姓名:
周志波
学号:
090124010
设计(论文)题目:
基于J2ME的推箱子游戏
起讫日期:
指导教师:
刘永伟
任务书下达日期:
年月日
基于J2ME的推箱子游戏
摘要:
手机是人们日常生活中所用的非常频繁的通信工具。
随着JAVA技术的不断更新提高,J2ME技术的出现,使得手机游戏越来越成为我们关注的焦点。
J2ME技术目前最流行的就是在制作手机游戏方面,JAVA手机的出现使得这一技术更有它的用武之地,发挥着他灵活、轻便、快捷的作用。
J2ME平台被是最杰出的手机游戏手机游戏平台,它一些非常重要的特征对开发者都有很大益处。
因为J2ME应用在不同设备上都是便携式的,他们常常可以在网络上下载和执行。
本设计通过MapList和SpriteThread等类进行推箱子游戏设计,最后编程实现了全过程。
关键词:
J2MEMapListSpriteThread推箱子
目录
一、设计过程……………………………………………………………………3
(1)游戏策划…………………………………………………………………3
(2)游戏的准备工作…………………………………………………………3
(3)设计背景………………………………………………………………..6
(4)游戏框架设计……………………………………………………………7
(5)设计细节…………………………………………………………………7
二、欢迎界面设计……………………………………………………………8
(1)PushBoxActivity类框架的搭建…………………………………………8
(2)欢迎界面WelcomeView类的实现………………………………………13
(3)刷帧线程WelcomeViewDrawThread类的实现…………………………16
(4)动画线程WelcomeViewGoThread类的实现……………………………17
三、游戏界面设计……………………………………………………………19
四、游戏界面框架设计………………………………………………………23
(1)GameView框架的实现………………………………………………….24
(2)地图类MapList的实现…………………………………………………29
(3)角色类MySprite的实现………………………………………………..31
(4)onDraw方法的实现……………………………………………………36
五、设计总结…………………………………………………………………38
参考文献…………………………………………………………………………38
正文
一.设计过程
(1)游戏策划
游戏策划主要包括游戏的情节、目标受众、运行的目标平台、采用的呈现技术、操作方式等几个方面。
游戏情节:
本游戏为轻量级的益智游戏,因此不存在很复杂的情节。
这方面朱焘做的就是为设计游戏各管仓库的形状、大小、可通过区域,以及各关中箱子的初始位置和目的地。
目标受众:
本游戏受众方面比较广,应该是老少皆宜的。
运行的目标平台:
本游戏的目标平台为Android2.1。
才有的呈现技术:
本游戏采用2D的呈现技术。
操作方法:
本游戏拟采用手机键盘进行操作,对于没有键盘的型号也可以考虑采用虚拟键盘。
(2)游戏的准备工作
根据游戏的策划来制作和搜集游戏要用到的图片、声音等。
本游戏有道的图片如下
图片清单
图片
大小(KB)
像素(wrh)
用途
3.5
50*63
角色向下走图片
2.8
50*63
角色向左走图片
6.6
48*48
游戏图标
5.92
50*63
正常的箱子
3.35
50*63
角色向上走图片
3.35
50*63
角色向右走图片
9.5
200*80
菜单退出按钮
2.5
85*45
游戏界面的退出
14.3
300*250
恭喜过关图片
9.6
200*80
游戏说明菜单
41.2
300*475
图片的铁门图片
4.4
200*80
声音开按钮
5.1
200*80
菜单开始游戏
33.5
160*450
左半部分墙
45
640*480
游戏背景图片
2.8
50*63
角色向下推箱子
3.5
50*30
角色向左推箱子
3.5
50*63
角色向上推箱子
3.3
50*63
角色向右推箱子
7.8
50*63
绿色的箱子
53.7
160*450
右侧的木门
53.7
160*450
左侧的木门
82.9
278*420
菜单界面按钮背景
18.4
640*480
菜单界面的背景
22.3
480*200
欢迎界面背景
4.4
200*80
声音关按钮
4.7
50*63
游戏中的墙
27.5
160*450
右半部分墙
声音清单
声音文件名
大小(kb)
格式
用途
Sound1
22
Mp3
游戏背景音乐
Sound2
7
Mp3
推箱子的声音
Sound3
215
Mp3
欢迎界面背景音乐
Winsound
8
Mp3
游戏胜利的声音
(3)设计背景
游戏中,首先必须要有个主应用程序类,其次,为了把程序的画面呈现出来,就是要有画布;为了比较容易管理地图、增加或修改地图比较方便,应该把地图和画布分开;然后最主要的是要有个来推箱子的人;当然箱子也是需要管理的。
这其中需要先了解游戏中应用到的类。
欢迎界面类WelcomeView:
主要负责欢迎界面的绘制工作。
欢迎界面的绘制线程类WelcomeViewDrawThread:
负责的工作是定时重绘欢迎界面。
欢迎界面的动画实现类WelcomeViewGoThread:
是通过改变WelcomeView中所用到的图片坐标实现的。
菜单界面类MenuView:
只负责绘制工作
菜单界面的绘制线程类MenuViewDrawThread:
负责的工作是定时重绘菜单界面。
菜单界面的动画实现类MenuViewGoThread:
用来生成菜单界面中背景的滚动效果。
游戏主界面类GameView:
负责绘制游戏过程中所有的信息,如地图、玩家角色、所推的箱子、恭喜过关图片等。
游戏主界面的绘制线程类GameViewDrawThread:
通过对调节线程中的睡眠时间便可调整游戏的FPS的高低,改善用户的体验。
地图信息类MapList:
包含着地图的相关信息,这里的一个地图是用三维函数族中的二维矩阵表示的,关于该类的使用方法将在后面进行介绍。
角色封装类MySprite:
包含了所有与角色有关的信息。
角色移动线程类SpriteMoveThread:
负责角色的无级移动,运用时只需给出起始点和目标点的坐标,同时该类还承担起屏幕的滚动工作。
角色换帧线程类SpriteThread:
负责根据角色的信息时时改变角色的图片。
箱子移动类BoxThread:
负责子昂子的无级移动。
(4)游戏框架设计
游戏基本框架类图:
图一游戏基本框架类图
(5)设计细节
要做的游戏是让一个小人推箱子,操作方法就是通过四个方向键对小人进行上,下,左,右移动。
当箱子移动到指定位置时,游戏就会产生过关事件。
下面是游戏流程图:
图二程序流程图
二.欢迎界面设计
(1)PushBoxActivity类框架的搭建
代码如下:
packagewyf.ytl;
importandroid.app.Activity;
importandroid.media.MediaPlayer;
importandroid.os.Bundle;
importandroid.os.Handler;
importandroid.os.Message;
importandroid.view.KeyEvent;
importandroid.view.Window;
importandroid.view.WindowManager;
publicclassPushBoxActivityextendsActivity{
WelcomeViewwelcomeView=null;//欢迎界面
WelcomeViewGoThreadwelcomeViewGoThread=null;//欢迎界面中的移动线程
MenuViewmenuView=null;
MenuViewGoThreadmenuViewGoThread=null;//菜单界面中的移动线程
GameViewgameView=null;
booleanisSound=true;//是否播放声音
MediaPlayerpushBoxSound;//推箱子声音
MediaPlayerbackSound;//背景音乐
MediaPlayerwinSound;//胜利的音乐
MediaPlayerstartSound;//开始和菜单时的音乐
intmap1[][];
intmap2[][];//当前游戏的地图
intselectMap=0;//选中的地图
MySpritemySprite;//精灵
KeyThreadkt;//键盘监听线程
intaction=0;//键盘的状态,二进制表示从左往右表示上下左右
HandlermyHandler=newHandler(){//用来更新UI线程中的控件
publicvoidhandleMessage(Messagemsg){
if(msg.what==1){//收到WelcomeViewGoThread/Welcome发来的消息
welcomeViewGoThread.setFlag(false);
if(welcomeView!
=null){
welcomeView=null;
}
initAndToMenuView();
}
elseif(msg.what==2){//收到MenuView发来的消息
if(menuView!
=null){
menuView=null;
}
initAndToGameView();
}
elseif(msg.what==3){
if(gameView!
=null){
gameView=null;
}
initAndToMenuView();
}
elseif(msg.what==4){//收到GameView来的消息,进入下一关
if(selectMap+1selectMap=selectMap+1;
initAndToGameView();
}
else{
selectMap=0;
initAndToGameView();
}
}
}
};
publicvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
//全屏
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
pushBoxSound=MediaPlayer.create(this,R.raw.sound2);//推箱子的声音
winSound=MediaPlayer.create(this,R.raw.winsound);//胜利的声音
backSound=MediaPlayer.create(this,R.raw.sound1);//背景音乐
backSound.setLooping(true);//设置循环
startSound=MediaPlayer.create(this,R.raw.sound3);
startSound.setLooping(true);
initAndToWelcomeView();
}
publicvoidinitAndToWelcomeView(){
welcomeView=newWelcomeView(this);
if(isSound){
startSound.start();
}
this.setContentView(welcomeView);
welcomeViewGoThread=newWelcomeViewGoThread(this);
welcomeViewGoThread.start();
}
publicvoidinitAndToMenuView(){
menuView=newMenuView(this);
this.setContentView(menuView);
menuViewGoThread=newMenuViewGoThread(this);
menuViewGoThread.start();
}
publicvoidinitAndToGameView(){
map1=newint[MapList.map1[selectMap].length][MapList.map1[selectMap][0].length];
for(inti=0;ifor(intj=0;jmap1[i][j]=MapList.map1[selectMap][i][j];//初始化第一层
}
}
map2=newint[MapList.map2[selectMap].length][MapList.map2[selectMap][0].length];
for(inti=0;ifor(intj=0;jmap2[i][j]=MapList.map2[selectMap][i][j];//初始化第二层
}
}
gameView=newGameView(this);
mySprite=newMySprite(this);
kt=newKeyThread(this);//添加键盘监听
kt.start();
if(isSound){
backSound.start();//播放声音
}
this.setContentView(gameView);
}
publicbooleanonKeyUp(intkeyCode,KeyEventevent){//键盘抬起
if(keyCode==19){//上
action=action&0x37;
}
if(keyCode==20){//下
action=action&0x3B;
}
if(keyCode==21){//左
action=action&0x3D;
}
if(keyCode==22){//右
action=action&0x3E;
}
returnfalse;
}
publicbooleanonKeyDown(intkeyCode,KeyEventevent){//键盘按下监听
if(keyCode==19){//上
action=action|0x08;
}
if(keyCode==20){//下
action=action|0x04;
}
if(keyCode==21){//左
action=action|0x02;
}
if(keyCode==22){//右
action=action|0x01;
}
returnfalse;
}
}
(2)欢迎界面WelcomeView类的实现
代码如下:
packagewyf.ytl;
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;
publicclassWelcomeViewextendsSurfaceViewimplementsSurfaceHolder.Callback,OnClickListener{
PushBoxActivitypushBoxActivity;
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(PushBoxActivitypushBoxActivity){//构造器
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,intwi