用NetBeans开发平台开发J2ME游戏实例讲解(第四部分)

2016-02-19 14:00 15 1 收藏

下面图老师小编要跟大家分享用NetBeans开发平台开发J2ME游戏实例讲解(第四部分),简单的过程中其实暗藏玄机,还是要细心学习,喜欢还请记得收藏哦!

【 tulaoshi.com - 编程语言 】

  
  

NetBeans开发平台开发J2ME游戏实例讲解(第四部分)

 lirincy@163.com 林刚 2005.07 转载请注明出处作者

(3) 使用rms来记录成绩排行榜

    J2ME 记录治理系统(RMS)提供了一种机制,通过这种机制,MIDlet 能够持久存储数据,并在以后检索数据。我们在程序中就需要这样的一个排行榜,

    这个排行榜在程序关闭以后仍然能够记录数据,rms正好满足了这个要求,有关rms的信息,请参考:

   http://www-128.ibm.com/developerworks/cn/Java/j-wi-rms/index.Html

   http://game.kongzhong.com/content/j2mecontent_730.html

   

    我们在程序中要实现排行榜的功能,需要做的事情有这样几件:

    A. 在选项菜单当中加入排行榜,这好办, 在HuaRongDaoMielet.java中加入产生排行榜的代码;

    B. 新建一个类,取名Score, 关于新建类的方法,上面的论述中有讲述,我们需要的接口函数很简单,getScore(), setScore()就可以了,注重这

       里,rms是字节数组组成的记录体系,因此我们假如要存储整型量,就要有整形到byte[]以及byte[]到整型量的转换,如下:

      

        /**

        * 数组到整数.

        */

        private int getInt(byte[]buf, int offset) {

                        return (buf[offset+0] & 0xff) 24

                    (buf[offset+1] & 0xff) 16

                    (buf[offset+2] & 0xff) 8

                    (buf[offset+3] & 0xff);

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

        }

   

        /**

        * 整数到数组.

        */

        private void putInt(byte[] buf, int offset, int value) {

                               buf[offset+0]= (byte)((value 24) & 0xff);

                               buf[offset+1]= (byte)((value 16) & 0xff);

                               buf[offset+2]= (byte)((value   8) &0xff);

                               buf[offset+3]= (byte)((value   0) &0xff);

        }

       

        其中offset是byte[]的偏移量,一个整型量用4个字节来表示。

        另外我们需要对rms存储系统进行初始化,在构造函数当中引入open()函数,如下所示:

       

                  // 每关成绩 = {int level,intmoves;}

                  private byte[] scoreRec; // 当前关成绩.

                  privatestatic final int SCORE_LEN = 8;

             

                  private RecordStorestore;             //记录存储,没有打开时为空.

                 

         /*

         * 构造函数.

         */

        Score() {

                              store= null;

                              scoreRec = new byte[SCORE_LEN];

                              putInt(scoreRec,0, 0);

                              putInt(scoreRec,4, 0);

           open();

        }

    

        /**

         * 打开存储记录

          */

        boolean open() {

    

                              try{

                                  store= RecordStore.openRecordStore("HuaRongDaoScore", true);

                              } catch (RecordStoreExceptionex) {

                              }

                         

                              if(store == null)

                                  returnfalse;

                              returntrue;

        }

                                  

                             可以看出,我们的每个记录长度是8个字节,都是整型量,第一个是关,第二个是成绩,最后的结构类似于:

                                  关     步数

                                  0        33

                                  1        98

                                  2        109

                                  3        77

                                  ...

                             最后,在这个类中最重要的两个函数readScore()和setScore(), 分别负责读取和设置某一关的成绩。在这两个函数当中,我们要注重在rms

                             中遍历某个元素的方法,你需要自己设个标记TAG,来标记你的记录,因为rms不象数组一样,可以按照下标来索引,rms的几个函数包括

                             getRecord()

                             getRecordSize()

                             enumerateRecords()

                             addRecord()

                             setRecord()

                             等等都要知道是做什么用的。

                             

                             /**

                             * 读取某级别的成绩.

                             */

                             public int readScore(intlevel) {

                                      try {

                                       // 查找成绩

                                       RecordEnumerationenm = store.enumerateRecords(null, null, false);

                                       while(enm.hasNextElement()) {

                                           int ndx= enm.nextRecordId();

                                                if (store.getRecordSize(ndx) == SCORE_LEN) {

                                                   int l = store.getRecord(ndx, scoreRec, 0);

                                                   if (l == SCORE_LEN && getInt(scoreRec, 0) == level)

                                               return getInt(scoreRec, 4);

                                           }

                                       }

                  // 没有这一关的成绩,新建

                  putInt(scoreRec, 0, level);

                  putInt(scoreRec, 4, 0);

                  store.addRecord(scoreRec, 0, SCORE_LEN);

                  return 0;

                                       

                                                 }catch (RecordStoreException ex) {

                                                     ex.printStackTrace();

                                                     return-1;

                                                 }

                              }

                           

                              /**

                                 * 设置某级别的成绩.

                                 */

                              booleansetScore(int level, int moves) {

                                       try{

                                           // 查找成绩

                                           RecordEnumeration enm = store.enumerateRecords(null, null, false);

                                           while (enm.hasNextElement()) {

                                              int ndx = enm.nextRecordId();

                                             if (store.getRecordSize(ndx) ==SCORE_LEN) {

                                               int l = store.getRecord(ndx, scoreRec, 0);

                                               if (l == SCORE_LEN && getInt(scoreRec, 0) == level)

                                                   //只存储较小的值

                                                   if ( getInt(scoreRec,4)== 0 getInt(scoreRec, 4) moves){

                                                       putInt(scoreRec, 4, moves);

                                                       store.setRecord(ndx, scoreRec,0, SCORE_LEN);

                                                   }

                                             }

                                          }

                                // 没有这一关的成绩,新建

                                putInt(scoreRec, 0, level);

                                putInt(scoreRec, 4, moves);

                                store.addRecord(scoreRec, 0, SCORE_LEN);

                                                 }catch (RecordStoreException ex) {

                                                     ex.printStackTrace();

                                                     returnfalse;

                                                 }

                                                 return true;

                              }

               C. 最后要看看这个Score类怎样使用,我们需要在主Midlet里面初始化它,然后在ConrolLogic.java中 设置成绩。

                  首先,声明这个类成员, 并且进行初始化:HuaRongDaoMidlet.java

                 

                            public class HuaRongDaoMidletextends MIDlet implements CommandListener{

 

           ... ...

                                privateScore score;

                               

                                /** The Form object for theOptions command */

                                privateForm optionsForm;

                                ... ...

                               

                                publicvoid startApp() {

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

                                    score = new Score();

                                ... ...

                               

                               

                            在程序结束时关闭它,

                                ... ...

                                publicvoid commandAction(Command c, Displayable d) {

                                    if ( c == CMD_EXIT && d == splash ){

                                       //退出

                                       score.close();


来源:http://www.tulaoshi.com/n/20160219/1605930.html

延伸阅读
一、J2ME中需要的Java基础知识 现在有大部分人,都是从零开始学J2ME的,学习J2ME的时候,总是从Java基础开始学习,而且现在讲Java基础的书籍中都是以J2SE来讲基础,这就给学习造成了一些不必要的麻烦,下面将J2ME中用到的和不需要的Java基础知识做一个简单的说明: J2ME中使用到的Java基础知识: 1、Java语法基础:包括基本数...
我们将从定义 J2ME 开始,从最简单的J2ME 是什么开始讲起。然后讨论它的总体架构并学习 J2ME 目标设备。作为架构讨论的一部分,我们将提供有关简表和配置的概述。同时我们会简要介绍打包和配置 J2ME 应用程序过程中的一些注重事项。 J2ME 是什么? Sun Microsystems 将 J2ME 定义为“一种以广泛的消费性产品为目标的的高度...
用于 Java 2 平台袖珍版 (Java 2 Platform, Micro Edition,J2ME) 的 Web 服务 API (WSA) 是由 Java Community Process 为 Java 规范请求 172 (JSR 172) 而定义的,这些 API 是两个相互独立的可选包,用于远程服务调用和 XML 解析。 他们是针对基于连接设备配置 (Connected Device Configuration,CDC) 和有限连接设备配置 (Connected ...
Java 2 平台袖珍版(Java 2 Platform, Micro Edition(J2ME))为开发者提供了伟大的工具,它把 Java 平台的以网络为中心和平台不可知论的特性移植到有限存储器和有限处理器的设备。Soma Ghosh 解释了 J2ME 领域的基础知识,向您展示了该平台的构件并演示了一个样本应用程序。 在我们今天的生活中,个性化的智能信息用品已经是必需品。...
概述 目前,很多手机已经具备了蓝牙功能。虽然MIDP2.0没有包括蓝牙API,但是JCP定义了JSR82, Java APIs for Bluetooth Wireless Technology (JABWT).这是一个可选API,很多支持MIDP2.0的手机已经实现了,比如Nokia 6600, Nokia 6670,Nokia7610等等。对于一个开发者来说,假如目标平台支...

经验教程

429

收藏

46
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部