游戏开发设计文档

 

 

 

  

 

第四届齐鲁大学生软件及外语大赛

 

 

 

 

 

 

 

 

 

 

山东建筑大学HelloWorld游戏开发小组

 

 

目录

1、游戏... 3

2、概要设计... 3

2.1、游戏主要功能模块介绍... 3

2.1.2、游戏... 3

2.1.2、蓝牙模块... 5

2.2、流程图介绍(按每个主要功能分类介绍)... 7

2.2.1、游戏的主流程图:... 7

2.2.2BattleCanvas类的流程图:... 7

2.2.3UserSprite类流程图:... 9

2.2.4EnemySprite类:... 10

2.2.5Block类:... 11

2.2.6、蓝牙流程图:... 13

2.3 UML类图... 14

2.3.1、服务器端支持类:... 14

2.3.2、客户端支持类:... 15

3、详细设计... 15

3.1、介绍每个类的实现... 16

3.1.1、游戏模块... 16

3.2.1、蓝牙模块... 34

3.2、设计思路及采用的先进思想... 45

3.2.1、主人公死亡后闪动动画的实现:... 45

3.2.2、检测前方能否通过的方法:... 45

3.2.3、爆炸检测方法:... 45

3.2.4、怪的智能化:... 45

3.2.5、服务器和客户端对等思想:... 46

4、界面设计... 47

4.1、界面设计... 47

4.1.1、游戏开机画面:... 47

4.1.2、地图一、地图二:... 47

4.1.3、蓝牙联机:... 48

4.1.4、积分榜:... 48

4.2、运行平台及测试平台... 49

5、参考资料... 49

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1、游戏介绍

《收获的季节》是一款基于j2me技术自主创意开发的2.5D益智类手机游戏。这款游戏是我们helloworld团队集体智慧的结晶,它不仅可以单机进行游戏,还可以借助于蓝牙技术建立一个微微网,进行手机联机游戏。

游戏暂时共设计十关,每关以主人公乖乖兔将萝卜运回家为过关。虽然这个季节萝卜喜获丰收,但是搬运却并不是那么的简单。主人公运萝卜的过程中,会受到怪物阿呆的追杀,这时可以利用砖块将怪击死,也可以用炸弹(西瓜)将怪炸死。当然除了排除怪物追杀之外,对于玩家来说最终目标是想办法将收获的萝卜运回家,这就给游戏带来了趣味性和策略性。

2、概要设计

概要设计的主要目的是,将游戏的需求转化为游戏的数据结构和系统结构。通过制定相应文档和规范,以求在开发过程中指导开发人员的进行开发。并且规定好每个模块的功能和作用。下面对每个类进行详尽的介绍。

2.1、游戏主要功能模块介绍

2.1.2 、游戏模块

1BattleCanvas游戏主类

该类继承GameCanvas类,主要实现整个游戏的主循环和场景的绘制。

BattleCanvas主管着所有类之间的协调,决定何时死亡,何时分配新的敌人,及控制敌人出现处的图标、游戏结束后的动态Gameover字样。它运行在独立的线程中,以恒定的频率刷新画面。刷新速度需大于30毫秒才能使画面显示因人眼的暂时停留效应流畅运行。本程序设置为20毫秒。其主逻辑如图所示。

初始化:

初始化顺序为:关卡数,循环控制变量,Graphics对象,主人公对象,敌人对象数组,根据地图数组创建整个游戏场景,开启线程Sprite对象所处在LayerManager的层次:

对象

层索引值

简述

UserSprite

0

主人公

EnemySprite

1

敌人

水果

2

 

home[]

3

任务地点

Blocks[]

大于等于4

well[]

blocks[]之后

标志敌人出生地点的井盖

背景图

最后

 

 

 

 

2UserSprite

本类的功能是判断游戏主人公是否与怪(即敌人)相撞并向类BattleCanvas传送参数(若遇怪相撞,返回true,并保存怪的索引,供BattleCanvas类中实现怪刚出来可以被主人公踩住功能所用;若没有撞到怪,则返回false)。并且能将主人公的坐标定位于地图中指定的位置。主人公推砖块、水果、蔬菜以及运动控制等操作有这个类完成。

3EnemySprite

该类主要功能是控制每个怪的移动,并且能够根据主人公的位置和运动方向来对主人公进行追杀,体现了一定的人工智能的思想。并且适当的加大了玩游戏的难度,具有一定的挑战性。

4Block

本类中定义了砖块的一些属性及其方法,属性主要包括:砖块的类型、砖块的运动方向、砖块的行列及其坐标值、是否第一次碰某个砖块、是否运动等; 方法主要包括:开启砖块的线程、砖块破碎的动画、砖块运动、砖块出水果、重画状态改变的砖块、砖块挤怪、结束怪的线程。

5PlaySound类:

该类利用了两个接口,PlayerVolumeControl来创建音乐播放器和音乐播放器的音量管理控件。通过输入流得到外部音乐文件。根据不同的事件传值得到播放相应的音乐文件。根据音量的设置值来改变音量大小。

6RabbitMain类: 

该类必须继承自MIDlet,它控制着整个程序的运行,并且可以通过相应函数从程序描述文件中获取相关的信息。该类中拥有可以管理程序的创建、开始、暂停(手机中很可能有正在运行程序却突然来电的情况,这时应进入暂停状态。)、结束的函数。

7StartChoice类: 

该类是本游戏的菜单类,它的作用是提供菜单让玩家选择,玩家可以直接开始游戏,可以在进入游戏前进行相关的游戏参数的设置,可以查看英雄榜,里面有不同玩家的前10名的记录,可以看相关的帮助文档,也可以看看关于作者的信息,也可以退出游戏。

用一个变量currentSelect来记录玩家选择的菜单,菜单选项在背景图片里,玩家可以通过然后再用一个Sprite通过SpriteSetRefPosition(x,y)方法定位到当前选择的菜单,以示用户选择的是当前菜单。当玩家选择Select键时根据currentSelect的值跳转到相应的界面。

8HelpScreen类:

该类是本游戏的辅助说明类,它对本游戏进行简要的关于操作,得分等相关帮助。

9AboutScreen类:

该类用于向玩家显示一些关于我们团队的信息。

10SetScreen类:

该类中已经保留有游戏的相关的默认设置,如玩家的名字是helloworld,游戏默认从第一关开始,场景默认是雪地,音量的大小默认是50等等,玩家可以根据自己的需要和喜好在此界面进行名字的设置(高分可以在英雄榜上显示),游戏关数的选择,场景的选择,玩家还可以设置游戏音量的大小。

11ScoreScreen类:

