NEC手机JAVA中级知识专题讲座.docx
《NEC手机JAVA中级知识专题讲座.docx》由会员分享,可在线阅读,更多相关《NEC手机JAVA中级知识专题讲座.docx(35页珍藏版)》请在冰豆网上搜索。
NEC手机JAVA中级知识专题讲座
NEC手机JAVA中级知识专题讲座
第八讲NEC扩展API
1.引言
在上讲中,我们对网络的相关功能进行了解说。
截止上讲往常的讲座,我们讲述的差不多上关于MIDP的JAVA相关技术的内容,本讲将收尾,介绍NEC扩展API。
2.NEC扩展
NEC扩展API中有如下的类。
类
AudioClip
处理声音数据类。
已在第五讲解说。
AudioListener
Audio事务监听器。
已在第五讲解说。
ImageEffector
颜色变换类。
将在本讲解说。
ImageMap
模拟PCG〔プログラマブルキャラクタジェネレータ〕类。
因为能轻松的把多种画面分配在格子里,因此能专门容易的制作出背景和棋面〔ImageMap〕。
不在本讲解说。
Media
取得媒体数据类。
已在第五讲解说。
NxCanvas
NEC扩展canvas,支持多重按键。
将在本讲解说。
NxGraphics
NEC扩展Graphics。
描画Sprite、ImageMap。
将在本讲解说。
PhoneControl
操纵震动、逆光类。
不在本讲解说。
Sprite
Sprite类。
将在本讲解说。
SpriteSet
治理Sprite类。
将在本讲解说。
关于上表的ImageEffector、NxCanvas、NxGraphics、Sprite、SpriteSet,我们将按顺序展开介绍。
2.1.扩展图形类
NxGraphics类是Graphics的扩展类。
下面介绍能够实现的Sprite、ImageMap的描画以及矩形区域的复制。
NxGraphics类定义了以下方法。
voidcopyArea(intsx,intsy,intwidth,intheight,intdx,intdy)
把Canvas描画的矩形区域复制后描画。
利用此功能能够把描画过一次的东西复制下来进行描画,因此当描画相同内容的拷贝时,能够简化步骤。
voiddrawImageMap(ImageMapmap,intx,inty)
对将多种画面分配在格子里的ImageMap进行描画。
voiddrawSpriteSet(SpriteSetsprites)
描画Sprite。
后面有Sprite的相关介绍。
staticNxGraphicsgetNxGraphics(javax.microedition.lcdui.Graphicsg)
取得NxGraphics对象。
下面展现的是使用copyArea方法的范例。
该范例使用copyArea对移动球的一部分进行复制。
importjava.util.Timer;
importjava.util.TimerTask;
importjavax.microedition.lcdui.Canvas;
importjavax.microedition.lcdui.Graphics;
importjavax.microedition.lcdui.Image;
importcom.nec.graphics.NxGraphics;
/**
*copyArea范例动画canvas
*/
publicclassCopyAreaMovingBallCanvasextendsCanvas{
privateintx;//球的x坐标
privateImageimg;
privateTimertimer;
privateTimerTasktask;
/**
*构造函数
*/
publicTimerMovingBallCanvas(){
//读取画面
try{
img=Image.createImage("/back.PNG");
}catch(Exceptione){
e.printStackTrace();
}
//设定Timer,TimerTask
timer=newTimer();
task=newTimerMovingBallTask(this);
timer.schedule(task,100,100);//从100毫秒后起每100毫秒执行一次任务
}
/**
*描画方法
*/
protectedvoidpaint(Graphicsg){
//清除画面
g.setColor(255,255,255);//白
g.fillRect(0,0,getWidth(),getHeight());
//查看球
g.setColor(255,0,0);
g.drawString("copyAreaTest",0,0,Graphics.TOP|Graphics.LEFT);
g.fillArc(x,50,40,40,0,360);
//复制矩形区域
NxGraphicsng=NxGraphics.getNxGraphics(g);
ng.copyArea(x,50,20,20,x,100);
}
/**
*改变球的x坐标
*/
publicvoidincrement(){
x+=3;
}
/**
*timertask
*依照计时器设定的时刻表执行run()方法。
*/
classTimerMovingBallTaskextendsTimerTask{
privateTimerMovingBallCanvascanvas;
/**
*构造函数
*@paramcanvas
*/
publicTimerMovingBallTask(TimerMovingBallCanvascanvas){
this.canvas=canvas;
}
/**
*被计时器呼叫时进行的处理
*/
publicvoidrun(){
canvas.increment();
canvas.repaint();
}
}
}
运行结果如下所示。
2.2.Sprite
Sprite是指具有描画位置与大小的对象。
Sprite的特点有以下三点。
1.把SpriteImage分配、移动到任意位置
2.设定SpriteImage中的优先顺序
3.进行SpriteImage同类的碰撞判定
比如,在Canvas类中,依照描画顺序对画面进行描画,其中重复的部分,需要对描画的处理顺序进行正确的编程,专门繁琐。
在这种情形下,假如利用Sprite优先顺序,就不用担忧描画顺序,专门方便。
而且,Sprite的碰撞判定,关于经常发生碰撞判定处理的shootinggame等应用程序,专门有效。
为了利用Sprite,在NEC扩展API中预备了以下两类。
・Sprite
・SpriteMap
Sprite类中有以下方法。
方法
作用
booleanisVisible()
取得Sprite的可视/非可视信息。
VoidsetImage(javax.microedition.lcdui.Imageimage)
设定Sprite使用画面。
voidsetLocation(intx,inty)
设定Sprite查看位置。
voidsetVisible(booleanb)
设定Sprite的可视/非可视信息。
SpriteMap类使用Sprite对象,因此能够进行Sprite对象的同类碰撞判定和设定Sprite对象的描画优先顺序。
SpriteMap中有以下方法。
intgetCollisionFlag(intindex)
取得由自变量index指定的Sprite碰撞判定flag。
intgetCount()
返回保持的Sprite数。
SpritegetSprite(intindex)
返回由自变量index指定的索引Sprite。
Sprite[]getSprites()
返回Sprite排列。
booleanisCollision(intindex1,intindex2)
取得由自变量index1和index2指定的Sprite碰撞判定结果。
voidsetCollisionAll()
进行全体Sprite的相互碰撞判定。
voidsetCollisionOf(intindex)
进行由自变量index指定的Sprite碰撞判定。
voidsetPriority(intindex,intprior)
设定Sprite优先顺序。
Sprite查看利用上述NxGraphics类的方法drawSpriteSet。
利用drawSpriteSet方法,能够在画面上查看在SpriteSet注册的Sprite。
然而,visible被false指定的Sprite却不能在画面上查看。
ng.drawSpriteSet(spriteSet);
下面是Sprite中两球发生碰撞的演示程序的sourcecode。
该演示中,使球运动发生碰撞,那么相撞的球就会消逝。
importjavax.microedition.lcdui.Display;
importjavax.microedition.midlet.MIDlet;
importjavax.microedition.midlet.MIDletStateChangeException;
/**
*进行Spritetest的演示程序
*/
publicclassSpriteSampleextendsMIDlet{
Displaydisplay;
SpriteCanvascanvas;
/**
*构造函数
*/
publicSpriteSample(){
display=Display.getDisplay(this);
canvas=newSpriteCanvas();
}
/**
*打开程序
*/
protectedvoidstartApp()throwsMIDletStateChangeException{
display.setCurrent(canvas);
}
protectedvoidpauseApp(){
}
protectedvoiddestroyApp(booleanarg0)throwsMIDletStateChangeException{
}
}
importjavax.microedition.lcdui.Canvas;
importjavax.microedition.lcdui.Graphics;
importjavax.microedition.lcdui.Image;
importcom.nec.graphics.NxGraphics;
importcom.nec.graphics.Sprite;
importcom.nec.graphics.SpriteSet;
/**
*Spritetest用canvas
*球发生碰撞后消逝
*/
publicclassSpriteCanvasextendsCanvas{
privatefinalStringIMAGE_PATH="/ball.png";
privateImageimg=null;
privateSpriteball1=null;
privateSpriteball2=null;
privateintball2X=100;
privateintball2Y=100;
privateSpriteSetspriteSet;
/**
*构造函数
*/
publicSpriteCanvas(){
//读取画面
try{
img=Image.createImage(IMAGE_PATH);
}catch(Exceptione){
e.printStackTrace();
}
//Sprite的初始化
spriteSet=newSpriteSet
(2);
ball1=spriteSet.getSprite(0);
ball2=spriteSet.getSprite
(1);
if(img!
=null){
//球1的初始化
ball1.setImage(img);
ball1.setLocation(0,0);
ball1.setVisible(true);
//球2的初始化
ball2.setImage(img);
ball2.setLocation(ball2X,ball2Y);
ball2.setVisible(true);
}
}
/**
*描画方法
*/
protectedvoidpaint(Graphicsg){
//清除画面
g.setColor(255,255,255);
g.fillRect(0,0,getHeight(),getWidth());
//取得NEC扩展Graphics
NxGraphicsng=NxGraphics.getNxGraphics(g);
ng.drawSpriteSet(spriteSet);
}
/**
*按键处理
*/
protectedvoidkeyPressed(intkeycode){
switch(keycode){
case-1:
{
ball2Y-=3;
break;
}
case-2:
{
ball2Y+=3;
break;
}
case-3:
{
ball2X-=3;
break;
}
case-4:
{
ball2X+=3;
break;
}
default:
{
break;
}
}
//使球运动
ball2.setLocation(ball2X,ball2Y);
ball2.setVisible(true);
//进行球的碰撞判定
spriteSet.setCollisionAll();
if(spriteSet.getCollisionFlag
(1)==Integer.parseInt("1",2)){
ball1.setVisible(false);
}
//再次描画
repaint();
}
}
实际运行上述演示程序的结果如下所示。
使移动。
发生碰撞后画面上部的球消逝。
上述演示程序的碰撞判定如下所示。
//进行球的碰撞判定
spriteSet.setCollisionAll();
if(spriteSet.getCollisionFlag
(1)==Integer.parseInt("1",2)){
ball1.setVisible(false);
}
进行碰撞判定时,必须使用setCollisionOf和setCollisionAll方法。
然后,通过isCollision或者getCollisionFlag方法取得结果。
getCollisionFlag方法的返回值是int型。
第n项的Sprite和,由指定的自变量索引指定的Sprite发生碰撞,第n项的bit变为1,而不发生碰撞那么为0。
也确实是说,与第三项的Sprite发生碰撞时,由二进数返回〝100〞的值。
第五项和第二项的Sprite发生碰撞时,由二进数返回〝10010〞的值。
使用getCollisionFlag方法调查与第n项Sprite发生的碰撞时,使用以下运算式。
spriteSet.getCollisionFlag(x)%2的n次方的值 >=2的(n-1)次方的值
下面是判定与第三项Sprite发生碰撞的例子。
If(spriteSet.getCollisionFlag
(2)%8>=4){
System.out.println(〝碰撞!
!
!
!
!
!
〞);
}else{
System.out.println(〝不碰撞〞);
}
2.3.颜色变换
利用ImageEffector类,能够改变图片的颜色,而被指定的颜色能够进行最多两种颜色的变换。
例如,在选择时/非选择时描画已改变颜色的图标图片,或者描画只有颜色不同的肖像画时,使用该颜色变换功专门方便。
ImageEffector类中有以下的方法。
staticjavax.microedition.lcdui.ImagechangeColors(javax.microedition.lcdui.Imageimage,int[][]colormap,intnelems)
使用changeColors方法进行颜色变换。
在image中,指定变换前的画面,在colormap中指定colormap来改变颜色。
在Nelems中指定进行变换的颜色的数量。
例如,把某画面图片image的蓝色变为红色时,如下所示书写。
int[][]colormap={{0,0,255},
{255,0,0}};
ImageEffector.changeColors(image,colormap,1);
颜色变换用的colormap是二次元排列,RGB三要素的值按以下所示进行指定。
1色调的色替换设定
colormap[0][0]=变换对象RGB色1的R値;
colormap[0][1]=变换对象RGB色1的G值;
colormap[0][2]=变换对象RGB色1的B值;
colormap[1][0]=变换结果RGB色1的R值;
colormap[1][1]=变换结果RGB色1的G值;
colormap[1][2]=变换结果RGB色1的B值;
2色调的色替换设定
colormap[2][0]=变换对象RGB色2的R値;
colormap[2][1]=变换对象RGB色2的G值;
colormap[2][2]=变换对象RGB色2的B值;
colormap[3][0]=变换结果RGB色2的R值;
colormap[3][1]=变换结果RGB色2的G值;
colormap[3][2]=变换结果RGB色2的B值;
下面展现利用ImageEffector的演示程序。
该程序把画面上球的颜色变换后的结果在画面下表示出来。
importjavax.microedition.lcdui.Display;
importjavax.microedition.midlet.MIDlet;
importjavax.microedition.midlet.MIDletStateChangeException;
/**
*进行Spritetest的演示程序
*/
publicclassImageEffectorSampleextendsMIDlet{
Displaydisplay;
ImageEffectorCanvascanvas;
/**
*构造函数
*/
publicImageEffectorSample(){
display=Display.getDisplay(this);
canvas=newImageEffectorCanvas();
}
/**
*程序的打开方法
*/
protectedvoidstartApp()throwsMIDletStateChangeException{
display.setCurrent(canvas);
}
protectedvoidpauseApp(){
}
protectedvoiddestroyApp(booleanarg0)throwsMIDletStateChangeException{
}
}
importjavax.microedition.lcdui.Canvas;
importjavax.microedition.lcdui.Graphics;
importjavax.microedition.lcdui.Image;
importcom.nec.graphics.ImageEffector;
importcom.nec.graphics.ImageMap;
importcom.nec.graphics.NxGraphics;
importcom.nec.graphics.Sprite;
importcom.nec.graphics.SpriteSet;
/**
*颜色变换test用canvas
*/
publicclassImageEffectorCanvasextendsCanvas{
privatefinalStringIMAGE_PATH="/ball.png";
privateImageimg=null;
privateSpriteball1=null;
privateSpriteball2=null;
privateSpriteSetspriteSet;
privateImageMapim;
/**
*构造函数
*/
publicImageEffectorCanvas(){
//读取画面
try{
img=Image.createImage(IMAGE_PATH);
}catch(Exceptione){
e.printStackTrace();
}
//Sprite的初始化
spriteSet=newSpriteSet
(2);
ball1=spriteSet.getSprite(0);
ball2=spriteSet.getSprite
(1);
if(img!
=null){
//球1的初始化
ball1.setImage(img);
ball1.setLocation(0,0);
ball1.setVisible(true);
//进行画面转换
intcolormap[][]={{0,0,0},
{0,0,255