您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 企业文化 > 基于linux操作系统的J2ME动画制作入门
作者:刘宁Email:haodenet@163.com基于linux操作系统的J2ME动画制作入门作者:刘宁在互联网上经常可以看到的与J2ME开发有关的文章都是基于Windows系统平台的,由于我日常的工作基本上是在Linux系统下完成的,所以写这样一篇文章谈谈在Linux系统平台开发J2ME动画程序的一些心得。(一)图形设计1.图形格式J2ME手机的MIDP1.0标准版本,只支持PNG格式的图像。可以显示静态的图像和非静态的图像。(MIDP2.0中支持透明的PNG图像)因此你必须对PNG有足够的了解才能开发出最适合的游戏界面。注:静态图像:是指一经创建,图像的内容就不再变化的图像。非静态图像:是指图像可以由J2ME绘图语句动态创建。什么是PNG格式:PNG的的英文名称为PortableNetworkGraphics,即便携式网络图片,它是一种位图文件格式。PNG格式使用无损压缩,允许使用类似于GIF格式的调色板技术,支持真彩色图像,并具备alpha信道(半透明)等特性。PNG格式与其它图像格式相比较:BMP(未压缩,档案大),GIF(非破坏压缩,但只能存256色以下图档),JPG(破坏性压缩,压缩后的图档与原图不同)。PNG提供了一个将图形档案大小压缩到极限以利网络传输,但又能保留所有与画像品质有关信息的解决方案。PNG特性:支持256色调色板技术以产生小体积文件最高支持48位真彩色图像以及16位灰度图像。支持alpha信道的半透明特性。支持图像亮度的gamma校正信息。支持存储附加文本信息,以保留图像名称、作者、版权、创作时间、注释等作者:刘宁Email:haodenet@163.com信息。使用无损压缩渐近显示和流式读写,适合在网络传输中快速显示预览效果后再展示全貌。使用CRC循环冗余编码防止文件出错。最新的PNG标准允许在一个文件内存储多幅图像。缺点:PNG虽然有是一个经过深思熟虑而规划出的档案格式,但它还是有不尽完美的地方:1、PNG不支持单个档案储存多张图片:知道动画GIF89a模式可以储存多张GIF图片在同一个档案中,如此可以在网页上做出动画效果。PNG则因为PNGGROUP坚持PNG是一个单张图片的档案格式而不支持这方面的应用。不过PNG的Document中也有提到应用程序可以藉由自定chunk的方式来储存多张图片,不过这并不是一个标准,所以不具实用性。2、PNG不支持CYMK模式:CYMK色彩模式是应用于印刷出版的图档色泽表示法,PNG被界定为是一个专门用于跨平台网络传输的档案格式,PNGGROUP认为CYMK对于device的依赖性太重,所以PNG不支持CYMK,这使得将CYMK的图档转为PNG格式时,必须先将色彩模式转成RGB,否则便会发生色彩错乱的情形。3、PNG没有储存DPI信息:DPI是一种决定图文件打印品质的信息,例如300DPI就表示要将300pixel打印在一英吋的范围间。PNGGROUP也把这个视为是一种device依赖性大的信息,所以不予储存。2、制作图像图像绘制工具:在Windows平台下一般使用Adobe公司的PhotoShop软件,目前最新的版本是9.0在Linux桌面平台下我习惯使用Gimp这款图形处理软件利用GIMP图像处理软件制作图像:1.用GIMP加载已经画好的图象如下:作者:刘宁Email:haodenet@163.com图2.1:图像加载2、然后在图像窗口点击右键,然后选则Layer,再选则透明,然后选择AddAlphaChannel如下:图2.2:选则图层透明3.在工具栏选择魔术棒工具,选取需要变成透明的图像区域,然后单击右键,选择Edit,然后选择清除,如下:作者:刘宁Email:haodenet@163.com图2.3:将选择区域变成透明4.存储图像文档,在菜单栏选择另存为,在出现的窗口中选择确定文件类型为PNG格式,保存完成。图2.4:存储图片文档作者:刘宁Email:haodenet@163.com二、动画制作在编写程序之前,我们先要了解Linux平台下所使用的开发工具,SUN官方推荐使用NetBean这个开发工具,所以我们要下载NetBean的Linux版本,然后下载J2MESDK的Linux版本,安装过程很简单,这里不作阐述。需要掌握的基础知识:1、什么是动画?动画是游戏开发的基础,是一定要学习的重要知识。基本的动画,是将显示在画面上的角色等的动作与描绘位置作连续的变化,以产生动态的效果。如果你了解这种连续变化的表现方式,你就可以通过J2ME的相关方法来实现动画。2、什么是线程:所谓线程就是指程序的运行单位,使用线程将可以同时进行复数的处理。通过实例了解线程:注:本文所有实例除特殊需要均未提供MIDlet类文件的源代码,请自行编写。1、需要掌握的java相关类及接口zRunnable接口---Runnable接口//Runnable接口非常简单,就定义了一个方法run(),继承Runnable并实现这个方法就可以实现多线程了,但是这个run()方法不能自己调用,必须由系统来调用,否则就和别的方法没有什么区别了.主要方法:---run()方法zThread类---Thread类作者:刘宁Email:haodenet@163.com//用于创建线程和启动线程的类主要方法:---sleep(longtime)方法//时间延迟---start()方法//执行runnable接口的run()方法zTimer类和TimerTask类---TimerTask类//是一个起到定时器功能的类主要方法:---run()方法//程序运行2、线程的使用Java中实现多线程有两种途径:z继承Thread类z实现Runnable接口z继承TimerTask类(一)实现Runnable接口来创建线程:注:将Runnable接口作为实现的类,必须将Runnable接口的run()方法重新定义。在run()方法中,将编写线程处理的内容。1)线程的创建,启动,运行与停止:z线程的创建和启动运行线程必须用到Thread类,调用Thread类的start()方法会自动执行Runnable接口的run()方法来启动线程。例:publicclassThreadTestCanvasimplementsRunnable//实现Runnable接口{privateThreadth;//声明线程对象ThreadTestCanvas(){作者:刘宁Email:haodenet@163.com//以对象Runnable为参数,实例化Thread对象,创建线程th=newThread(this);//调用Thread类的start()方法启动线程,执行run()方法th.start();}……………………}z线程的运行……………run(){执行代码…执行代码…执行代码…}……………z线程的时间等待方法Thread类提供了在指定时间内让程序处理等待的功能。Thread.sleep(longmills)//以毫秒为单位时间延迟例:Try{//等待500毫秒Thread.sleep(500);//下一个处理}Catch(Exceptione){}注:使用sleep(longmills)方法是会产生异常。z线程的停止线程在结束了Runnable.run()方法内的处理之后就会停止。注:在J2SE中线程的停止方法,在j2me的配置中已经删除了。这个方法作者:刘宁Email:haodenet@163.com由于会在J2SE中,会导致SecurityException异常的发生,所以才不被推荐使用。z线程的实例:myThreadTest.java这个例子实现了利用循环在终端循环打印一个int型变量的累加运算(MIDlet类省略)classmyThreadTestextendsCanvasimplementsRunnable{privatebooleanisStopped;inti=0;myThreadTest(){isStopped=false;}publicvoiddoStart(){Threadth=newThread(this);Th.start();}publicvoidrun(){//…编写线程的处理部分While(!isStopped){myPrint();try{Thread.sleep(1000);}catch(Exceptione){}}}publicvoidmyPrint(){System.out.println(“***hellothread***“+i);i++;}publicvoidpaint(Graphicsg){g.setColor(255,255,0);作者:刘宁Email:haodenet@163.comg.fillRect(0,0,getWidth(),getHeight());}}(二)Timer类和TimerTask类的结合使用J2ME中自MIDPv1.0开始就提供了对定时器的支持。要使用定时器就要需要涉及到TIMER(定时器)类和TimerTask(定时器任务)类。TimerTask类是一个虚类,用于实现一个具体的任务。Timer类用于通过定期执行由TimerTask对象表示的任务。要使用定时器功能,就必须从TimerTask类派生新类,并且重载voidrun()方法,然后通过Timer对象来定时执行任务。过程抽象:1)importjava.util.*;//导入这个包2)classTestextendsTimerTask//需要有一个类继承这TimerTask类3)publicvoidrun()//重新定义TimerTask类的run()方法4)Timertimer=newTimer();//生成一个Timer类的对象5)timer.schedule(TimerTasktask,longdelay,longperiod)//调用这个方法,该方法第一个参数是一个TimerTask类型的对象,第二个参数是任务执行前等待的时间,第三个参数是任务执行时的间隔时间。注:TimerTask不用使用while()方法进行循环,因为他是定时刷新。但这样也有个问题,就是如果TimerTask的run方法写得过长,执行时间超过了设置的线程间隔时间,就会出现线程重叠的情况。线程重叠会造成诸如游戏速度突然加快等Bug。实例:该实例主要实现Timer类和TimerTask类的结合使用,程序运行后等待5秒钟,然后定时每隔2秒在终端输出一个int型变量的累加。zMIDlet类:TimerMIDlet.javaimportjavax.microedition.midlet.*;importjavax.microedition.lcdui.*;publicclassTimerMIDletextendsMIDlet{meCanvasmc;/**CreatesanewinstanceofTimerMIDlet*/publicTimerMIDlet(){作者:刘宁Email:haodenet@163.commc=newmeCanvas();Display.getDisplay(this).setCurrent(mc);}publicvoidstartApp(){}publicvoidpauseApp(){}publicvoiddestroyApp(booleanunconditional){}}zTaskTimer类:meTaskTimer.javaimportjavax.microedition.lcdui.*;importjava.util.*;publicclassmeTaskTimerextendsTimerTask{inti=0;publicmeTaskTimer(){}publicvoidrun(){System.out.println(abc+i);i++;}}zCanvas类:meCanvas.javaimportjavax.microedition.lcdui.*;importjava.u
本文标题:基于linux操作系统的J2ME动画制作入门
链接地址:https://www.777doc.com/doc-4920530 .html