基于java的手机程序设计Word下载.docx

上传人:b****2 文档编号:5294445 上传时间:2023-05-04 格式:DOCX 页数:23 大小:231.53KB
下载 相关 举报
基于java的手机程序设计Word下载.docx_第1页
第1页 / 共23页
基于java的手机程序设计Word下载.docx_第2页
第2页 / 共23页
基于java的手机程序设计Word下载.docx_第3页
第3页 / 共23页
基于java的手机程序设计Word下载.docx_第4页
第4页 / 共23页
基于java的手机程序设计Word下载.docx_第5页
第5页 / 共23页
基于java的手机程序设计Word下载.docx_第6页
第6页 / 共23页
基于java的手机程序设计Word下载.docx_第7页
第7页 / 共23页
基于java的手机程序设计Word下载.docx_第8页
第8页 / 共23页
基于java的手机程序设计Word下载.docx_第9页
第9页 / 共23页
基于java的手机程序设计Word下载.docx_第10页
第10页 / 共23页
基于java的手机程序设计Word下载.docx_第11页
第11页 / 共23页
基于java的手机程序设计Word下载.docx_第12页
第12页 / 共23页
基于java的手机程序设计Word下载.docx_第13页
第13页 / 共23页
基于java的手机程序设计Word下载.docx_第14页
第14页 / 共23页
基于java的手机程序设计Word下载.docx_第15页
第15页 / 共23页
基于java的手机程序设计Word下载.docx_第16页
第16页 / 共23页
基于java的手机程序设计Word下载.docx_第17页
第17页 / 共23页
基于java的手机程序设计Word下载.docx_第18页
第18页 / 共23页
基于java的手机程序设计Word下载.docx_第19页
第19页 / 共23页
基于java的手机程序设计Word下载.docx_第20页
第20页 / 共23页
亲,该文档总共23页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

基于java的手机程序设计Word下载.docx

《基于java的手机程序设计Word下载.docx》由会员分享,可在线阅读,更多相关《基于java的手机程序设计Word下载.docx(23页珍藏版)》请在冰点文库上搜索。

基于java的手机程序设计Word下载.docx

它最初的目的是具备16位或32位处理器、16MHz时钟频率、512KB或更少内存的设备。

J2ME本质上是一个针对小型设备的Java版本,通过裁减某些在小型设备上不许需要的功能,以到达减小Java虚拟机的体积以及相应运行库的体积,目的是为小型设备提供一个可靠,资源占用少的运行平台。

所有的J2ME组件都围绕一个中心,这些被称为configuration〔配置〕它们中的每一个配置都是用于消费电子和嵌入设备的某一个特定的类别。

Java语言特点

(1)平台无关性

Java引进虚拟机原理,并运行于虚拟机,实现不同平台之间的Java接口。

Java的数据类型与机器无关。

(2)平安性

Java的编程类似C++,但舍弃了C++的指针对存储器地址的直接操作,程序运行时,内存由操作系统分配,这样可以防止病毒通过指针入侵系统。

它提供了平安管理器,防止程序的非法访问。

(3)面向对象

Java吸收了C++面向对象的概念,将数据封装于类中,实现了程序的简洁性和便于维护性,使程序代码可以只需一次编译就可反复利用。

(4)分布式

Java建立在TCP/IP网络平台上,提供了用HTTP和FTP协议传送和接收信息的库函数,使用其相关技术可以非常方便的构建分布式应用系统。

(5)强健性

Java致力与检查程序在编译和运行时的错误,并自动回收内存,减少了内存出错的可能性。

自己操作内存能减少了内存出错的可能性。

需求功能分析

需求分析过程是整个系统开发最重要的阶段,分析的成功与否,决定着整个系统功能的完善性以及稳定性。

在该阶段需求分析人员需要确定整个产品的功能要求,并且将现实事务抽象成对象并建模。

根据如今手机游戏所需要的各项要求以及详细情况,需要满足以下需求:

1.游戏程序是一项精度要求很高的程序系统,因为其代码利用率很高。

一个实时运行的最终作品,每秒都会运行成千上万行程序,绘图事件、键盘事件都会以极高的频率在后台等待响应,假设有丝毫的差异都将很容易导致程序在运行不久后可能出现严重错误,甚至死循环。

因此,其逻辑设计应当相当严谨,需将所有可能发生的事件及意外情况考虑在设计中。

