记录存储实现确保所有单个的记录存储操作都是原子的、同步的以及序列化的,因此多个访问将不会出现数据毁坏。记录存储被盖上时间戳来指示它上次被修改的时间。记录存储还维护版本(version),它是一个整数,修改记录存储内容的操作每发生一次,这个数加一。版本和时间戳对于同步目的很有用。
当 MIDlet 使用多个线程访问一个记录存储时,协调该访问是 MIDlet 的责任;如果它不能这样做,可能出现无法意料的结果。同样,如果一个平台使用试图同时访问记录存储的多个线程执行记录存储的同步,那么对 MIDlet 及其同步引擎之间的记录存储实施排外访问是平台的责任。
记录存储中的每个记录是一个字节数组,并且有唯一的整数标识符。
2.4 MIDlet应用程序的生命周期
理解J2ME的体系结构并不像想象的那么容易,我们觉得读更多的资料帮助也不大,我们直接迈向J2ME开发也许会对你理解J2ME平台体系结构这个重要的概念有所帮助。在MIDP中定义了一种新的应用程序模型MIDlet,它是被Application Management Software(AMS)管理的。AMS负责MIDlet的安装、下载、运行和删除等操作。在被AMS管理的同时,MIDlet可以和应用管理软件通信通知应用管理软件自己状态的变化,通常是通过方法notifyDestroyed()和notifyPaused()实现的
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状态。图2说明了MIDlet状态改变情况:
图2 MIDlet生命周期
第三章 俄罗斯方块游戏设计与制作
3.1游戏的具体设计流程
3.1.1 俄罗斯方块游戏简述
俄罗斯方块是个老幼皆宜的小游戏,它是由四块正方形的色块组成,然后存储在一个数组的四个元素中,由计算机随机产生七种不同形状的方块,然后玩家可以根据键盘的四个方向键控制翻转、向左、向右和向下的操作来堆叠成各种不同的形状。(控制键的实现是由键盘的方向键的事件处理实现) 3.1.2 游戏操作流程
本游戏的操作流程非常简单,用户启动MIDlet后,进入游戏运行界面,选择“帮助”进入游戏帮助界面,选择“退出游戏”则退出整个游戏。在游戏运行界面,当用户想暂停游戏时,按下[#]按钮,游戏就暂停了,在暂停的情况下按[#]按钮,游戏继续运行。在游戏结束界面按下“最高分”按钮进入最高分界面任何时候点击 [退出]按钮,游戏MIDlet都会终止。如图3所示: 3.1.3 系统设计思想
MIDP的游戏设计,本质上就是用一个线程或者定时器重绘事件,用线程和用户输入改变游戏状态。这个俄罗斯方块也不例外,当启动MIDlet以后,就立即生成一个重绘线程,
图3 游戏框架
该线程每隔几ms就重新绘制一次屏幕。当然重绘时有一些优化措施,并不是屏幕上所有的像素都需要重绘,而是有所选择。比如游戏画布上那些已经固定下来的下坠物(下坠物有7种,由4个小砖块组成,可以上下左右旋转变形)就不需要重绘。游戏画布是一个CommandListener,可以接收用户键盘输入命令:控制下坠物的左移、右移、加速下落、变形旋转动作。
整个游戏的控制流程体现在游戏画布的paint()方法里,paint()根据当前的游戏状态,
绘制出当时的游戏画面。而暂停画面的绘制,是通过设立标志,让paint ()无需真正的执行重绘动作。对于游戏处于运行状态的画面绘制,则需要在下坠物当前位置绘制下坠物。
在绘制下坠物之前,判断下坠物是否还能下坠,如果能下坠就让它下落一格,再进行绘制,如果下坠物不能下坠,则把下坠物固定下来,同时检查游戏画布上下坠物当前下面所有的行,看是否能进行删行动作,如果需要进行删行动作,则清楚游戏画布上被删行的数据,再把删行之上的所有行都下移一行,然后再初始化一个新的下坠物。如果不需要删除行,则判断游戏是否处于结束状态,如果是处于结束状态,则设置游戏状态为GAME_OVER状态,这样画布在下一次重绘时就给出游戏结束的画面。如果不是处于GAME_OVER状态,则绘制新下坠物,然后判断下坠物能否下坠,重复以上动作。 3.1.4 系统设计主要功能
从游戏的基本玩法出发,主要就是俄罗斯方块的形状和旋转,我们在设计中在一个图片框中构造了一个4*4的网状小块,由这些小块组合成新的形状,每四个小块连接在一起就可以构造出一种造型,本游戏总共设计了7种造型,每种造型又可以通过旋转而变化出4种形状,利用随机函数在一个预览窗体中提前展示形状供用户参考,然后将展示的形状复制到游戏窗体中进行摆放,在游戏窗体中用户就可以使用键盘的方向键来控制方块的运动,然后利用递归语句对每一行进行判断,如果有某行的方块是满的,则消除这行的方块,并且使上面的方块自由下落,其中,方块向下的速度是由时钟控件控制的,在游戏中,用户也可以使用向下键加快下落速度,定义一个变量,对消除的函数进行记录,最后就可以得出用户的分数,用判断语句对得分进行判断,当达到一定的积分时游戏难度就会增加。
俄罗斯方块游戏设计的主要步骤包括以下5个方面: 1. 游戏界面的设计,以及游戏方块的造型
游戏界面分两大部分,左侧为游戏容器,为游戏运行提供空间;右侧用来显示得分、游戏难度及下一个下坠物。
游戏方块本质上为16个小砖块组成的正方形,一共有七种,如“田”字形、“L”字形等。每种方块一共有四种旋转变化,程序中是用16进制表示的这些方块,这些用16进制表示的方块可以换算成用一个4×4的二维数组来存储每种方块的一种状态。在有色砖块出现的位置,值为1,而只有背景颜色,无需绘制的位置,值为0。如图5所示为长条形
图5 方块模型
种状态在数组中的存储方式。