软件介绍:
操作系统:Microsoft Windows XP
程序语言:Java 2
开 发 包:Java(TM) 2 Standard Edition (5.0)
Sun Micro. J2ME Wireless Tool Kit 2.2
IDE: Eclipse 3.01
本程序需要解决的主要技术问题
1. 游戏程序是一项精度要求很高的程序系统,因为其代码利用率很高。一个实时运行的最终作品,每秒都会运行成千上万行程序,绘图事件、键盘事件都会以极高的频率在后台等待响应,若有丝毫的差别都将很容易导致程序在运行不久后可能出现严重错误,甚至死循环。因此,其逻辑设计应当相当严谨,需将所有可能发生的事件及意外情况考虑在设计中。
2. 游戏中为了美观,适用性强,可能需要采用外部文件引入的图片贴图,有关贴图,在MIDP2.0中提供了用于增强游戏功能的game包,使得解决静态或动态、画面背景、屏幕刷新的双缓冲等都有较好的解决方案。
3. 玩家飞机的运行可以通过键盘响应事件控制,但敌方则因为是自动运行,就需要有一定的智能性;敌人飞机的运行算法也要进行相关的设置,已免游戏过于简单。
4.对于双方发射的子弹应该赋予不同的速度,同时,程序应该设定敌人飞机的子弹不与敌人的飞机进行碰撞检测,已增加游戏的可玩性。
5. 双方的飞机在前进时也需要考虑到是否碰撞到对方飞机,以免重叠运行,造成许多物理上不可能的情况,缺乏真实感。每一次刷新页面、每前进一步都需要进行相关的碰撞检测。
6.为了增加界面的美观,在程序中添加了白云。由于手机屏幕大小有限,所以白云的数量和出现的位置要经过相关的设置,才能实现白云不规则出现的效果。
7. 游戏的地图不可能通过绘图来解决。否则,不仅难于控制和处理过多的元素,也会因过多的大型图片而不能限制程序的大小,失去手机上程序的原则和Java的优势。
8. Java是基于虚拟机的半解释型编译系统,其执行效率较C++等完全编译后的程序会低很多,程序如果不进行精简和优化,将可能导致运行的不流畅。除开发过程中对结构上的控制、变量的使用、算法的优化等优化外,还可以使用混淆器(Obfuscator)进行程序打包后的优化。
9. 游戏的结束、开始、动态信息画面作为构成一个程序都是必不可少的重要部分。良好的用户界面更是吸引用户的硬指标,相关的美术构图和人性化设置也需要有一定的考虑。
以上相关技术细节和整体流程将分别在以下小节阐述。
程序流程
MIDlet suite是MIDP应用程序的最小单位,JAM负责将手机内的MIDlet suite以图形化的方式呈现,让用户能够选取欲执行的MIDlet suite,一旦选取了某个MIDlet suite,操作系统就会激活KVM执行里面的MIDlet。MIDlet及相关的支持类组成了MIDP应用程序的实际内容。而
每个MIDlet都必须继承javax.microedition.midlet.MIDlet这个抽象类。在MIDP规范中定义了MIDlet的生命周期,以及可以存在的三种状态,包括Paused、Active以及Destroyed,每一个MIDlet在任何时刻只可能处于其中的一个状态。这三种状态的转换关系如图3-1所示:MIDlet有三个状态,分别是pause、active和destroyed。在启动一个MIDlet的时
候,应用管理软件会首先创建一个MIDlet实例并使得他处于pause状态,当startApp()方法被调用的时候MIDlet进入active状态,也就是所说的运行状态。在active状态调用destroyApp(boolean unconditional)或者pauseApp()方法可以使得MIDlet进入destroyed或者pause状态。值得一提的是destroyApp(boolean unconditional)方法,事实上,当destroyApp()方法被调用的时候,AMS通知MIDlet进入destroyed状态。在destroyed状态的MIDlet必须释放了所有的资源,并且保存了数据。如果unconditional为false的时候,MIDlet可以在接到通知后抛出MIDletStateChangeException而保持在当前状态,如果设置为true的话,则必须立即进入destroyed状态。
本程序采用面向对象的设计模式,对游戏中的所有物体赋予对象的概念和属性。运行程序后允许用户选择执行选项菜单,在开始游戏后将先从外部文件载入地图文件,对背景的所有物体进行绘图。在主程序运行的线程中,画面刷新将以一定的频率采用双缓冲技术对屏幕重绘,实时反映整个游戏的进行状态。
游戏开始后先绘制地图,并将各个对象实例化。在主程序运行的线程中,游戏中所有的对象都应该运行在同一个线程下。当敌人或者用户的子弹达到射程范围后,并不删除子弹对象,而是使用setVisable(false)使其不能显示,当用户或敌人在次发射子弹时,只需使用setVisable(true)设置成可以显示即可。在屏幕重绘的主程序中,将在每次的循环中判断若干事件,以便程序进入相关的分支执行相关的反应代码。如:玩家剩余飞机数是为0、敌人、玩家飞机是否被击中、屏幕上相关信息的绘制等。
程序为需要完成独立功能的模块设置了单独的类。lzhhdm类继承自Midlet,gameScrenn类、MenuScreen类继承自GameCanvas,mybullets继承自Sprite类。载入程序后首先启动的是程序介绍的信息画面。点击ok后调用MenuScreen类实现菜单。
如果选择进入游戏,则调用gameScreen类,并且中止MenuScreen类中的线程运行,已提高运行速度。
Mybullets类为玩家子弹类。
游戏界面


