J2ME程序设计 实验报告
j2me 实验四 http 天气预报 稳定性增强,请下载j2me实验四.txt,复制里面代码覆盖本文档内相应代码

淮海工学院计算机工程学院实验报告书课程名:《手持设备软件开发》题目:实验4:J2ME网络程序设计班级:学号:姓名:statue评语:成绩:指导教师:批阅时间:年月日一、实验目的与要求掌握MIDP网络程序设计的一般方法。
能够使用GCF中的类和接口及多线程进行网络客户端应用程序的开发,掌握基于HTTP编程的方法,能够处理GET与POST请求。
理解MIDlet推注册及响应网络连接的步骤及方法。
二、实验内容使用Google Weather API开发一个可以显示连云港天气预报的J2ME网络程序。
具体的方法是请求网址:/ig/api?weather=lianyungang&hl=zh-cn然后处理响应返回的XML文档。
样例文档如下:<xml_api_reply version="1"><weather module_id="0" tab_id="0" mobile_row="0" mobile_zipped="1"row="0" section="0"><forecast_information><city data="Lianyungang, Jiangsu" /><postal_code data="lianyungang" /><latitude_e6 data="" /><longitude_e6 data="" /><forecast_date data="2010-06-03" /><current_date_time data="2010-06-03 11:00:00 +0000" /><unit_system data="SI" /></forecast_information><current_conditions><condition data="雨" /><temp_f data="58" /><temp_c data="14" /><humidity data="湿度:89%" /><icon data="/ig/images/weather/cn_heavyrain.gif" /><wind_condition data="风向:米/秒" /></current_conditions><forecast_conditions><day_of_week data="周五" /><low data="14" /><high data="23" /><icon data="/ig/images/weather/sunny.gif" /><condition data="晴" /></forecast_conditions>……</weather></xml_api_reply>三、实验步骤import javax.microedition.midlet.*;import javax.microedition.io.*;import javax.microedition.lcdui.*;import java.io.*;import java.util.Vector;public class pro4 extends MIDlet implements CommandListener{public static final String RESPONSE_HEADER_CONTENT_LENGTH = "Content-Length";public static final String RESPONSE_HEADER_CONTENT_TYPE = "Content-Type";private Display display;private TextBox tbxMain;private Command cmdExit;private Command cmdDisplay;private String msg="";String url="/ig/api?weather=lianyungang&hl=zh-cn";public pro4(){display=Display.getDisplay(this);cmdExit=new Command("Exit",Command.SCREEN,1);cmdDisplay=new Command("刷新",Command.ITEM,2);getWeather();tbxMain=new TextBox("天气预报",msg,2000,0);tbxMain.addCommand(cmdExit);tbxMain.addCommand(cmdDisplay);tbxMain.setCommandListener(this);}//建立连接public void getWeather(){HttpConnection conn=null;try{conn=(HttpConnection)Connector.open(url,Connector.READ);conn.setRequestMethod(HttpConnection.POST);conn.setRequestProperty("User_agent","Profile/MIDP-2.0 Configuration/CLDC-1.1");}catch(IOException ioe){System.out.println(ioe);}try{DataInputStream sIs = conn.openDataInputStream();String outString=getResponseData(conn,sIs);System.out.println(outString);msg=outString;msg=division(msg);}catch(IOException io){System.out.print(io);}}//分割提取字符串public String division(String str){String out="";int cityStrStart=str.indexOf("city data=")+"city data=".length()+1;int cityStrEnd=str.indexOf("/><postal_code")-1;out=out+"城市:"+str.substring(cityStrStart,cityStrEnd)+'\n';int dateStrStart=str.indexOf("orecast_date data=")+"orecast_date data=".length()+1;int dateStrEnd=str.indexOf("/><current_date")-1;out=out+"日期:"+str.substring(dateStrStart,dateStrEnd)+'\n';int wetStrStart=str.indexOf("湿度:")+"湿度:".length();int wetStrEnd=str.indexOf("/><icon data=")-1;out=out+"湿度:"+str.substring(wetStrStart,wetStrEnd)+'\n';if( str.regionMatches( true,str.indexOf("gif\"/><wind_condition data=")+1 ,"风向" ,0 ,"风向".length() ) ){int windStrStart=str.indexOf("风向:")+"风向:".length();int windStrEnd=str.indexOf("/></current_conditions>")-1;out=out+"风向:"+str.substring(windStrStart,windStrEnd)+'\n';}//第一天int week1StrStart=str.indexOf("day_of_week data=")+"day_of_week data=".length()+1;int week1StrEnd=str.indexOf("/><low data=")-1;out=out+str.substring(week1StrStart,week1StrEnd)+'\n';int low1StrStart=str.indexOf("low data=")+"low data=".length()+1;int low1StrEnd=str.indexOf("/><high data=")-1;out=out+"最低温度:"+str.substring(low1StrStart,low1StrEnd);int high1StrStart=str.indexOf("/><high data=")+"/><highdata=".length()+1;int high1StrEnd=str.indexOf("/><icon data=\"/ig")-1;out=out+"最高温度:"+str.substring(high1StrStart,high1StrEnd);int condition1StrStart=str.indexOf("gif\"/><conditiondata=")+"gif\"/><condition data=".length()+1;int condition1StrEnd=str.indexOf("/></forecast_conditions")-1;out=out+"总体概况:"+str.substring(condition1StrStart,condition1StrEnd)+'\n';//第二天int week2StrStart=str.indexOf("day_of_weekdata=",condition1StrEnd+5)+"day_of_week data=".length()+1;int week2StrEnd=str.indexOf("/><low data=",condition1StrEnd+5)-1; out=out+str.substring(week2StrStart,week2StrEnd)+'\n';int low2StrStart=str.indexOf("low data=",condition1StrEnd+5)+"low data=".length()+1;int low2StrEnd=str.indexOf("/><high data=",condition1StrEnd+5)-1;out=out+"最低温度:"+str.substring(low2StrStart,low2StrEnd);int high2StrStart=str.indexOf("/><highdata=",condition1StrEnd+5)+"/><high data=".length()+1;int high2StrEnd=str.indexOf("/><icon data=\"/ig",condition1StrEnd+5)-1;out=out+"最高温度:"+str.substring(high2StrStart,high2StrEnd);int condition2StrStart=str.indexOf("gif\"/><conditiondata=",condition1StrEnd+5)+"gif\"/><condition data=".length()+1;intcondition2StrEnd=str.indexOf("/></forecast_conditions",condition1StrEnd+5)-1;out=out+"总体概况:"+str.substring(condition2StrStart,condition2StrEnd)+'\n';//第三天int week3StrStart=str.indexOf("day_of_weekdata=",condition2StrEnd+5)+"day_of_week data=".length()+1;int week3StrEnd=str.indexOf("/><low data=",condition2StrEnd+5)-1;out=out+str.substring(week3StrStart,week3StrEnd)+'\n';int low3StrStart=str.indexOf("low data=",condition2StrEnd+5)+"lowdata=".length()+1;int low3StrEnd=str.indexOf("/><high data=",condition2StrEnd+5)-1;out=out+"最低温度:"+str.substring(low3StrStart,low3StrEnd);int high3StrStart=str.indexOf("/><highdata=",condition2StrEnd+5)+"/><high data=".length()+1;int high3StrEnd=str.indexOf("/><icon data=\"/ig",condition2StrEnd+5)-1;out=out+"最高温度:"+str.substring(high3StrStart,high3StrEnd);int condition3StrStart=str.indexOf("gif\"/><conditiondata=",condition2StrEnd+5)+"gif\"/><condition data=".length()+1;intcondition3StrEnd=str.indexOf("/></forecast_conditions",condition2StrEnd+5)-1;out=out+"总体概况:"+str.substring(condition3StrStart,condition3StrEnd)+'\n';//第四天int week4StrStart=str.indexOf("day_of_weekdata=",condition3StrEnd+5)+"day_of_week data=".length()+1;int week4StrEnd=str.indexOf("/><low data=",condition3StrEnd+5)-1;out=out+str.substring(week4StrStart,week4StrEnd)+'\n';int low4StrStart=str.indexOf("low data=",condition3StrEnd+5)+"lowdata=".length()+1;int low4StrEnd=str.indexOf("/><high data=",condition3StrEnd+5)-1;out=out+"最低温度:"+str.substring(low4StrStart,low4StrEnd);int high4StrStart=str.indexOf("/><highdata=",condition3StrEnd+5)+"/><high data=".length()+1;int high4StrEnd=str.indexOf("/><icon data=\"/ig",condition3StrEnd+5)-1;out=out+"最高温度:"+str.substring(high4StrStart,high4StrEnd);int condition4StrStart=str.indexOf("gif\"/><conditiondata=",condition3StrEnd+5)+"gif\"/><condition data=".length()+1;intcondition4StrEnd=str.indexOf("/></forecast_conditions",condition3StrEnd+5)-1;out=out+"总体概况:"+str.substring(condition4StrStart,condition4StrEnd)+'\n';return out;}//获取内容public String getResponseData(HttpConnection aConn, DataInputStream sIs) { boolean isWap = true;byte[] sData = null;String sType = null;int sLen = 0;try {sType = aConn.getHeaderField(RESPONSE_HEADER_CONTENT_TYPE);sLen = Integer.parseInt(getResponseHeaderProperty(aConn, RESPONSE_HEADER_CONTENT_LENGTH));} catch (IOException ex) {System.err.print(ex.toString());} catch (Exception ex) {System.err.print(ex.toString());sLen = 0;}if (sLen > 0) {int sActual = 0; //每一次实际读取的字节数int sBytesread = 0; //总读取的字节数sData = new byte[sLen];while ((sBytesread != sLen) && (sActual != -1)) {try {sActual = sIs.read(sData, sBytesread, sLen - sBytesread); sBytesread += sActual;} catch (Exception ex) {System.err.print(ex.toString());return null;}}} else {int sCh = 0;Vector sVbuffer = new Vector();try {while ((sCh = sIs.read()) != -1) {sVbuffer.addElement(new Integer(sCh));}} catch (Exception ex) {System.err.print(ex.toString());return null;}sLen = sVbuffer.size();sData = new byte[sLen];for (int i = 0; i < sLen; i++) {sData[i] = ((Integer) sVbuffer.elementAt(i)).byteValue();}}String sResult = new String(sData);isWap = false;return sResult;}public String getResponseHeaderProperty(HttpConnection aConn, String aKey) {return aConn.getRequestProperty(aKey);}public void startApp(){display.setCurrent(tbxMain);}public void pauseApp(){}public void destroyApp(boolean unconditional){}public void commandAction(Command c,Displayable s){if(c==cmdExit){destroyApp(false);notifyDestroyed();}if(c==cmdDisplay){getWeather();tbxMain.setString(msg);System.out.println("msg"+msg);}}}四、实验结果五、结果分析与实验体会本次实验可以分为三个部分:建立连接,取出字符串,提取字符串。
J2ME手机游戏开发引擎的分析与设计

哈尔滨工业大学摘要J2ME游戏引擎的主要作用就是根据用户的设定辅助生成一些J2ME代码框架,用户只需要去实现对应的处理函数就可以完成自己设计的游戏。
这样就可以合理重复利用已经编写好的游戏代码,做到保证游戏质量的同时尽力提高开发速度。
本文简单描述了我设计的J2ME手机游戏引擎的基本功能,同时对“WeRun”俱乐部来开发这样一个引擎的可行性做了技术和市场方面的分析。
在这些分析和设计的基础上,对整个开发流程做了初步的计划,归纳了可能用到的设计模式和基本类结构。
通过本文,让读者对J2ME 手机游戏引擎这个项目有一个概念上较为清楚的认识,同时也对于项目组的开发工作具有积极的导向作用。
关键词J2ME;手机游戏;游戏引擎- I -哈尔滨工业大学(威海)软件学院AbstractThe main function of this J2ME mobile game engine is assisting the programmers to generate some J2ME game’s frameworks according to the parameters that they set. The only thing that users have to do is accomplishing the handling functions to finish their games. So that the programmer can reasonably reuse the codes which have been written and program quickly as well as make sure the high quality. The paper mainly describes the basic functions of a common J2ME mobile game engine. And finish the feasibility analysis for the WeRun club to develop this engine. On the basis of the analysis and the design, I make a primary plan of the develop process, conclude the design pattern and class structure that will be used in the project. Through this paper, I want to make the reader have a clear awareness of the J2ME mobile game engine. To the programmers, it can guide them to develop the engine.Keywords J2ME;Mobile phone games;The game engine- II -哈尔滨工业大学(威海)软件学院目录摘要 (I)Abstract (II)第1章绪论 ......................................................................... 错误!未定义书签。
J2me课程设计--飞机游戏程序开发

XXXX信息科学与工程学院课程设计任务书题目:飞机游戏程序开发学号:201012220212姓名:XXX专业:计算机应用技术课程:J2ME手机应用开发指导教师:XXX职称:讲师课程设计任务书及成绩评定摘要这款游戏的名字叫《览桥风光》。
J2ME(Java 2 Micro Edition) 是近年来随着各种不同设备,尤其是移动通信设备的飞速发展而诞生的一项新的开发技术。
它定位在消费性电子产品的应用上,对设备的智能化、多样化,提供了革命性的解决方案,并因其“Write Once, run anywhere”的Java特性而提高开发的效率。
随着手机的日益普及、Java功能在移动设备上的实现,Java应用程序产生的手机增值服务逐渐体现出其影响力,对丰富人们的生活内容、提供快捷的资讯起着不可忽视的作用。
本论文着眼于J2ME技术的应用,开发一款可商用的手机游戏程序。
本程序将老少皆宜的经典作品移植到手机上来,为更流行的硬件平台提供应用软件。
本论文介绍了J2ME的相关技术及本程序的结构分析和具体功能的实现。
关键字:J2ME;手机游戏;Java目录1本游戏背景介绍 42 开发环境的介绍................................................................. 错误!未定义书签。
3 程序结构、思想和相关技术 (6)3.1 本程序需要解决的主要技术问题 63.2 程序流程 73.3子弹的运行和控制94 程序分析和具体实现 (9)4.1 游戏进入前的选择 94.3地图的移动 (11)4.4地图的移动 (11)4.4玩家4次游戏机会的实现方法 (12)4.5游戏中的奖励及相关飞机的行为125总结 (14)附录一代码 (14)附录二操作说明 (14)1.本游戏背景介绍在抗战中,由国民政府领导的中国空军是所有国民党军队中抗战最为彻底,也最为英勇的部队,虽然开战之初力量悬殊,但是面对穷凶极恶的日本侵略者,他们毫不畏惧,视死如归,全力以赴投身到民族救亡的伟业中去,用自己的鲜血和生命谱写了中华民族最为豪迈的诗篇。
游戏设计报告

分布式包括数据分布和操作分布。数据分布是指数据可以分散在网络的不同主机上,
操作分布是指把一个计算分散在不同主机上处理。 (4)可靠性和安全性
Java 最初设计目的是应用于电子类消费产品,因此要求较高的可靠性。Java 虽然源于 C++,但它消除了许多 C++不可靠因素,可以防止许多编程错误。首先,Java 是强类型的 语言,要求显式的方法声明,这保证了编译器可以发现方法调用错误,保证程序更加可靠; 其次,Java 不支持指针,这杜绝了内存的非法访问;第三,Java 的自动单元收集防止了内 存丢失等动态内存分配导致的问题;第四,Java 解释器运行时实施检查,可以发现数组和 字符串访问的越界,最后,Java 提供了异常处理机制,程序员可以把一组错误代码放在一 个地方,这样可以简化错误处理任务便于恢复。
第一章、开发平台与技术概述
1.1 开发环境
操作系统:Microsoft Windows XP 程序语言:Java 2 开发包:Sun Java(TM) Wireless Toolkit 2.5.2 for CLDC IDE:Eclipse 3.2
J2ME实习报告

生产实习(专业实习)报告一、实习目的进一步了解java开发的相关知识,掌握java开发的基本技术,丰富java开发的实战经验。
复习Java的基础知识及正确的运用方法,和有用的相关技术,提高自己的工作效率。
通过实习,巩固大学所学专业的基本知识,提高分析、判断和处理实际问题的能力,锻炼自己的实际动手能力,增强自己的团队协作意识,了解软件开发的思考角度和主要流程。
本次专业实习选择就业单位作为实习单位,将在以后工作中从事Java移动应用开发,本次实习以学习J2ME知识为主,为毕业之后能够更快地进入工作状态并且能够更好的工作,打好基础。
二、实习单位简介闻泰集团作为一家提供手机整机方案设计服务、制造服务以及基于无线终端系列增值服务的高新技术企业集团,主要致力于无线终端产品的定制、研发、生产、销售、售后等综合业务。
闻泰集团成立于2006年,由上海研发中心、西安研发中心、深圳运营中心、嘉兴生产中心组成。
目前闻泰拥有员工3000余人,产品涵盖了从2G到3G的GSM、CDMA、EDGE、TD-SCDMA、EVDO等全系列手持设备,年产值数亿美元。
闻泰自成立以来,始终坚持自主技术创新,投入大量人力、物力从事无线通讯新技术的研发和应用。
截至目前闻泰已拥有技术专利近千项,率先拥有多项国际领先技术,且每年以500项的速度递增。
同时,闻泰集团拥有完善的销售网络以及全过程品质控制体系(ISO9001:2000、ISO14001、QC080000)。
立足本土,放眼国际。
闻泰创新性强、质量稳定可靠、性价比高的产品受到了国内外客户的热烈欢迎。
现在闻泰产品远销全球30多个国家和地区,全世界超过7000万的消费者正通过闻泰的产品和服务享受着无线移动生活的美好。
以“推动科技进步,回馈社会”作为企业使命,闻泰集团时刻秉执与社会、与合作伙伴、与员工“共识、共和、共创、共享”的文化理念,在谋求自身不断成长的同时,为员工创造最佳的工作平台和发展空间,为中国手机产业上下游企业打造共生共赢。
J2me课程设计文档

J2ME课程设计报告设计题目:手机短信界面的设计专业:软件工程08级2班组员:刘沛杨君甘雪莲孟聪指导老师:梁兴健一、项目名称:手机短信界面的设计二、小组成员任务分配:组长:刘沛主要完成手机短信欢迎界面和发送消息界面的代码编写,以及文档编写成员:杨君主要完成MeassageMIDlet代码的编写,以及文档编写成员:甘雪莲主要完成手编辑机短信界面的代码编写,以及文档编写成员:孟冲主要完成Conf类的编写,以及文档编写三、设计目的:1、加深对JA VA程序设计语言的理论知识的理解和应用平。
2、掌握JEME程序设计的基本方法和开发工具。
3、掌握手机短信界面的开发和设计。
四、需求分析:现在的的移动电话就是微型计算机,但是它的处理又与传统计算机的性能有一定的差距。
但是,在信息交流日夜增大的环境下,利用移动电话发送短信却是能够很好实现信息交流,并且能满足现在普通日常生活人们对信息交流的需求。
在面对生活节奏加快的今天,特别是在实现信息移动发送和随时接受这点上,特别受消费者的亲睐。
所以很有必要进行手机短信界面的开发和设计。
五、需要掌握的知识:●手机应用基础类:MIDlet●高级界面开发中能够充满整个界面的类:Displayable、Canvas、Screen、alert、Form等。
●高级界面开发中能够无法充满整个界面,但是可以放在Form上的类:Item、ChioceGroup、TextField、Cauge、DateField等。
●其他辅助类:滚动条Ticker、命令按钮Command、界面显示管理器Display、字体Font、图片Image。
●事件监听接口:CommandLisenter、ItemCommandLisenter、ItemStateLisenter。
●实现原理:在本次设计中我们需要用到以下一些界面:欢迎界面、编辑短信界面、发送短信界面。
我们可以利用编写一个MIDlet,在里面实例化所以界面元素,同样是这个MIDle t负责页面之间的切换和事件处理。
J2ME实验报告模版

J2ME实验报告实验名称:高级界面综合实例实验日期:2011班级:B0851学号:200姓名:一、实验目的综合运用各种界面元素进行高级界面设计。
二、实验环境JDK+WTK+Eclipse+EclipseMe三、实验内容模拟手机写短信程序(1)欢迎界面:右下“写短信”进入编辑界面,左下“退出”退出程序。
(2)编辑界面:一个TextBox输入短信,右下“确定”进入号码界面,左下“返回”返回欢迎界面。
(3)号码界面:一个TextField输入号码,右下“发送”提示发送成功并在控制台显示短信内容,左下“返回”返回欢迎界面。
四、源程序与运行结果import javax.microedition.midlet.*;import javax.microedition.lcdui.*;public class UIConvert extends MIDlet {Display display;public UIConvert(){display = Display.getDisplay(this);startFirstScreen();}protected void destroyApp(boolean arg0) throws MIDletStateChangeException { // TODO Auto-generated method stub}protected void pauseApp() {// TODO Auto-generated method stub}protected void startApp() throws MIDletStateChangeException { // TODO Auto-generated method stub}public void startFirstScreen(){FirstScreen fs = new FirstScreen(this);display.setCurrent(fs);}public void startSecondScreen(){SecondScreen ss = new SecondScreen(this);display.setCurrent(ss);}public void startThirdScreen(){ThirdScreen ts = new ThirdScreen(this);display.setCurrent(ts);}}class FirstScreen extends Form implements CommandListener { private Form mainForm;private Command exit,write;private UIConvert midlet;public FirstScreen(UIConvert midlet) {// TODO Auto-generated constructor stubsuper("欢迎界面");this.midlet=midlet;StringItem item = new StringItem("","欢迎您使用短信系统!");this.append(item);exit= new Command("退出",Command.EXIT,1);write=new Command("写短信",Command.OK,1);this.addCommand(exit);this.addCommand(write);this.setCommandListener(this);}public void commandAction(Command c,Displayable d){if(c==exit){destroyApp(false);notifyDestroyed();}if(c==write){midlet.startSecondScreen();}}private void destroyApp(boolean b) {// TODO Auto-generated method stub}private void notifyDestroyed() {// TODO Auto-generated method stub}}class SecondScreen extends Form implements CommandListener { private Form mainForm;private Command back,ok;private UIConvert midlet;private TextField tf;public SecondScreen(UIConvert midlet) {// TODO Auto-generated constructor stubsuper("编辑界面");//mainForm= new Form("写短信");this.midlet=midlet;//StringItem item = new StringItem("第二个界面:","This is the StringItem text");//this.append(item);// tf = new TextField("编辑短信", "", 255, TextField.ANY);// 设置TextField占据整个屏幕//tf.setPreferredSize(mainForm.getWidth(), mainForm.getHeight());// mainForm.append(tf);back = new Command("返回",Command.EXIT,1);ok = new Command("确认",Command.OK,1);this.addCommand(back);this.addCommand(ok);this.setCommandListener(this);}public void commandAction(Command c,Displayable d){if(c==back){midlet.startFirstScreen();}if(c==ok){midlet.startThirdScreen();}}}class ThirdScreen extends Form implements CommandListener {private Form mainForm;private Command back,send;private UIConvert midlet;private Alert alert;private Display display;public ThirdScreen(UIConvert midlet) {// TODO Auto-generated constructor stubsuper("号码界面");this.midlet=midlet;//StringItem item = new StringItem("第三个界面:","This is the StringItem text");//this.append(item);back = new Command("返回",Command.EXIT,1);send = new Command("发送",Command.OK,1);this.addCommand(back);this.addCommand(send);this.setCommandListener(this);}public void commandAction(Command c,Displayable d){if(c==back){midlet.startFirstScreen();}if(c==send){alert= new Alert("发送成功", "恭喜您,短信发送成功", null, );display.setCurrent(alert);}}}图1-1 图1-2五、实验总结主要包括本次实验是否完成、实验中遇到的问题及解决方法、实验收获等。
j2me实验三手机游戏程序设计 (1)

百度文库- 让每个人平等地提升自我!淮海工学院计算机工程学院实验报告书课程名:《手持设备软件开发》题目:实验3:J2ME手机游戏程序设计班级:软件学号: 1姓名:评语:成绩:指导教师:批阅时间:年月日一、实验目的与要求掌握J2ME手机游戏设计的一般方法,掌握游戏画布,分块图层,精灵和图层管理类的使用方法。
掌握控制游戏画面更新及固定帧率的方法。
二、实验内容对实例MIDP项目Game中的SimpleSprite游戏应用程序做如下的修改:1.使用动态分块修改游戏的背景使得在游戏运行过程中小花与小草连续的变换。
2.增加命令,可以控制sprite0移动的速度,同时保证画面的稳定更新。
3.sprite1在游戏开始时出现的位置随机生成,但要保证不与sprite0发生碰撞。
三、实验步骤SimpleSpriteCanvas.javapackage SimpleSprite;import javax.microedition.lcdui.*;import javax.microedition.lcdui.game.*;import java.util.*;public class SimpleSpriteCanvas extends GameCanvas{private boolean isPlay; // 值为true时游戏线程反复执行private long delay; // 线程执行时的延时,控制游戏每帧的时间private int width, height; // 保存屏幕的宽度和高度private TiledLayer background; // 定义背景为分块图层private Sprite sprite0, sprite1; //sprite0 大的, sprite1 小的private Image backImage, spriteImage; // 生成背景、精灵所用图像private final int toLeft[]={0, 1, 1, 2, 2, 3, 3, 4}; //精灵0向左运动的帧序列private final int toRight[]={5, 6, 6, 7, 7, 8, 8, 9}; //精灵0向右运动的帧序列private int xStep = 0, yStep = 0;private boolean pxCollides = false; //碰撞检测方式,默认矩形检查private boolean rightToLeft = true;private int aniIndex1, aniIndex2;private int state=1;private int moveLength=2; //初始步长private int xPosition=30,yPosition=80;// 构造方法public SimpleSpriteCanvas() {super(true);width = getWidth();height = getHeight();delay = 50;background = createBackground();sprite0 = createSprite("/SimpleSprite/sprite0.png", 56, 29);sprite1 = createSprite("/SimpleSprite/sprite1.png", 34, 27);sprite0.setPosition(180,70);createPosition();//产生随机位置sprite1.setPosition(xPosition,yPosition);collidesFind();sprite0.setFrameSequence(toLeft);sprite1.defineCollisionRectangle(0, 0, 64, 64);}// 启动线程体public void start() {isPlay = true;Thread1 thread1= new Thread1();Thread2 thread2= new Thread2();thread1.start();thread2.start();}// 停止线程执行public void stop() { isPlay = false; }// 线程体,游戏主体class Thread1 extends Thread{public void run(){Graphics g = getGraphics(); // 获取脱机屏幕缓冲区中图形对象long beginTime = 0, endTime = 0;while (isPlay == true) {beginTime = System.currentTimeMillis();queryKey(); // 查询按键状态sprite0Move();drawScreen(g); // 绘制屏幕endTime = System.currentTimeMillis();if (endTime - beginTime < delay) {try {Thread.sleep(delay - (endTime - beginTime));} catch (InterruptedException ie) { }}}}}// 主动查询按键状态,进行处理private void queryKey() {int keyStates = getKeyStates(); // 查询游戏按键状态,游戏按键被按下时if ((keyStates & LEFT_PRESSED) != 0) // 如果未超过左侧范围,向左移动xStep = -1*moveLength;if ((keyStates & RIGHT_PRESSED) !=0) // 如果未超过TiledLayer右侧范围,向右移动xStep = moveLength;if ((keyStates & UP_PRESSED) != 0) // 如果未超过TiledLayer上侧范围,向上移动yStep = -1*moveLength;if ((keyStates & DOWN_PRESSED) !=0) // 如果未超过TiledLayer下侧范围,向下移动yStep = moveLength;}// 在屏幕上显示游戏画面private void drawScreen(Graphics g) {g.setColor(0x99ccff);g.fillRect(0, 0, getWidth(), getHeight());background.paint(g);sprite0.nextFrame();sprite1.nextFrame();sprite0.paint(g);sprite1.paint(g);flushGraphics();}// 小花与小草转换class Thread2 extends Thread{public void run(){while (isPlay == true){if (state==1){background.setAnimatedTile(aniIndex1, 6);background.setAnimatedTile(aniIndex2, 5);state=0;}else{background.setAnimatedTile(aniIndex1, 5);background.setAnimatedTile(aniIndex2, 6);state=1;}try {Thread.sleep(500);} catch (InterruptedException ie) { S ystem.out.println("sleep wrong");} }}}// 建立分块图层private TiledLayer createBackground() {try {backImage = Image.createImage("/SimpleSprite/bgtiles.png");} catch (Exception e) {}TiledLayer tiledLayer = new TiledLayer(8,9,backImage,32,32);aniIndex1 = tiledLayer.createAnimatedTile(5);aniIndex2 = tiledLayer.createAnimatedTile(6);// 数组中存放单元格中需要填充的分块号int[] map = {0, 0, 7, 0, 0, 0, 8, 0,7, 0, 0, 0, 7, 0, 0, 7,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, -2, 0, 0, 0, -1,0, 0, 1, 2, 3, -1, 1, 2,0, -2, 1, 2, 2, 2, 2, 2,1, 2, 2, 4, 4, 4, 4, 4,};// 将分块填充进相应的单元格for (int i=0; i < map.length; i++) {int column = i % 8;int row = (i - column) / 8;tiledLayer.setCell(column,row,map[i]);}return tiledLayer;}// 建立精灵private Sprite createSprite(String picName, int spriteWidth, int spriteHeight) { try {spriteImage = Image.createImage(picName);} catch (Exception e) {}Sprite sprite = new Sprite(spriteImage, spriteWidth, spriteHeight);return sprite;}private void sprite0Move() {sprite0.move(xStep, yStep); //移动// 如果方向改变则改变动画序列if (xStep > 0 && rightToLeft == true) {rightToLeft = false;sprite0.setFrameSequence(toRight);}else if (xStep < 0 && rightToLeft != true) {rightToLeft = true;sprite0.setFrameSequence(toLeft);}//检测碰撞if( sprite0.collidesWith(background,pxCollides) ||sprite0.collidesWith(sprite1,pxCollides) ) {//如果移动后和其他背景或另一个物体发生碰撞则返回到原来位置sprite0.move(-xStep*2, -yStep*2);}// 重新初始化步长xStep = yStep = 0;}public void change() {// 改变碰撞检测方式,true表示采用象素级检查,false表示采用矩形检查if (pxCollides == true)pxCollides = false;elsepxCollides = true;}public void fast(){if(moveLength<10)moveLength++;}public void slow(){if(moveLength>1)moveLength-- ;}public void createPosition(){Random rdm = new Random();xPosition = (rdm.nextInt() >>> 1)%224 ; //取0-224的随机正数yPosition = (rdm.nextInt() >>> 1)%256 ;}public void collidesFind(){while( sprite1.collidesWith(background,pxCollides) ||sprite1.collidesWith(sprite0,pxCollides) ) {createPosition();sprite1.setPosition(xPosition,yPosition);}}public void displayChange(){if (sprite1.isVisible())sprite1.setVisible(false);elsesprite1.setVisible(true);}}SimpleSpriteMidlet.javapackage SimpleSprite;import javax.microedition.midlet.*;import javax.microedition.lcdui.*;// MIDlet主程序public class SimpleSpriteMidlet extends MIDlet implements CommandListener { private Display display;private SimpleSpriteCanvas gameCanvas;private Command exitCommand, actCommand,fastCommand,slowCommand,displayCommand;// 在MIDlet启动时进行初始化工作public void startApp() {display = Display.getDisplay(this); // 获得显示屏幕对象gameCanvas = new SimpleSpriteCanvas(); // 建立GameCanvas对象// 建立Command对象exitCommand = new Command("退出", Command.EXIT, 1);actCommand = new Command("改变", Command.SCREEN, 1);fastCommand = new Command("加速", Command.SCREEN, 1);slowCommand = new Command("减速", Command.SCREEN, 1);displayCommand = new Command("小龙显隐", Command.SCREEN, 1);gameCanvas.addCommand(exitCommand);gameCanvas.addCommand(actCommand);gameCanvas.addCommand(fastCommand);gameCanvas.addCommand(slowCommand);gameCanvas.addCommand(displayCommand);gameCanvas.setCommandListener(this);gameCanvas.start(); // 启动GameCanvas中的线程体display.setCurrent(gameCanvas);}// Command事件处理程序public void commandAction(Command c, Displayable s) {if (c == exitCommand) {exit();}else if (c == actCommand) {gameCanvas.change();}else if (c == fastCommand) {gameCanvas.fast();}else if (c == slowCommand) {gameCanvas.slow();}else if (c == displayCommand) {gameCanvas.displayChange();}}public void pauseApp() { }public void destroyApp(boolean unconditional) { }// 停止线程,结束MIDlet程序public void exit() {gameCanvas.stop();destroyApp(false);notifyDestroyed();}}四、实验结果五、结果分析与实验体会这一次试验实现要求不是很难,但是不管用什么办法实现总是有不足的地方。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《J2ME程序设计》实验报告专业:软件技术(游戏开发)班级:*** 学号:***姓名:聂建新石家庄科技信息职业学院信息工程系2012年2月-2012年4月实验一熟悉J2ME技术在Eclipse工作环境中的应用一、实验目的1、熟悉J2ME技术在Eclipse工作环境中的应用2、开发第一个MIDlet应用程序3、打包发布手机游戏应用程序4、将游戏下载到手机二、实验要求1、搭建Eclipse集成开发环境2、下载WTK 2.5.2并将其嵌入到Eclipse3、新建MIDlet应用程序4、运行MIDlet应用程序5、打包和混淆手机游戏应用程序6、通过数据线或蓝牙适配器下载游戏三、实验内容1、使用Eclipse搭建J2ME环境,开发一个简单的MIDlet程序进行测试,并对开发好的程序进行打包操作。
1、安装jdk1.双击打开jdk1.7安装包2.点击下一步3.选好路径后点击下一步,安装完成。
2、解压eclipse到当前文件夹即可3、安装sun_java1.双击打开sun_java_wireless_toolkit-2_5_2-ml-windows2.单击下一步后选择路径,完成。
4、在eclipse里eclipseme安装插件1.打开后在help下拉菜单下单击install new software...选项打开2.单击add...按钮3.再单击archive按钮后选择eclipseme插件按打开--》ok后全选4.按next键后等待一段时间后出现一下窗口5.按ok完成。
5、手机模拟器测试四、实验总结让我学会了怎样正确安装eclipse 、sun 模拟器、jdk ,安装eclipseme 插件。
实验二制作闪屏和菜单一、实验目的1、制作简单的闪屏和菜单2、制作文字菜单3、制作图片菜单二、实验要求1、利用Alert界面组件制作闪屏2、利用List界面组件制作菜单3、了解TextBox界面组件和Form界面组件4、绘制背景图片5、绘制菜单文字6、突出显示当前菜单项并通过上、下方向键实现7、绘制菜单图片8、绘制矩形框,突出显示当前菜单项三、实验内容1、设计并制作一个闪屏。
源程序:import javax.microedition.lcdui.Alert;import mand;import mandListener;import javax.microedition.lcdui.Display;import javax.microedition.lcdui.Displayable;import javax.microedition.lcdui.Image;import javax.microedition.midlet.MIDlet;import javax.microedition.midlet.MIDletStateChangeException;public class over extends MIDlet implements CommandListener{Alert Myalert;private Alert createAlert(){Image imgLogo=null;try{imgLogo=Image.createImage("/xx.png");}catch(Exception e){}Alert alert=new Alert(" 信息"," 我的信息",imgLogo,null);return alert; }public over() {}public void commandAction(Command arg0, Displayable arg1) {}protected void destroyApp(boolean arg0) throws MIDletStateChangeException { }protected void pauseApp() {}protected void startApp() throws MIDletStateChangeException {Myalert=this.createAlert();Myalert.setTimeout(5000);Display.getDisplay(this).setCurrent(Myalert);}}运行结果:图1 系统运行界面图2、设计并制作一个菜单。
源程序:import javax.microedition.lcdui.Alert;import javax.microedition.lcdui.ChoiceGroup;import mand;import mandListener;import javax.microedition.lcdui.Display;import javax.microedition.lcdui.Displayable;import javax.microedition.lcdui.Image;import javax.microedition.lcdui.List;import javax.microedition.midlet.MIDlet;import javax.microedition.midlet.MIDletStateChangeException;public class over extends MIDlet implements CommandListener{List MyMenu;private List createList(){String str[]={"新建短信","收信箱","待发信箱","草稿箱","已发信箱"};Image img=null;Image imag=null;Image im=null;Image image=null;Image ima=null;try{img=Image.createImage("/1.JPG");imag=Image.createImage("/2.JPG");im=Image.createImage("/3.JPG");image=Image.createImage("/4.JPG");ima=Image.createImage("/5.JPG");}catch(Exception e){}Image images[]={img,imag,im,image,ima};List list=new List(" 信息",ChoiceGroup.IMPLICIT,str,images);return list;}public over() {}public void commandAction(Command arg0, Displayable arg1) {}protected void destroyApp(boolean arg0) throws MIDletStateChangeException {}protected void pauseApp() {}protected void startApp() throws MIDletStateChangeException {MyMenu=this.createList();Display.getDisplay(this).setCurrent(MyMenu);}}运行结果:图2 系统运行界面图3、新建工程,新建MIDlet,然后依次加入各个Form界面组件。
源程序:import mand;import javax.microedition.lcdui.DateField;import javax.microedition.lcdui.Display;import javax.microedition.lcdui.Form;import javax.microedition.lcdui.Gauge;import javax.microedition.lcdui.StringItem;import javax.microedition.lcdui.TextField;import javax.microedition.midlet.MIDlet;import javax.microedition.midlet.MIDletStateChangeException;public class over extends MIDlet {Display dis=Display.getDisplay(this);TextField tf=new TextField("TextField","",11,TextField.ANY);Command cmd=new Command("Command按钮",Command.OK,0);DateField df=new DateField("日期",DateField.DATE_TIME);Gauge g=new Gauge("Gauge",true,5,2);StringItem si=new StringItem("StringItem","组件",StringItem.PLAIN);Form f=MyForm();public over() {}private Form MyForm(){Form f=new Form("Form界面");f.append(tf);f.append(g);f.append(si);f.append(df);f.addCommand(cmd);return f;}protected void destroyApp(boolean arg0) throws MIDletStateChangeException {}protected void pauseApp() {}protected void startApp() throws MIDletStateChangeException {dis.setCurrent(f);}}运行结果:图3 系统运行界面图4、通过绘制直线、三角形、矩形、弧形等基本图形的方式,创建一个类似下图所示的简单的游戏场景。
四、实验总结学会利用Alert界面组件制作闪屏,利用List界面组件制作菜单,了解了TextBox界面组件和Form界面。