该类是本游戏的具有计分系统的类。它采用的是手机专用的一种简化的数据库RMS此类的作用是游戏结束后用于向玩家显示游戏的积分榜或者在开始菜单玩家可以查看积分榜。

 

2.1.2 、蓝牙模块

1BTServer类:

该类的功能是实现服务器端蓝牙设备的初始化,建立服务连接,向客户端传输数据以及接收客户端的数据。本类主要包括一个run()函数和一个读进程和一个写进程,在run()函数中,打开读写进程,让读进程时刻在读客户端传来的信息。而写进程是由服务器端写过程唤醒而进行的。

BTServer类中,需要传输的数据有,服务器端主人公的信息,包括当前坐标、当前图片帧数。服务器端的砖块、水果和蔬菜的索引值。服务器端的小怪的运动信息即怪的当前坐标和帧数。服务器端主人公的生命值。

BTServer类中,接收的数据有,客户端主人公的信息,包括当前坐标、当前图片帧数。客户端的砖块、水果和蔬菜的索引值。客户端主人公的生命值。

2BTClient类:

该类的功能是实现客户端蓝牙设备的初始化,申请服务连接,向服务器端传输数据以及接收服务器端的数据。本类主要包括一个run()函数和一个读进程和一个写进程,在run()函数中,打开读写进程,让读进程时刻在读服务器端传来的信息。而写进程是由客户端写过程唤醒而进行的。

BTClient类中,需要传输的数据有,客户端主人公的信息,包括当前坐标、当前图片帧数。客户端的砖块、水果和蔬菜的索引值。客户端主人公的生命值。

BTClient类中,接收的数据有服务器端主人公的信息,包括当前坐标、当前图片帧数。服务器端的砖块、水果和蔬菜的索引值。服务器端小怪的信息,包括小怪的当前坐标值和小怪的帧数。服务器端主人公的生命值。

3BTServerUI类:

该类是一个服务器端游戏开始时和用户的一个接口。主要实现的功能是,通过接收客户端的同意开始游戏信息,由服务器端进行控制游戏的统一开始。

4BTClientUI类:

该类是一个客户端游戏开始时和用户的一个接口。主要实现的功能是,通过发送同意开始游戏信息,等待服务器端开始游戏。

5OrServer类:

该类定义了判定游戏玩家双方哪一方为服务器端,哪一方为客户端的方法和属性,还定义了是否为单机还是蓝牙联机的方法。

2.2、流程图介绍(按每个主要功能分类介绍)

2.2.1 、游戏的主流程图:

Logo 画面

游戏主菜单

主程序

屏幕绘图

本关记分统计

显示GameOver

显示历史积分表

开始

需要出敌人时生成敌人

初始化参数

死亡时

符合结束条件时

3-2  本程序的主流程图

2.2.2 BattleCanvas类的流程图:

BattleCanvas主管着所有类之间的协调,决定何时死亡,何时分配新的敌人,及控制敌人出现处的图标、游戏结束后的动态Gameover字样。它运行在独立的线程中,以恒定的频率刷新画面。刷新速度需大于30毫秒才能使画面显示因人眼的暂时停留效应流畅运行。本程序设置为20毫秒。其主逻辑如图所示。

开始

是否到结束时间

结束游戏

显示积分榜

Y

N

玩家吃水果检测

屏幕上敌人是否超过规定的个数

产生一个敌人

敌人是否减少

n且小于总数

N

Y

Y

N

生命是否为零

产生n个敌人

重画屏幕

Y

N

是否过关条件

重置场景

N

Y

2.2.3 UserSprite类流程图:

 

 

 

用户按键

Select ?

 

前方可通?

    前进

 

 

碰到怪

 

Y

 

处在安全期?

 

N

生命条数减1

生命数为0 

Y

 

结束

N

 

 

死亡?

 

 

 

 

 

N

 

 

开始

   是否死亡:死亡(dead = True); 未死亡(dead= false).

  是否碰到了怪:collidesEnemy();返回true(碰到怪了),返回false(未碰到怪)

   是否处在安全期:判断主人公的 isDanger属性

     生命条数减1 :调用die()函数。

   前方可通:调用canPass()函数。可通返回True,否则返回false

是否死亡?

N

得到当前方向

能否通过?

N

Y

得到随机方向设置步长

设置步长

是否刚出现?

N

能否前进?

Y

缩短步长

前进

开始

结束

Y

N

Y

N

Y

2.2.4 EnemySprite类:

开始: start() .开启线程

是否死亡:collidesEnemy()true(    )false(未死)

得到前进方向:getUserDirection()  

getRandomDirection(),返回1-4    

能否通过:canPass(),返回true(通过), false (不通过)

设置步长:设置randomStep值。

是否刚出现:判断布尔变量isBeginer.true(刚出现),false (已经出现)。前进:Move() 函数。根据四个方向改变怪的x,y坐标。

 

 

 

 

 

 

 

 

 

 

 


2.2.5 Block类:

开始:start() .开启线程

确定按了那块砖:blockPos() 函数; 返回砖块索引。

被按砖块线程开始:start()函数。

检测砖块是否碰到怪并进行相应处理:collidesEnemy()函数,碰到怪后播放怪被挤死的动画。

砖块是否被移动:判断布尔标志isMoved, 若为true,则检测前方是否有砖块,若有,则播放砖块破碎的动画; 否则砖块画到下一格

前方是否有砖块:根据数组mapIndex[]来判断,若其值大于-1,则前方有砖块:

结束砖块线程:stop()函数,将主循环的循环标志置为false.

blockType=1

心类型

检查砖块类型

blockType=5

星星类型

blockType=6

炸弹类型

blockType=2

普通砖块

播放砖块破碎动画(blockBreak函数)

心砖块

保持静止

星星破碎,水果出现

炸弹爆炸(播放爆炸动画)