2.游戏中为了美观,适用性强,可能需要采用外部文件引入的图片贴图,有关贴图,使得解决静态或动态、画面背景、屏幕刷新的双缓冲等都有较好的解决方案。

3.玩家飞机的运行可以通过键盘响应事件控制,但敌方那么因为是自动运行,就需要有一定的智能性;

敌人飞机的运行算法也要进展相关的设置,已免游戏过于简单。

玩家飞机还设置了法宝键,按此键可加快子弹速度。

4.双方的飞机在前进时也需要考虑到是否碰撞到对方飞机,以免重叠运行,造成许多物理上不可能的情况,缺乏真实感。

每一次刷新页面、每前进一步都需要进展相关的碰撞检测。

7.游戏的地图不可能通过绘图来解决。

否那么,不仅难于控制和处理过多的元素,也会因过多的大型图片而不能限制程序的大小,失去手机上程序的原那么和Java的优势。

8.Java是基于虚拟机的半解释型编译系统,其执行效率较C++等完全编译后的程序会低很多,程序假设不进展精简和优化,将可能导致运行的不流畅。

除开发过程中对构造上的控制、变量的使用、算法的优化等优化外,还可以使用混淆器(Obfuscator)进展程序打包后的优化。

9.游戏的完毕、开始、动态信息画面作为构成一个程序都是必不可少的重要部分。

良好的用户界面更是吸引用户的硬指标,相关的美术构图和人性化设置也需要有一定的考虑。

数据流程分析

根据系统的功能和数据流程的分析,现将数据流程图显示如下:

2、系统设计

程序流程设计

MIDletsuite是MIDP应用程序的最小单位,JAM负责将手机内的MIDletsuite以图形化的方式呈现,让用户可以选取欲执行的MIDletsuite,一旦选取了某个MIDletsuite,操作系统就会激活KVM执行里面的MIDlet。

MIDlet及相关的支持类组成了MIDP应用程序的实际内容。

而每个MIDlet都必须继承这个抽象类。

在MIDP标准中定义了MIDlet的生命周期,以及可以存在的三种状态,包括Paused、Active以及Destroyed,每一个MIDlet在任何时刻只可能处于其中的一个状态。

这三种状态的转换关系如图3-1所示:

MIDlet有三个状态,分别是pause、active和destroyed。

在启动一个MIDlet的时候,应用管理软件会首先创立一个MIDlet实例并使得他处于pause状态,当startApp()方法被调用的时候MIDlet进入active状态,也就是所说的运行状态。

在active状态调用destroyApp(booleanunconditional)或者pauseApp()方法可以使得MIDlet进入destroyed或者pause状态。

值得一提的是destroyApp(booleanunconditional)方法,事实上,当destroyApp()方法被调用的时候,AMS通知MIDlet进入destroyed状态。

在destroyed状态的MIDlet必须释放了所有的资源,并且保存了数据。

假设unconditional为false的时候,MIDlet可以在接到通知后抛出MIDletStateChangeException而保持在当前状态,假设设置为true的话,那么必须立即进入destroyed状态。

本游戏所有界面都是在底层屏幕类Canvas上绘画,首先创立一个离屏画布,将游戏所用地图,玩家飞机以及子弹先绘画在离屏画布上。

程序主要有两个类。

gameStart类继承自MIDlet,gameCanvas类继承自GameCanvas。

游戏经过两个LOGO画面进入到菜单项选择项,可进展开始游戏,游戏帮助,关于游戏,声音开关,退出游戏等选项。

游戏开始时,主线程一直运行,另外还设置了4个定时器,分别用来控制子弹的消费,子弹的挪动,敌机的消费和敌机的挪动。

程序使用gameStart类调用sartApp()方法开始游戏,通过Display对象将屏幕显示转给gameCanvas类对象。

程序类设计

2.2.1MIDlet类

用于启动游戏的开始,在MIDlet中通过Display进展用户界面管理,负责与用用程序管理进展交互。

2.2.2画布Canvas类

为了能有程序开发人员控制接口的外观和行为,需要使用大量的初级用户接口类,尤其在游戏程序中,几乎完全依赖的就是Canvas抽象类进展绘图。

从程序开发的观点看,Canvas类可与高级Screen类交互,程序可在需要时在Canvas中掺入高级类的组件。

