配置Configuration
定义:用来开发在某个特定范围的设备上运行的应用程序所要用到的一组最小的API。
无限设备的标准配置:连接无限设备配置CLDC(Connected Limited Device Configuration)
CLDC描述了所有无限移动设备所需的一个最小级别的功能集合。
CLDC设备包括:收集,寻呼机,PDA,掌上电脑等。
框架Profile
这是一个进一步以特定设备位目标的一组更具体的API。
配置描述了一类设备,而框架更加具体化并且从一类设备中分理处一个特定类型的设备。
移动信息设备框架MIDP(Mobile Information Device Profile)是建立在CLDC基础上的用来描述收集和寻呼机这样的无限移动设备的框架。
按照MIDP规范开发的J2ME应用程序叫做MIDlet,因此我们使用J2ME MIDP创建的任何游戏实际上都是MIDlet。
MIDlet必须被打包成JAR文件(Java ARchive)文件以便发布。
通常一个MIDlet JAR文件包括:
1:MIDlet类
2:支持类
3:资源(声音,图像等等)
4:清单文件(.mf文件):描述了同一个压缩文档中所包含的类。
5:应用程序描述符(.jad文件):提供和一个JAR文件包含的多个MIDlet相关的描述信息。
MIDlet的开发步骤:
1:编辑
2:编译
3:预验证
4:模拟
5:设备上测试
6:部署
MIDlet开发需要的工具:
1:Java 2 SDK
2:J2ME Wireless Toolkit
Java 2 SDK是用Java来开发的一个标准开发工具包,J2ME Wireless Toolkit的作用相当于一个用来和Java 2 SDK协同工作的插件,用来验证和测试MIDlet的一个字节码验证器和几个J2ME模拟器。
额外,几个移动设备厂商还有他们自己的工具保,包含了其他的MIDlet开发工具。
KToolbar是一个可视化的开发环境,使我们能够通过一个图形用户界面来创建,编辑,打包和测试J2ME应用程序。
MIDP规范描述了可用于MIDlet开发的API,CLDC其他的API。MIDP API建立在CLDC API基础之上,提供了针对移动信息设备的类和接口。
简单的说就是:CLDC提供联网设备通用的Java API,而MIDP提供了更进一步的API,填充了CLDC API针对小型无线设备如收集和寻呼机上存在的技术细节。
Sun公司使用"let"去明明Java技术领域内的各种应用程序,如Applet,Servlet,Spotlet,MIDlet等等。
关于MIDlet:
1:MIDlet的内部结构:
每个MIDlet都是从同一个标准类派生出来的,这个标准类就是MIDP API的组成部分,位于包javax.microedition.middlet中,叫做MIDlet类
其中非常重要的几个方法就是:
1:startApp -- 启动MIDlet
2:pauseApp -- 暂停MIDlet
3:destroyApp -- 销毁MIDlet。
MIDlet的生命周期:
这三个方法形象的定义了MIDlet对应的生命周期中的三种状态:Active(激活),Paused(挂起)和Destroyed(销魂)。
MIDlet应用程序可以多次进入和推出Active和Pause状态,但是只能一次进入Destroy状态。
MIDlet命令
命令用于控制游戏MIDlet和启动一些操作,如挂起游戏,保存游戏,更改游戏设置等操作。
Display,Screen,Canvas类
Display类:表示设备的显示管理器。负责管理设备显示和用户输入。
Canvas类:代表了覆盖整个设备屏幕的抽象绘图表面。Canvas用于画直线和曲线或者显示图像等直接的图形操作。
还有一个特殊的类GameCanvas专门用于绘制高效的游戏图形。
Screen类:
在J2ME中使用图形
1:设定颜色
setColor(r, g, b) -- 设定颜色。接受三个整形参数,
setGrayScale() -- 设定灰度。
2:绘制基本图元
线条:
drawLine(int x1, int y1, int x2, int y2);
起点和终点
设置线条的样式:
setStrokeStyle(),方法接受Graphics.SOLID和Graphics.DOTTED两个常量中的一个。
没有单独的绘制多边形的方法,多边形是通过单独绘制各个边而成的。
矩形:
drawRect(int x, int y, int width, int height)
起点,矩形宽度和高度。
圆角矩形:
drawRoundRect(int x1, int y1, int width, int height, int arcWidth, int arcHeight)
起点,矩形的宽度和高度,后两个参数表示形成矩形圆角的弧线的宽度和高度。
弧形:
drawArc(int x, int y, int width, int height, int startAngle, int endAngle)
起点,圆弧所在矩形的宽度和高度,以及圆弧在椭圆中的位置(起始角度和终止角度)
绘制椭圆
drawArc(int x, int y, int width, int height, 0, 360)
没有单独的绘制椭圆的方法,是在绘制弧形的基础上,将弧形的角度设置位360度即可。
绘制圆形:
drawArc(int x, int y, width, width, 0, 360)
在绘制椭圆的基础上,设定椭圆的高度和宽度相等即可。
文本:
创建一个字体:
Font.getFont(int face, int style, int size)
字体名称,字体的样式和字体的大小。
字体的名称枚举有:FACE_SYSTEM,FACE_MONOSPACE,FONT_PROPORTIONAL。
字体的样式枚举有:SYSTEM_PLAIN,SYSTEM_BOLD,SYSTEM_ITALIC,SYSTEM_UNDERLINE。
字体的大小枚举有:SIZE_SMALL,SIZE_MEDIUM,SIZE_LARGE。
设置字体
setFont(Font font)
drawString(String str, int x, int y, int anchar)
将要绘制的文本,绘制文本的位置,锚点对象
锚点枚举:水平方向上(LEFT,CENTER,RIGHT)。
垂直方向上(TOP,BASELINE,BOTTOM)。
图像:
创建图像对象
Image.createImage(String name)
图形文件所在的路径。可以是PNG,GIS,JPEG格式的图像。
从头创建一个空白的图像
Image.createImage(int width, int height)
图像的宽度和高度。
绘制图像
drawImage(Image img, int x, int y, int anchor)
绘制的图像对象,绘制图像的相对位置,锚点对象
在J2ME中使用动画
电影的帧速率为24,电视的帧速率为30
3D对象是由一个模型,而不是图像定义的,因为图像的本质是二维的。
动画的分类:
1:基于帧的动画
主要通过预先生成的,静态的帧图像来模拟移动。
电影是典型的帧动画,电影的每一帧都是动画的一帧,在以较快的速度连续播放的时候就产生的动画的效果。
2:基于角色的动画
也叫做精灵动画。
基于角色的动画中,图像对象可以独立于背景移动。
图形对象:表示一个动画的一部分。
基于角色的动画中,每一个图形对象都叫做一个精灵,并且他的位置可以随着时间而变化。
使用透明度显示对象
本质:在一个图形中使用某种颜色是透明的或者是未使用的。这样,当绘制程序遇到具有这种颜色的象素时,就会跳过他们,这样, 最初的背景就被显示出来了。
使用Z-order
Z-order是精灵在屏幕上的相对深度。
检测对象之间的冲突
最简单的办法:比较每个精灵的矩形边界和所有其他精灵的矩形边界是否重叠。
更精确的方法:根据精灵图像数据来检测。
本质:查看精灵的透明区域是否重合,或者是精灵的图像本身是否重合。
MIDP API对动画的支持:
Layer类:
Layer类跟踪一个可视元素的位置,高度,宽度和可见性等信息。
getX() -- 图层左上角的X坐标
getY() -- 图层左上角的Y坐标
getWidth() -- 图层的宽度
getHeight() -- 图层的高度
setPosition() -- 设置图层左上角的位置
move() -- 移动图层
isVisiable() -- 图层的可见性
setVisiable() -- 设置图层的可见性
paint() -
Sprite类:
根据图像来创建一个精灵:
Sprite sprite = new Sprite(Image image);
常规的Sprite调用过程:
1:创建Sprite
Sprite monsterSprite = new Sprite(Image.createImage("/monster.png");
2:设定精灵所在的位置
monsterSprite.setPosition((getWidth() - monsterSprite.getWidth()) / 2, (getHeight() - monsterSprite.getHeight()) / 2)
3:移动精灵
monsterSprite.move(-5, 10);
4:每个精灵实际上都有一个相关的图片,在精灵当前的位置绘制精灵。
monsterSprite.paint(g);
GameCanvas
支持双缓冲区绘图的GameCanvas类
工作原理:
从GameCanvas派生一个我们需要的游戏画布,并且象在一个普通的Canvas上绘制图形一样绘制图形,只是此时进行的绘图操作是在
屏幕外缓冲区进行的,在完成绘图操作时候,我们需要调用flushGraphics()方法让屏幕外的绘制操作提交到实际的屏幕上。