(调用playBreakFlash 函数

表二

 

砖块画下一格

开始

检测砖块运动前方怪的情况

砖块破碎

砖块停止运动

 

停止此线程

 

线程停止

0

前方有砖块

select

确定块砖

Y

 

砖块线程开启

N

 

 

砖块被移动

 

2.2.6 、蓝牙流程图:

开始游戏

是否联机

启动服务器端

启动客户端

是否主控

提供服务等待连接

是否有连接

*         Y

N

搜索蓝牙服务

搜索服务

*         Y

Y

N

Y

N

等待对方同意开始游戏

 

N

Y

开始游戏

等待服务器开始游戏

游戏开始控制信息传输

进入服务器游戏

进入客户端游戏

互传数据

Y

同意开始游戏

2.3 UML类图

蓝牙部分UML类图:

 

2.3.1 、服务器端支持类:

WriteWorkThread

public void run()

空属性,来自于外部类

ReadWorkThread

 

空属性,来自于外部类

 

public void run()

 

BTServer类的UML类图

public static final String uuidString

="F0E0D 0C 0B 0A 000908070605040302010" ;

public static UUID uuid;

private LocalDevice localDevice;

String localBTAddress;

String localBTName;

BTServerUI ui ;

Thread th;

Thread readWorkTh;

Thread writeWorkTh;

StreamConnectionNotifier notifier;

private ServiceRecord record;

StreamConnection conn;

BTServer

public BTServer(BTServerUI ui)

public boolean initBT()

public void run()

public void close()

public static void resetBTServer()

public void send(int blockIndex,int direction)

public void send(boolean isStart)

public void send(String strX,String strY,int m,int life)

public void begainSend()

public int receiveLife()

public int receiveMesX()

public int receiveMesY()

public int receiveHeroFrame()

public boolean receiveIsAgree()

public int receiveBlockIndex()

public void setBlockIndex()

public int receiveDirection()

public void collectionEnemyMes(int index,int x,int y,int currentFrame)

public void sendEnemyMes()

包含

包含

 

 

 

2.3.2 、客户端支持类:

WriteWorkThread

public void run()

空属性,来自于外部类

ReadWorkThread

 

空属性,来自于外部类

 

public void run()

 

BTClient类的UML类图

public static final String uuidString

="F0E0D 0C 0B 0A 000908070605040302010" ;

public static UUID uuid;

private LocalDevice localDevice;

String localBTAddress;

String localBTName;

DiscoveryAgent discoveryAgent; ;

Thread th;

Thread readWorkTh;

Thread writeWorkTh;

StreamConnectionNotifier notifier;

private ServiceRecord record;

StreamConnection conn;

public BTClient(BTClientUI ui)

public boolean initBT()

public static void resetBTClient()

public void search()

private void searchServices(Hashtable remotes)

throws BluetoothStateException

public void deviceDiscovered(RemoteDevice device, DeviceClass cod)

public void servicesDiscovered(int transID, ServiceRecord[] servRecord)

public void serviceSearchCompleted(int transID, int respCode)

public void inquiryCompleted(int discType)

public void run()

public void close()

public void send(int blockIndex,int direction)

public void send(boolean agree)

public void send(String strX,String strY,int n,int life)

public void begainSend()

public int receiveHeroX()

……………………

public void startSearch()

包含

包含

BTClient

3、详细设计

软件的详细设计即过程设计,通过对结构表示的细化,得到软件的详细地数据结构和算法。

3.1、介绍每个类的实现

3.1.1 、游戏模块

1BattleCanvas

       1、变量列表

私有变量:

   private ScoreScreen scoreScreen;

private String name;

private Command exitCommand;

   private int bgSelect;

   private UserSprite userSprite; //主人公兔子

   private LayerManager layerManager; //层管理器

private Graphics g;   

   private EnemySprite enemySprite[];//怪物数组

   private Sprite gameOver; //游戏结束时的精灵(播放相关动画)

   private final static int LEVEL_NUM=6;

   private final int TIME_SPAN=300000;

   private String imgPath="/img/";

   private String scene;

   private String level="level.png"; 

   private String blockImgPath="block.png";

   private String rabbitImgPath="rabbits.png";

   private String heartImgPath="heart.png";

   private String starImgPath="star.png";

   private String bombImgPath="bomb.png";

   private String gameOverImgPath="gameover.png";

   private String mouseImgPath="mouse.png";

   private String dragonImgPath="dragon.png";

   private String pinkImgPath="pink.png";

   private String wellImgPath="well.png";

   private String homeImgPath="home.png";

   private String appleImgPath="/img/apple3.png" ;

   private String banana1ImgPath="/img/banana1.png";

   private String cabbageImgPath="/img/pic/baicai2.png" ;

   private String caomeiImgPath="/img/pic/caomei.png" ;

   private boolean isLoading=true; //用于控制开始游戏前的载入控制变量

 

公有属性:

public Block blocks[];//砖块数组

public int homeNum;

   public int homeIndex[];

   public int EnemyFlag=0;

 

静态公有属性:

public static boolean runFlag;

public static Thread t;

public static Sprite well[];

   public static Sprite home[];

   public static Sprite apple[];

   public static Sprite banana[];

   public static Sprite cabbage[];

   public static Sprite caomei[];

   public static int enemyDie=0;

   public static int enemyNum=18; //本关怪物总数

   public static int enemyOnScreen=0; //在屏幕上出现的怪物数量

   public static int currentLevel=1; //当前关数(游戏开始初始化为一)

   public static long beginTime; //游戏的开始时间

   public static long rbeginTime; //纪录下主人公兔子死亡时的时间

public static long rendTime;

public static boolean dead=false; //主人公兔子是否死亡的控制变量

   public static boolean completed=false; //是否通关

   public static boolean isFlash=false;

   public static long endTime; //游戏结束时间                                     

   public static int[] map;

   public static int[][] maps

public static int[] mapIndex;//地图数组的索引

   public static int ENEMY_ON_SCREEN_NUM=3;

   public static int MaxAppleNum=0;

   public static Displayable instance;

 

常量

   public final static int BLOCK_WIDTH=16,BLOCK_HEIGHT=14; //砖块的宽和高

   public final static int       MAP_EMPTY=0,

MAP_RABBIT=3,

MAP_BLUE=4,

MAP_WELL=9,

MAP_GREEN=10,

MAP_PINK=11,

MAP_HOME=12;

   public final static int MAPI_EMPTY=-1;

   public final static int ROW_NUM=10,

COL_NUM=10;

   public final static int START_X=160,

START_Y=160;

   public final static int BLOCK_NUM=100;

   public final static int ENEMY_NUM=20;

 

接口/方法

1synchronized public static Displayable getInstance()

功能描述:返回自身为Displayable,便于被Display

2public BattleCanvas()

功能描述:构造函数,完成基本数据的初始化

3public void start()

功能描述:开启主线程

4private UserSprite createUser()

功能描述:创建主人公(UserSprite)对象

5public void run()

功能描述:主线程的运行函数

6private void input()

功能描述:键盘命令接受

7private void createBlock(int[] m)

功能描述:根据map[]初始化游戏场景中的方块布局,并初始化地图索引mapIndex[]

参数说明:m 地图数组

8private void paintHome(int mapPos)

功能描述:根据map[]中标记为小房子的任务地点绘制任务地点标志

参数说明:mapPos 一个任务地点在地图中的索引位置

9public void paintApple()

功能描述:绘制每关需要出现的水果

10private void paintWell(int mapPos)

功能描述:绘制地图定义的敌人出现地点的井

参数说明:mapPos 一个敌人出现地点在地图中的索引位置

11private void initBlock(int mapPos,int blockType,int index, String strImg)

功能描述:初始化一个块

参数说明:mapPos 一个块在地图中的索引位置

       blockType 块的类型

       index  块在块类数组中的索引

       strImg 块对应得png图形文件

12private int blockPos()

功能描述:返回块对象在块对象数组中的索引

13private int getIndex(int direction,int row,int col)

功能描述:返回块在地图中的索引

14public void render(Graphics g)

功能描述:重新绘制游戏场景

参数说明:g 当前使用的Graphics对象

15public Sprite createGameOver()

功能描述:游戏结束动画

16private int getNullEnemyIndex()

功能描述:返回敌人对象数组中元素为空的索引

17private void setEnemyImg(int i,int enemyType)

功能描述:设置敌人的png图像

参数说明:i 敌人对象数组的索引值

       enemyType 敌人对象的类型值

18public void createEnemy(int i,int enemyType)

功能描述:初始化一个敌人对象

参数说明:i 敌人对象数组的索引值

       enemyType 敌人对象的类型值

19private void serveEnemies()

功能描述:产生一个敌人

19private void disappearWell()

功能描述:当敌人产生后,对应位置的井消失

20public void loadingLevel(Graphics g)

功能描述:加载过关动画

21public void setRabbitFrameDelay(int frame,int sleeptime)

功能描述:设置主人公播放一帧时线程的休眠时间

参数说明:frame 帧索引

       sleeptime 休眠时间

22private void dying(Graphics g)

功能描述:主人公的死亡动画播放

参数说明:g 当前使用的Graphics对象

23public boolean success()

功能描述:过关检测

24public void commandAction(Command c,Displayable d)

功能描述:添加命令按钮

参数说明:c

25public static void stop()

功能描述:停止线程

26public void reboot()

27public void reset()

功能描述:还原各数据状态,以便重新初始化

28private void resetLayerManager()

功能描述:还原layerManager对象到初始状态

29private void resetEnemySprite()

功能描述:还原敌人对象数组到初始状态

30private void resetMap(int level)

功能描述:重新订制地图

31private void resetWell()

功能描述:还原井数组到初始状态

32private void resetHome()

功能描述:还原任务目标地点数组到初始状态

33private void resetUser()

功能描述:还原主人公

34private void resetApple()

功能描述:还原水果数组到初始状态

35public void bgSelect()

功能描述:游戏场景的背景选择

36public void eatFruit()

功能描述:吃水果

37public void drawGameover(Graphics g)

功能描述:绘制gameover的动画

2Block块类

该类继承Sprite类,在场景中根据blockType属性由BattleCanvas类绘制不同种类的块;本类主要完成块的移动,破碎,挤压敌人的功能,完成功能时作为独立的线程被开启和关闭。

 

私有属性

    private Thread t;

    private int number;

    private boolean runFlag=true;

    private int splitedBlockNum=-1;

 

静态常量

    public final static int  UP=1,

RIGHT=2,

DOWN=3,

LEFT=4;

    public final static int  HEART=1,

BLOCK=2,

STAR=5,

BOMB=6,

APPLE=7;

公有属性

    public int currentDirection; 

    public int x,y;

    public int row,col;

    public int blockType;

    public static  int appleNum=-1;

   

    public Block blocks[];

    public Sprite dieEnemy[];

    public EnemySprite enemySprite[];

    public UserSprite  userSprite;

   

    public boolean isFirstEaten=true;

    public boolean isMoved=false;

    public String  threeAppleImg = "/img/upDownApple.png";

    public boolean isDisappeared=false;

 

受保护属性

    protected LayerManager layerManager;// save handle to the layermanager

 

接口/方法

1public Block(Image image)

功能描述:构造函数

2public void setNum(int num)

功能描述:设置块的number属性

参数说明:num 块号

3public void run()

功能描述:线程运行主方法

4private void blockBreak(int x,int y)

功能描述:块的破碎,由类型区分播放破碎动作

参数说明:x 块破碎时刻所处的x坐标值

        y 块破碎时刻所处的y坐标值

5private void setFrameDelay(Sprite sprite,int frame,int sleeptime)

功能描述:设置播放帧的延时

参数说明:sprite 正在播放动画的Sprite对象

        frame  帧的索引值

        sleeptime 需要延时的时间

6private void playBreakFlash(Sprite sprite)

功能描述:播放破碎动画

参数说明:sprite 用于播放动画的Sprite对象

7public void go(int direction)

功能描述:块的移动

参数说明:direction 块的移动方向

8private void disappearBlock()

功能描述:使块消失

9private void destroy()

功能描述:销毁一个块对象

10private void stopBlock()

功能描述:停止块的运动

11public void repainBlocks()

功能描述:重新绘制所有块,避免错误的覆盖效果

12private void setDieImg(Image image)

功能描述:设置敌人死亡的图片

参数说明:image 用于敌人死亡的对象

13private void pushEnemy(int EnemyIndex,String strImg)

功能描述:实现块压死敌人的效果

参数说明:enemyIndex 被压敌人的索引值

       strImg      被压敌人的图像路径字符创

14public void  collidesEnemy()

功能描述:检测块移动时被压到的所有敌人

15private String dieEnemyImg(int index,int direction)

功能描述:返回死亡敌人类型对应的图像路径

参数说明:index 敌人的索引值

             direction 块当前的运动方向

16private void playDyingEnemyFlash()

功能描述:播放敌人被压得动画

17public void start()

功能描述:开启线程

18public void setLayerManager(LayerManager layerManager)

功能描述:获取主类的LayerManager对象

参数说明:layerManager 要获取的LayerManager对象

19public void setXY(int x,int y)

功能描述:设置块的x,y坐标值

参数说明:x 横坐标值

       y  纵坐标值

20public void stop()

功能描述:停止线程

21public void collidesEnemy(Sprite sprite)

功能描述:检测块与敌人碰撞

参数说明:sprite 要检测是否与之碰撞的Sprite对象

 

3PlaySound类:

该类是通过定义Player接口和VolumeControl接口的对象实现对音乐播放器和音量控制器的管理

        PlaySound类的属性:

        Player play1,play2,play3;

       VolumeControl c1,c2,c3;

private static int volume;

 

PlaySound类的方法

1、构造方法:public PlaySound(int volume)通过输入流得到外部音乐文件,并且初始化音量大小。

2、public synchronized void start(int key)根据初始化的音量值和key值启动某一个音乐文件和控制音量大小。

3、public void setVolume(int volume)设置音量的大小。

4、public void quit(int key)退出时关闭音乐

5、public void stop(int key)暂停音乐

4RabbitMain类:

它是整个游戏的主类,进入时,首先载入画面的不是游戏运行状态,而是提供选项,当再次选择“开始”时才正式运行。在startApp()函数中,随即调用了DisplablesetCurrent()函数将当前屏幕设置为StartChoice.getInstance();在显示高级用户界面StartChoice前,建造了一个Alert类。Alert对象用于向玩家显示提示游戏正在载入的临时闪现的屏幕,它可作为setCurrent的参数,提前显示在最终需要显示的屏幕前。instance定义公有的静态变量,这样方便在整个应用程序中实现屏幕的跳转,以免使用MVC模式,那样会给整个程序带来跟大的开销。

 

Rabbit类的属性如下:

public static RabbitMain instance;//整个游戏过程中的MIDlet对象

     private Alert alert;//实现闪屏效果的Alert对象

     private Image splash;//用于闪屏的图片

Rabbit类的方法如下:

public void startApp()//实现基类的虚函数,开启应用程序

public void pauseApp()//实现基类的虚函数,停止应用程序

public void destroyApp(boolean unconditional)// 实现基类的虚函数,销毁应用程序

public static void quit()//退出应用程序

 

5StartChoice类:

为了实现大赛要求的目标,在上方有“第四届齐鲁软件设计大赛”字母功能,同时为了让游戏的菜单漂亮,更美观,我们让StartChoice继承Canvas类来实现。用一个变量currentSelect来记录玩家选择的菜单,菜单选项在背景图片里,玩家可以通过然后再用一个Sprite通过SpriteSetRefPosition(x,y)方法定位到当前选择的菜单,以示用户选择的是当前菜单。当玩家选择Select键时根据currentSelect的值跳转到相应的界面。此画面在整个游戏过程中只需要一个,用单一设计模式实现,这样一来节省了内存空间。

 

StartChoice类的相关属性:

private Graphics g;       //画图句柄

private boolean flag;//主循环控制标志

private LayerManager layerManager;//层管理器

private int currentSelect;//用于标记玩家选择的菜单

private Image pointerImage;//菜单指示器图片

private Sprite pointer;// 菜单指示器精灵

private String TICKER="第四届齐鲁软件设计大赛";//用作滚动字幕的字符串常量

StartChoice类的方法:

public void initResouces()//相关资源的初始化

public void start()//开启线程

public void run()//菜单类的主循环

public void paint(Graphics g)//绘制相应的菜单界面

public void select(int currentSelect)//根据选择的菜单重新定位菜单指示器

public void ticker()//用户实现字母滚动的函数

public void currentSelectControl()//控制菜单的轮循选择

public void keyPressed(int keycode)//侦听玩家的输入

public void selectProcess()//根据玩家的菜单选择跳转到相应界面

 

6HelpScreen类:

辅助说明对本游戏进行简要的文字说明,用Form来实现。帮助文字添加用Form类的append(String str)方法实现。

4.1.3、            AboutScreen类:

此类只是要给玩家一些关于我们团队的信息,要有一种一闪而过的效果,用Alert来实现是我们理想的选择。关于团队的信息用Alert类的setString(String str)方法实现。

7SetScreen类:

姓名的输入框用TextField来实现,由于游戏关数比较多,关数的设置用具有弹出功能的ChoiceGroup来实现,场景用具有单选功能的ChoiceGroup来实现,音量的大小用形象化的Gauge控件来实现,上述控件都具有默认值,当玩家重新设置后,用TextFiledgetString ()方法得到玩家输入的名字,用ChoiceGroupgetSelectedIndex()方法分别得到游戏关数和游戏场景的索引,用GaugegetValue()得到玩家选择的音量的大小,把得到的名字、关数索引、场景索引和玩家选择的音量大小保存在此类的公有的静态变量中,然后把对应的值传给BattleCanvas类,在里面进行相应的描绘和实现。此画面在整个游戏过程中只需要一个,用单一设计模式实现,这样一来节省了内存空间。

SetScreen类的属性:

private Command startCommand;

private Command backCommand;

private Command helpCommand;//命令按钮

public  static TextField name;//用于接收玩家名字的输入

public  static ChoiceGroup levelChoice;//用于让玩家选择游戏的关数

public  static ChoiceGroup bgChoice;//用于让玩家选择场景

public  Gauge volumeGauge;//用于让玩家选择音量的大小

public static String playerName="helloworld";//保存玩家输入的名字

public static int levelSelect=1; ;//保存玩家选择的关数

public static int bgSelect=1; ;//保存玩家选择的场景索引

public static int volume=5;// ;//保存玩家选定的音量的大小

SetScreen类的方法:

public SetScreen()//构造函数,添加设置功能的全部控件

public void commandAction(Command c,Displayable d)//实现基类的虚函数,实现玩家选择的命令的跳转。

8ScoreScreen类:

BattleCanvas请求调入分数统计的屏幕时,将首先调用insert(String name,int score),在调用insert(String name,int score)时先调用getIndex(int score)判断要插入的位置,利用ByteArrayOutputStream DataOutputStream以便实现多字段的记录然后再改写数据库。利用数据结构中的线性表和插入排序的思想,让数据库始终只有10条记录,其中dis.readUTF() score=dis.readInt()将分别读出用户名和分数,然而前者读出后并不加以利用,因为在比较分数的过程中,并不需要用到用户名。使用它只是为了将记录的指针向后推移到可以读出分数字段的位置。drawList()函数绘画出当前的屏幕分数。它将数据库中的数据依次读出,再使用drawString以固定的格式写出。最后在paint(Graphics g)中显示给玩家看。

ScoreScrren类的属性:  

private Image logoImage;//图片

private Command backCommand;

private Command exitCommand;

private Command startCommand;

private Command restartCommand;//命令按钮

private RecordStore rs;//数据库记录

ScoreScreen类的方法:

public void paint(Graphics g)//负责向玩家显示英雄榜

public void drawList(Graphics g)//负责按照制定格式化出积分榜

public  void insert(String name,int score)//向数据库中在制定位置插入一条记录

public int getIndex(int score)//得到分数在数据库中要插入位置的索引

public void writeToRS(String name,int score)//向数据库中写入一条记录

public void commandAction(Command c,Displayable d)//监听玩家的命令

public void removeCommand()//去掉相关命令

public void addCommand()//添加相关命令

 

9UserSprite类:

根据碰撞侦测函数collidesWith() 侦测主人公是否与怪碰撞;

根据isDanger属性判断主人公是否处在安全期,当主人公死后将此属性置为false 并记下系统当前时间,以后每次进入run() 循环之后都判断主人公是否处在死后15秒内,若是则让主人公在这段时间内闪动,并且此时主人公与怪相撞后不会死亡,否则主人公不会闪动并且与怪碰后会立刻死亡;

根据canPass()函数来检测前方能否通过,因为在这之前已经建立了一个地图的索引数组,若地图中此位置为空则索引数组中此位置标记为-1,否则标记为一个大于-1的数证明此处有东西挡着从而巧妙地实现了前方能否通过的判断; 

根据不停的播放currentFrame, 来实现主人公的转身及其走动动画,为此每个方向制作了制作了4帧,如果要使主人公向右移动,先判断主人公的当前运动方向,若当前方向已经 为向右则直接循环播放4帧中的每一帧,否则想将主人公的运动方向调整为向右,并将第一帧设为当前帧后在循环播放每一帧即可。

 

属性:life(主人公生命条数)

      Score(主人公的积分)

      Fruit(主人公吃的水果数目)

   GUISort(记下被碰怪的索引)

   isDanger(标记主人公是否处在危险期)

方法:

1public UserSprite(Image image,int imgWidth,int imgHeight) {}

 初始化主人公对象 (包括当前运动方向,当前帧数,参考象素点,碰撞区域等)

2public void setBlocks(Block[] block){}

      为了使用BattleCanvas类已创建好blocks对象。

3public void push(Block[] block,int index){}

      处理主人公推砖块并开启砖块的线程。

4public void die(){}

      是主人公生命条数减1

5public void resetPosition() {}

      将主人公的位置设为地图中制定的位置。

6public int getLife(){}

      取得主人公当前的生命条数。

7public void go(int direction){}

      处理主人公走动并播放动画。

8public boolean  collidesEnemy(){ }

      判断主人公是否与怪相撞。

9public int GUISort(){  }

      返回被撞怪的索引。

10EnemySprite类:

根据getUserDirection() 函数得到主人公的当前方向,即当主人公与怪处于同行或同列时检测它们的行或列之差,若小于5 则将主人公的运动方向设定为怪的运动方向,在地图中就实现了满足一定条件是怪追赶主人公,实现了怪的智慧;

根据canPass()函数来检测前方能否通过,此过程与主人公完全相同;

根据循环播放四个方向上的每两帧来实现怪的跳动及前进效果,我们将怪的第6-13帧共8帧,设定为怪的运动动画,每个方向2帧,设定帧数时只需判断奇偶数即可。

属性:isBeginner(标记怪是否是刚出来)

      enemyType(标记出怪的类型)

      enemyStep(怪运动的步长)

      enemyIndex(记下怪的索引)

     

方法:

1public EnemySprite(Image image,int imgWidth,int imgHeight){}

    初始化怪物件 (包括当前运动方向,当前帧数,参考象素点等)

2public void setEnemyShootCheck(UserSprite userSprite) {}

为了使用在BattleCanvas类中已创建好的userSprite物件。

3public void start()  {}

开启怪的线程

4public void  Move(int direction){}

处理怪的移动及动画播放。   

5private int getUserDirection(){}

得到主人公的运动方向,用于怪的智慧化操作。

6private int getRandomDirection(){}

得到怪运动的随机方向。

7public void stop(){}

停止怪的线程。

8public void enemyBombed(int m){}

处理怪被炸弹炸大的动画。

9public boolean canPass(int direction){}

判断前方能否通过。

11Block类:

主要函数介绍:

  blockBreak(int x,int y)函数:不管是什么砖块,均播放破碎动画;

   若为星星类型,则被推后会产生水果;

   若为炸弹类型,则被推后会显示炸弹的爆炸动画,

  go(int direction)函数:

  若前方有砖块,而且此砖块不是星星,则此砖块破碎; 否则砖块不动。

  若前方无砖块,则砖块划到下一格。 

collidesEnemy(){ } 函数:先从不同方向判断砖块是否与怪碰撞,然后调用

pushEnemy()函数播放不同的动画。

  属性;currentDirection(砖块当前运动方向)

       x,y(砖块当前的坐标)

       row,col(砖块当前所在行和列)

       blockType(砖块类型)

       isMoved(砖块是否在运动)

       isFirstEaten(是否为第一次推某一特定的砖块)

       number(砖块的索引值)

方法;

1public Block(Image image) {}

       初始化砖块(定义了砖块的参考象素点以及碰撞矩形区域

2public void start(){}

       开启砖块的线程。

      3public void setNum(int num){}

   得到砖块的索引值。

4public void run(){}

   砖块运动的主循环。

   5private void blockBreak(int x,int y){ }

实现普通砖块破碎的动画,星星砖块破碎后产生水果的动画,炸弹爆炸的动画。

 6public void go(int direction){}

       不同砖块运动过程的具体实现。

   7private void destroy(){}

       将砖块从layerManager中移除

8private void stopBlock(){}

         处理砖块的停止。

    9public void repainBlocks(){}

       重画砖块调整图层。

    10private void pushEnemy(int EnemyIndex,String strImg){}

       砖块挤怪过程(怪被挤死动画)的具体实现。

11public void  collidesEnemy(){}

          分不同方向处理砖块和怪相撞的情况。

    12public void stop(){}

          结束砖块的线程

    13public void collidesEnemy(Sprite bombSprite){}

            处理炸弹碰到怪后的过程。

3.2.1 、蓝牙模块

1BTServer类:

在该类的详细实现中,用到了以下几个类:(1UUID类,在蓝牙中,每个服务和服务属性都唯一地由"全球唯一标识符" UUID)来校验。正如它的名字所暗示的,每一个这样的标识符都要在时空上保证唯一。只有被UUID标示的服务可以被发现。 (2LocalDevice类本地设备提供了方法来返回关于本地设备的信息,并且能够进入Bluetooth managerLocalDevice类标识了本地蓝牙设备。蓝牙应用程序和LocalDevice之间的关系是典型的一对一关系:

 

3)服务记录类 蓝牙的实现会自动地创建一个服务记录当你的应用程序创建一个连接通告时,可能是一个StreamConnectionNotifier通告或者是一个L2CAPConnectionNotifier通告, (4)注册服务和等待连接 一旦你创建了连接通告和服务记录,服务器就准备注册服务和等候客户端。调用通告的acceptAndOpen()方法可使蓝牙实现插入服务记录联结到SDDB,提供可发现的服务给客户端。AcceptAndOpen()方法中断后,等候引入允许进入的连接。(5ReadWorkThread类,从线程扩展来的内部类,通过InputDataStream类的readUTF(),readByte(),readBoolean()等方法实现了读取客户端的数据的功能。(6WriteWorkThread类,从线程扩展来的内部类,通过OutputDataStream类的writeUTF(),writeByte(),writeBoolean()等方法实现了发送服务器端数据的功能

 

    BTServer类中的属性如下:

public static final String uuidString;

public static UUID uuid;

     private LocalDevice localDevice;// 本地设备实例

     String localBTAddress;// 本地蓝牙地址

     String localBTName;// 蓝牙名称

     BTServerUI ui ;

     Thread th;

     Thread readWorkTh;//读线程

     Thread writeWorkTh;//写线程

     StreamConnectionNotifier notifier;//服务记录类

     private ServiceRecord record;

     StreamConnection conn;

     boolean exitFlag;

     boolean BTReady;

     DataInputStream in;

     DataOutputStream out;

     String sendTextX = "";

     String sendTextY = "";

    private String rabbitX;

    private String rabbitY;

     private int i,m;

     private boolean isStart;

     private boolean isFirst;

     boolean First;

     boolean agree;

     Image waitImage;

     Graphics g;

     private int life; //服务器端主人公的生命值

     private int life1;//客户端主人公的生命值

     int clientBlockIndex;//接收客户端砖块索引值

     int serverBlockIndex; //接收服务器端砖块索引值

     int serverDirection;//发送服务器端主人公当前方向

     int clientDirection; //发送客户端主人公当前方向

     public static byte []enemyMes;

 

    方法如下:

1、构造方法 public BTServer(BTServerUI ui)主要实现开启线程的作用。

2、public boolean initBT() 初始化蓝牙设备,等待客户端连接。

// 取得本地设备实例

  localDevice = LocalDevice.getLocalDevice();

// 记录蓝牙地址

localBTAddress = localDevice.getBluetoothAddress();

// 记录蓝牙名称

   localBTName = localDevice.getFriendlyName();

3、public void run() 创建服务连接,注册服务和等待客户端连接,打开读写线程。

       notifier = (StreamConnectionNotifier) Connector

                        .open(url.toString());

       record = localDevice.getRecord(notifier);

       conn = notifier.acceptAndOpen();

       in = conn.openDataInputStream();

       out = conn.openDataOutputStream();

readWorkTh.start();

writeWorkTh.start();

4、public void close()关闭输入和输出流,以及读写线程和服务记录。

5、传输服务器端信息

public void send(int blockIndex,int direction)

public void send(boolean isStart)

public void send(String strX,String strY,int m,int life)

    6、接收客户端信息

public int receiveLife()

public int receiveMesX()

public int receiveMesY()

public int receiveHeroFrame()

 

2BTClient类:

在该类的详细实现中,用到了以下几个类:(1UUID类,在蓝牙中,每个服务和服务属性都唯一地由"全球唯一标识符" UUID)来校验。正如它的名字所暗示的,每一个这样的标识符都要在时空上保证唯一。只有被UUID标示的服务可以被发现。 (2LocalDevice类本地设备提供了方法来返回关于本地设备的信息,并且能够进入Bluetooth managerLocalDevice类标识了本地蓝牙设备。蓝牙应用程序和LocalDevice之间的关系是典型的一对一关系:

3DiscoveryAgent发现代理类,使用DiscoveryAgent类的"设备发现"方法来开始和取消设备发现。发现代理(DiscoveryAgent)与蓝牙客户端应用程序之间是典型的一对一的关系LocalDevice类的方法getDiscoveryAgent()返回一个参考给发现代理

4RemoteDevice类 一个RemoteDevice的实例代表了一个远端蓝牙设备。在一个蓝牙客户端应用程序可以进行服务,消费之前,它必须发送一个设备请求来发现远端设备。典型的蓝牙应用程序和远端设备之间的关系是一对多:

5ReadWorkThread类,从线程扩展来的内部类,通过InputDataStream类的readUTF(),readByte(),readBoolean()等方法实现了读取服务器端的数据的功能。(6WriteWorkThread类,从线程扩展来的内部类,通过OutputDataStream类的writeUTF(),writeByte(),writeBoolean()等方法实现了发送客户端数据的功能。

   

BTClient类的属性

public static final String uuidString = "F0E0D 0C 0B 0A 000908070605040302010";

    public static UUID uuid;

    private LocalDevice localDevice;// 本地设备实例

    String localBTAddress;// 本地蓝牙地址

    String localBTName;// 蓝牙名称

    Thread th;

    BTClientUI ui;

    DiscoveryAgent discoveryAgent;// 发现代理

    Thread readWorkTh;

    Thread writeWorkTh;

    StreamConnection conn;

    boolean exitFlag;

    boolean BTReady;//状态标记

    DataInputStream in;

    DataOutputStream out;

    String sendTextX = "";

    String sendTextY = "";

    Hashtable remoteDevices = new Hashtable();// 存储找到的远程设备

    String url = null;

    ServiceRecord serviceRecord;

    private String strHeroX;

    private String strHeroY;

    private int j,n;

    boolean isStart;

    boolean isFirst;

    boolean First;

    boolean agree;

    private int life1 = 2;

    private int life  = 2;

    int clientBlockIndex;//发送客户端砖块索引值

    int serverBlockIndex;//发送服务器端砖块索引值

    int serverDirection;//接收服务器端主人公的当前方向

    int clientDirection;//发送客户端主人公当前方向

public static byte []enemyMes;

 

BTClient类的方法如下:

1、构造方法:public BTClient(BTClientUI ui) 主要作用是开启线程作用

2、public boolean initBT() 初始化本地蓝牙设备,并且发现代理服务。

localDevice = LocalDevice.getLocalDevice();// 取得本地设备实例           

localBTAddress = localDevice.getBluetoothAddress();  // 记录蓝牙地址

localBTName = localDevice.getFriendlyName();// 记录蓝牙名称

discoveryAgent = localDevice.getDiscoveryAgent();

// 取得蓝牙代理,服务器应用程序设置自身为可被发现的,而客户端应用程序则获得相关的发现代理来发现服务。

3、public void search() // 搜索设备,搜索服务

RemoteDevice[] cacheDevices = discoveryAgent.retrieveDevices(DiscoveryAgent.CACHED);

// 将缓存的和已知的蓝牙设备加入 remoteDevices.CACHED 是否将返回先前已发现的设备

RemoteDevice[] preDevices = discoveryAgent .retrieveDevices(DiscoveryAgent.PREKNOWN);              

//PREKNOWN 是否将返回已知设备.retrieveDevices()重新获得已经发现或者附近的已知设备

searchServices(remoteDevices);

// 开始搜索设备

discoveryAgent.startInquiry(DiscoveryAgent.GIAC, this);

// 在搜索到的设备上查询服务

4、private void searchServices(Hashtable remotes)

throws bluetoothStateException // 搜索服务

5、public void deviceDiscovered(RemoteDevice device, DeviceClass cod)         // 记录找到的设备

6、public void servicesDiscovered(int transID, ServiceRecord[] servRecord)

// 发现感兴趣的服务,这里直接使用第一个

// 取得感兴趣的连接URL

7、 public void run()创建服务连接,等待连接服务器端,打开读写线程。

       notifier = (StreamConnectionNotifier) Connector

                        .open(url.toString());

       record = localDevice.getRecord(notifier);

       conn = notifier.acceptAndOpen();

       in = conn.openDataInputStream();

       out = conn.openDataOutputStream();

readWorkTh.start();

writeWorkTh.start();

8、 public void close()关闭输入和输出流,以及读写线程和服务记录。

9、传输客户端信息

public void send(int blockIndex,int direction)

public void send(boolean isStart)

public void send(String strX,String strY,int m,int life)

    10、接收服务器端信息

public int receiveLife()

public int receiveMesX()

public int receiveMesY()

public int receiveHeroFrame()

 

3.BTServerUI类:

在本类的设计中,为了和客户端保持同时开始游戏。设置一个标志,当服务器端点击开始游戏时,客户端接收到控制信息,即刻启动游戏线程。

 

BTServer类的属性如下:

BTServer server;

StringItem state;

TextField sentTF;

TextField receiveTF;

Display display;

PlaySound play;

BattleCanvas myCanvas;

Command exitCMD ;

Command enterCMD;

String str;

 

BTServer类的方法:

1、构造方法: public BTServerUI(Display display,PlaySound play)初始化游戏画布。

2、public void commandAction(Command cmd, Displayable d)开始游戏,并且向客户端传送游戏开始信息。

 

4BTClient类:

在本类的设计中,让服务器端等待客户端准备游戏前的操作,准备好以后由客户端请求游戏开始,向服务器端发送请求信息。

       

BTClient类的属性:

        BTClient client;

       StringItem state;

       TextField sentTF;

       TextField receiveTF;

       Display display;

       BattleCanvas myCanvas;

       PlaySound play;

       Command exitCMD;

       Command enterCMD;

Command searchCMD;

 

BTClient类的方法:

1、构造方法:public BTClientUI(Display display,PlaySound play)初始化游戏画布.

2、public void commandAction(Command cmd, Displayable d)游戏开始,退出处理。

5OrServer类:

实现的目的是控制游戏双方一端为服务器,另一方为客户端。还要控制为单机还是联机游戏。

        OrServer类的属性:

        public static boolean isServer;

public static boolean onePlayer;

 

OrServer类的方法:

1、默认的构造方法: public OrServer()

2、public static void setIsOnePlayer(boolean player)设置为单机游戏。

3、public static boolean getOnePlayer()得到是否为单机游戏

4、public static void setIsServer(boolean server) 设置为服务器

5、public static boolean getIsServer()得到是否服务器

 

3.2、设计思路及采用的先进思想

3.2.1 、主人公死亡后闪动动画的实现:

在每次进入run循环后根据提前设定的布尔标志来不停的显示与隐藏主人公, 这样一次循环进行一次判断,并进行一次显示或隐藏操作,表现在画面上即为主人公的闪动效果,这样方案较好。

 

3.2.2 、检测前方能否通过的方法:

另外建立一个地图的索引数组,若地图中此位置为空则索引数组中此位置标记为-1,否则标记为一个大于-1的数,证明此处有东西挡着从而巧妙地实现了前方能否通过的判断。

3.2.3 、爆炸检测方法:

开始时我们通过行列检测及其坐标检测的方法,效果都不理想,主要是检测不准; 后来我们使用碰撞检测的collidesWith() 函数检测,较好的解决了检测不准的问题。

 

3.2.4 、怪的智能化:

我们通过主人公的运动方向较为巧妙地实现了怪的智慧化:每当主人公与怪处在同一行或同一列而且距离在五个砖块的长度之内的时候,怪会自动追踪主人公,通过行列检测智慧效果非常好。

3.2.5 、服务器和客户端对等思想:

在这个游戏中,我们设计的初衷是通过蓝牙设备建立手机无限局域网游戏的服务器端和客户端,并且能够真正的通过手机这种运算能力有限的设备,很好的模拟PC机局域网游戏。考虑到目前中低档手机的性能,我们采用了一个服务器端和一个客户端的对等模式进行了游戏设计,这样做的目的非常的明确。既实现了蓝牙局域网游戏,又能使手机的性能得到很好的发挥。

下面对我们采用的对等模式进行简单的介绍。服务器端和客户端同时产生来两个主人公,由服务器端和客户端分别控制一个主人公,当各自的主人公推砖块、水果、蔬菜时,传送砖块、水果、蔬菜的索引值给对方,让对方在其本地机上处理,这样做就减轻了以某一方作为主控端的压力,这样不仅可以减少信息的传输量,同时也减轻了手机的处理压力,照顾到了手机运算能力有限的弊端。而要使服务器端和客户端的小怪能够保持运动步调一致,只能让一方作为主控方,进行小怪信息的发出者,而另一方作为接收者。我们选择了服务器作为小怪的主控端,客户端作为小怪信息的接收端。这样做并没有使得手机双方哪一方的处理加重,在实际处理过程中,举个例子来说,服务器端只发送小怪的信息,客户端只接收小怪信息,对于杀怪的处理仍然在各自机器上处理,而数据的传输和接收处理处理难度和强度几乎是等同的,所以并没有加重某一方的负担。

4、界面设计

4.1、界面设计

4.1.1 、游戏开机画面:

      

4.1.2 、地图一、地图二:



 

4.1.3 、蓝牙联机:

 

4.1.4 、积分榜:

4.2、运行平台及测试平台

NOKIA 7610

   主屏参数:彩屏,65536,TFT,176×208像素

    java扩展:CLDC 1.0,MIDP 2.0,Nokia UI API

     蓝牙接口:内置     

 

5、参考资料

1  Java手机/PDA程序设计入门》 作者:王森

2  Programming Wireless Devices with the Java 2 Platform Micro Edition ,Second EditionProger Riggs Jyri Huopaniemi 等著

 

 

你可能感兴趣的:(j2me/wap有关)