Canvas提供了键盘事件、指点杆事件〔假设设备支持〕,并定义了允许将键盘按键映射为游戏控制键的函数。

键盘事件由键代码指定,但这样控制游戏会导致缺乏通用性,并不是每个设备的键盘布局都适宜游戏的操作。

应当将键代码转换为游戏键的代码,以便硬件开发商能定义他们自己的游戏键布局。

2.2.3界面设计

游戏开始界面如图2-2所示。

游戏进入界面后就会看到“开始游戏〞,“游戏帮助〞,“关于游戏〞,“音乐开关〞,“退出游戏〞选项。

单击开始游戏进入游戏。

在游戏帮助中会告诉玩家如何操作游戏的信息。

关于游戏那么告诉玩家游戏的开发信息。

菜单界面如图2-3所示:

图2-3游戏菜单界面

2.2.4按键设计

主流市场上的手机键盘设置一般都是4*3的格局,根据人手指案件的习惯游戏中一般用到的都是2,4,5,6,8键。

*、#、左侧功能键和右侧功能键做其他特殊用。

因此在本程序中按键做表2-4中的设置:

键位

功能

数字4键

向左挪动

数字2键

向上挪动

数字5键

使用武器进展射击

数字6键

向右挪动

数字8键

向下挪动

数字0键

发射飞弹

左侧功能键

暂停

右侧功能键

返回主菜单

表2-4战斗界面中的按键说明

.5功能设计

图2-3菜单界面

在设计手机游戏的菜单是,要充分考虑设备的原有操作习惯,比方NOKIA的手机用户会使用左软键作为确定,右软键作为返回菜单。

而MOTO的手机用户右软键作为确定,左软键作为返回菜单。

中国挪动的百宝箱业务的开发标准中对游戏的按键进展了要求。

在底层屏幕类中,核心的方法是paint(),keyPressed()和run()这三个方法,分别用来控制屏幕的绘制、按键的处理和游戏逻辑的处理。

这3个方法的工作是在一个状态变量gameState协调下完成的。

gameState存储了当前整个系统的状态,当游戏加载时,按键控制快速跳过画面,run()方法控制往下,当显示菜单时keyPressed()方法所承受的按键用来改变菜单的状态变量menuState;

当进展游戏时,用户按键控制的就是主角的挪动而不是修改菜单项选择项。

run()方法测试对游戏的所有逻辑数据进展加工和计算,计算完成之后,在paint()方法中根据计算的结果再进展绘制,下面代码是paint()方法的核心构造:

publicvoidpaint(Graphicsg){

offG.setClip(0,0,SCREENWIDTH,SCREENHEIGHT);

switch(gameState){

casePAUSE:

//暂停状态

caseMENU:

//菜单状态

switch(this.menuState){

case0:

//载入Logo图片

break;

case1:

//载入第二幅Logo图片

case2:

//绘制菜单

…………………

break;

caseLOAD:

//游戏加载状态

caseGAMEING:

//游戏进展中状态

caseGAMEOVER:

//游戏完毕状态

}

//将脱屏缓冲区的内容绘制到屏幕

g.drawImage(im,0,0,0);

}

3、系统功能实现

通过双缓冲技术实现动画

在底层屏幕的paint()方法中要执行大量的图形绘制,而在绘制的过程中手机屏幕又要显示,很可能当前帧没有绘制完成下一帧的绘制任务就已经开始,这样就会导致屏幕的闪烁。

防止闪烁的方法是使用图像的双缓冲技术,定义一个完全脱离屏幕的缓冲画布,在缓冲画布绘制所有内容,当绘制完成时再将缓冲画布中的所有像素信息整个贴到当前手机屏幕上,在J2ME中可以使用Image类创立一个可修改的缓冲画面,代码如下:

Imageim=Image.createImage(SCREENWIDTH,SCREENHEIGHT);

//创立脱屏画布

GraphicsoffG=im.getGraphics();

//脱屏画笔

将所有画面都绘制在im上,然后将im画布在贴到当前画面上。

3.2游戏菜单的绘制

菜单背景的静态绘制:

直接在离屏画布上绘制静态图片,重新绘制离屏画布的大小,假设背景图片没有加载到,那么将背景用黑色代替。

菜单项选择项的绘制:

本游戏的菜单的所有选项的界面都是通过图片加载所实现的,假设每个选项都把图片作为单独的一个文件,那么会大大增加图片的数量,同时也增加了整个程序的大小。

我们将所有选项的画面保存在同一个图片文件中就可以节省资源。

我们就只需要加载一张图片就可以了,在这里我们需要用到setClip()方法绘制图片的一部分。

setClip()方法是用来绘制指定坐标后面区域的图片。

通过setClip()方法可以将图2-5做成游戏中的单个选项的画面。

图2-5

在方法外设置一个nowFramemenu变量记录菜单中的各个选项,用按上下键来确定所需选项。

详细剪裁菜单项选择项的代码如下:

publicvoiddrawmenu(GraphicsoffG){

//设定剪裁区xywh

//剪裁区的范围在屏幕重绘的时候受到影响其它区域不受影响

offG.setClip(0,178,130,30);

offG.drawImage(menu,0,178,0);

offG.setClip(0,182,94,20);

offG.drawImage(menu,20,182-30-20*nowFramemenu,0);

3.3游戏逻辑及屏幕gameCanvas类

gameCanvas类是游戏的主要核心,gameCanvas中的方法决定着地图的滚动,子弹的产生,子弹的挪动,敌人的产生,控制着敌人的挪动,判断敌人及玩家是否被击中等。

它控制着整个游戏的线程。

地图的创立以及背景滚动的实现

本游戏通过加载一张与屏幕大小一致的PNG图片作为地图,然而一张图片加载上去是静态的,如何实现背景的滚动呢?

我们先将地图初始化,将两张地图凑在一起画在离屏画布上,第一张地图画在离屏画布的正上方,第二张地图贴着离屏画布的左上角,每重绘一次地图的纵坐标递增1像素,那么整个图片就会向下挪动1像素,当第2张图片纵坐标超过屏幕的限制时,返回到初始化状态。

通过在该图上再次绘制填补空白。

实现代码如下:

publicvoiddrawBack(){

switch(this.level_Mode){

case1:

offG.drawImage(mapbk,0,mappy,0);

offG.drawImage(mapbk,0,mappy-208,0);

mappy+=1;

if(mappy>

=208){

mappy=0;

其中,level_Mode是关卡的值,通过不同关卡值可以绘制不同关卡图片。

游戏角色飞行的实现

在实现飞行的过程中,首先对飞机的图片、坐标、方向定义进展定义和初始化,图片和实现代码如下:

px=176/2-15;

py=208-30;

direct=0;

因为在飞行中,飞机在各个方向飞行时的样子是不同的,比方说向右飞行的时候左翼那么会侧飞,为了增加游戏的逼真效果,本游戏使用了setClip()方法对飞机的动画进展切割使用,当按下方向键时即时的设置按下该方向键所需要的帧实现代码如下:

publicvoiddrawPlane(){//画飞机

offG.setClip(px,py,30,30);

offG.drawImage(imPlane,px-dirFrame[direct]*30,py,0);

画出不同方向时飞机的款式

offG.setClip(0,0,176,208);

通过在keyPressed()方法中处理按键来改变飞机的飞行方向,而run()方法控制了定时的屏幕绘制。

这样,每次都会根据按键处理方法中修改的结果进展新的屏幕绘制,我们就会看到不同方向飞机飞行的效果。

使用定时器和向量类实现子弹效果

在飞机发射子弹过程中,会有多于一个1颗的子弹在空中飞行,子弹的数量不能确定,要存储不确定的一组数据可以采用向量Vector。

因为这个类提供了管理任意数量对象的方法,可以方便的将对象添加到向量中进展管理,也可以随时移出,当对象从向量中移出时,系统会自动对内容进展清空。

以下是子弹向量的定义:

allBullet=newVectior();

子弹在用户按下按键时可以连续发射是通过一个定时器实现的。

当按下开火键的时候,定时器检测到并开始按没0.3秒的速度产生子弹,将子弹的数据〔子弹当前的坐标,以及图片帧〕,并且对屏幕进展重绘个像素的速度击毙敌人。

在子弹移出屏幕以后,从向量中将该子弹对象移出。

由于Java中Vector是按照对象的方式来处理的,可以将其添加到向量中进展管理。

在方法drawBullet()中获取子弹的向量对象,从向量中获取子弹的坐标,并在该坐标上绘制子弹的图片,因为子弹的图片为3个帧,因此可以看到在子弹飞行的过程中,子弹的样子是不断变化的。

通过按键控制了子弹发射开关变量isFire的值为true,在抬起按键以后又将isFire的值设置false。

按0键增加子弹速度的实现

假设在子弹挪动进展中,用户按了0键,子弹速度将突然爆发,以0.2秒挪动40个像素的速度击毙敌人。

在方法外设置一个参数quick来确定用户是否按了0键。

将下面代码嵌入到第二个定时器内,用来捕获quick参数的取值。

if(quick)

tmp[1]+=40;

//假设按了加速键,那么向上挪动40像素

else

tmp[1]-=8;

3.3.5使用定时器实现敌机飞行效果

为了控制方便,敌机的出现不用主线程控制,而用定时器实现。

因为敌人出现的位置不固定,为了使得敌机出现的随机性,设置了一个随机数random%168作为敌机出现的横坐标,从上面飞下来。

通过定时器没0.2秒随机产生一架敌机,并将之放入向量数组中,记录敌机的初始坐标和敌机类型,并通过另一个计时器,每秒将敌机的坐标向前推进8像素,并且将paint()方法重绘。

使用方法drawPlaneAi()从向量中获取敌机的信息,根据敌机的坐标在相应位置绘制相应的敌机图片。

敌机的图片如图2-6下:

图2-6敌机图片

敌机随机出现的表现形式如图2-7所示:

图2-7敌机随机出现表示和子弹射击

碰撞检测的实现

游戏进展中,需要进展玩家飞机、子弹与敌机进展碰撞检测。

当玩家角色与敌机碰撞的时候会死亡,产生爆炸,然后返回主菜单页面。

因此设置了一个变量NPCdead记录玩家角色的生存状态,当NPCdead为True时那么不绘制玩家飞机,并在主线程中将gameState改为主菜单的状态,同时再将NPCdead设置为false,以并下次游戏开始初始化玩家角色。

当敌机碰到玩家子弹的时候,将敌机从Vector向量中移出,并在当初位置绘制爆炸图片。

检测算法主要判断敌机与子弹的位置是否相等,由于当初设置子弹和敌机的时候他们的位置只是一个点,因此在碰撞检测的时候将这个点的范围变大,这样可以有效实现碰撞的效果。

碰撞检测是由方法isChecked(intx1,inty1)实现的,判断基于位置(x1,y1)这个点的范围有没有子弹出现,假设有那么返回ture,否那么返回false;

同时在函数内将这个位置记录到一个全局变量数组中,用来设置爆炸图片绘制的位置。

如图2-8所示,显示了爆炸图片的制作效果:

图2-8击毙敌机和被敌机碰撞产生的爆炸

爆炸图片的实现

为了表达爆炸的真实性,那么爆炸不可能只是单一的一个静态画面。

为了实现爆炸的动画效果那么需要4个帧,每次绘制的时候将帧的值加1,换成下一个爆炸图片,其实现也是用setClip()方法实现。

当玩家被敌机碰撞后产生爆炸后返回到主菜单。

3.4游戏按键的实现

在底层屏幕类中是用keyPressed()方法进展按键控制的。

因为游戏分为很多状态,所以不同状态中按键的效果又有不同。

当在进入LOGO画面的时候,按键是没有效果的。

当gameState=MENU的时候,按上下键可以进展选项处理。

由于选项多个,因此需设置一个menuState来标识不同的选项,以确定按下确定键的时候处理哪中选择。

当gameState=GAMEING时,玩家可通过上下左右来进展游戏角色的上下左右挪动。

并更改玩家角色的坐标,来实现飞机的飞行。

在游戏进展中,按左侧软键可以进展暂停,按右侧软键可以退出游戏,返回主菜单。

详细代码如下:

publicvoidkeyPressed(intn){

if(gameState==GAMEING)//当游戏状态处于GAMEING时,进展上下左右的运动

{intk=this.getGameAction(n);

switch(k)

{caseCanvas.UP:

direct=1;

py-=8;

break;

caseCanvas.DOWN:

…………..

caseCanvas.FIRE:

direct=1;

this.isFire=true;

if(n==48)//设置加速键

quick=true;

if(n==-7)//在游戏开始时按右软键那么返回主菜单

gameState=MENU;

elseif(gameState==MENU

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 初中教育 > 语文

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2