游戏代码
代码
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;
import javax.microedition.lcdui.*;
public class lzhhdm extends MIDlet implements CommandListener {
public Display display;
private Image splashLogo;
private boolean isSplash=true;
public Form a;
private Alert alert;
int length;
private MenuScreen menuscreen;
private gameScreen gamescreen;
private Command ok,back;
private byte[] byteInputData;
public lzhhdm()
{
}
protected void startApp() throws MIDletStateChangeException {
display=Display.getDisplay(this);
menuscreen=new MenuScreen(this);
if(isSplash)
{ a=null;
a=new Form("览桥风光V1.0");
ok=new Command("ok",Command.OK,1);
a.append(new StringItem(null,"....."));
a.addCommand(ok);
a.setCommandListener(this);
display.setCurrent(a);
}
}
protected void menuscreenShow()
{
display.setCurrent(menuscreen);
}
protected void menuscreensecond() {
menuscreen=new MenuScreen(this);
MenuScreen.mainmenu[0]="重新开始";//玩完一遍或挂了后在玩一遍 菜单第一项改为 重新开始
display.setCurrent(menuscreen);
}
protected void pauseApp() {}
protected void destroyApp(boolean arg0) throws MIDletStateChangeException {
}
protected void helShow()
{ a=null;
a=new Form("览桥风光V1.0");
back=new Command("返回",Command.BACK,1);
a.append(new StringItem(null,"操作方式:上 2 下 8 左 4 右 6 开火 5"));
a.append(new StringItem(null,"弹药数:一次最多打三组"));
a.addCommand(ok);
a.setCommandListener(this);
display.setCurrent(a);
}
protected void renwuShow()
{
a=null;
a=new Form("览桥风光V1.0");
back=new Command("返回",Command.BACK,1);
a.append(new StringItem(null,"游戏名称:览桥风光"));
a.append(new StringItem(null,"版本号:V1.00"));
a.append(new StringItem(null,"制作者:信息电子技术学院01计算机5班 刘泽华 学号:7"));
a.addCommand(ok);
a.setCommandListener(this);
display.setCurrent(a);
操作说明
在电脑中使用模拟器的步骤如下:
1 使用WTK的新建项目功能建立一个新项目,要求与Eclipse工作区下的项目名称MIDlet类名相同。
2 新建项目后,将Eclipse工作区下的.java文件拷入src文件夹,将.class文件拷入class文件夹(需要新建),将pic文件夹拷入res文件夹,点击生成,如一切正常。
3 选择项目-包-生成包。
4 生成的jar和jad文件存储在lzhhdm/bin目录下。
5 运行Motorola SDK v4.2 for J2ME,使用MOTOA760手机模拟器进行测试。点击Lanuc按纽,即可以进行游戏了。
电脑键盘的方向键上、下、左、右可以控制玩家飞机的运动,回车可以发射子弹。
可以将鼠标移动到相应的按纽处单击,以测试相应的按纽。
本文介绍了基于Java2StandardEdition和MIDP2.0开发游戏的过程,涉及游戏的精度要求、外部文件引入的图片、键盘事件、敌机智能算法、碰撞检测、性能优化、游戏状态管理、面向对象设计等内容。程序使用EclipseIDE,游戏逻辑包括地图加载、双缓冲绘图技术以及游戏对象的状态管理。

1752

被折叠的 条评论
为什么被折叠?



