J2ME程序设计实例教程(第07章).ppt
J2ME程序设计实例教程程序设计实例教程第第07章章 推箱子推箱子作者:杨光E-mail:第第7章章 推箱子推箱子本章将设计一个手机上的推箱子游戏,学习本章将设计一个手机上的推箱子游戏,学习GAME API的使用。的使用。7.1 知识点知识点7.2 设计要求设计要求7.3 类设计类设计7.4 代码实现代码实现7.5 实践实践 7.1 知识点知识点GAME API GAME API定义在定义在javax.microedition.lcdui.game 包中,由包中,由GameCanvas、Layer、TiledLayer、Sprite、LayerManager等等5个类组成。个类组成。7.1 知识点知识点GameCanvas类类GameCanvas扩展了扩展了javax.microedition.lcdui.Canvas,是一个抽象类,为游戏提供了基本的游戏用户界,是一个抽象类,为游戏提供了基本的游戏用户界面。面。GameCanvas类实现了双缓存技术。类实现了双缓存技术。public void flushGraphics()public void flushGraphics(int x int y,int width,int height)按键状态查询按键状态查询int keyState=getKeyState();if(key&UP_PRESSED)!=0)/向上的方向键被按下向上的方向键被按下 7.1 知识点知识点Layer类类Layer是个抽象类,用于表示游戏中的可见元素。是个抽象类,用于表示游戏中的可见元素。例如:游戏背景、行走的人物、奔跑的怪兽等。例如:游戏背景、行走的人物、奔跑的怪兽等。Game API为开发人员提供了两个为开发人员提供了两个Layer的子类:的子类:TiledLayer和和Sprite。常用方法:常用方法:public int getWidth()public int getHeight()public int getX()public int getY()public void setPosition(int x,int y)public void setVisible(boolean b)public boolean isVisible()public void move(int hd,int vd)7.1 知识点知识点TiledLayer类类TiledLayer是是Layer的的子类,用于创建游戏背景。该子类,用于创建游戏背景。该类创建的游戏背景由单元网格类创建的游戏背景由单元网格组成,单元格使用图像贴砖填组成,单元格使用图像贴砖填充,就好像在用马赛克拼图一充,就好像在用马赛克拼图一样。图像贴砖由样。图像贴砖由Image对象提对象提供,一个供,一个Image对象表示一幅对象表示一幅图片,这个图片可以被水平和图片,这个图片可以被水平和垂直分割成一系列大小相等的垂直分割成一系列大小相等的图像贴砖,并且每个图像贴砖图像贴砖,并且每个图像贴砖都被指定一个唯一的引用值。都被指定一个唯一的引用值。7.1 知识点知识点TiledLayer类类try Image img=Image.createImage(/Storage.png);TiledLayer background=new TiledLayer(8,8,img,16,16);catch(IOException ioe)System.out.println(读取图片错误!读取图片错误!+ioe.toString();7.1 知识点知识点TiledLayer类类填充背景方法:填充背景方法:public void setCell(int col,int row,int tiledIndex)public void fillCells(int col,int row,int numCols,int numRows,int tiledIndexs)7.1 知识点知识点TiledLayer类类常用方法:常用方法:public int getRows()public int getColumns()public int getCell(int col,int row)public int getCellWidth()public int getCellHeight()public void setStaticTileSet(Image img,int tileWidth,int TileHeight)7.1 知识点知识点Sprite类类Sprite是是Layer的子类,描述了游戏中活动的角色。的子类,描述了游戏中活动的角色。例如,行走的人物、奔跑的怪物、飞行的子弹等。例如,行走的人物、奔跑的怪物、飞行的子弹等。Sprite创建的对象拥有一个帧的集合,集合中的帧创建的对象拥有一个帧的集合,集合中的帧用来描绘用来描绘Sprite对象的外观,任一时刻只显示一帧图像。对象的外观,任一时刻只显示一帧图像。如果快速、连续的显示集合中不同的帧,那么如果快速、连续的显示集合中不同的帧,那么Sprite对对象就会呈现出动画的效果。象就会呈现出动画的效果。7.1 知识点知识点Sprite类类7.1 知识点知识点Sprite类类创建创建Sprite对象对象try Image img=Image.createImage(/worker.png);Sprite worker=new Spriter(img,16,16);catch(IOException ioe)System.out.println(加载图片错误!加载图片错误!+ioe.toString();7.1 知识点知识点Sprite类类Sprite对象通过下面的方法可以改变当前显示的帧。对象通过下面的方法可以改变当前显示的帧。public void setFrame(int sequenceIndex)public void nextFrame()public void prevFrame()7.1 知识点知识点Sprite类类碰撞检测碰撞检测public boolean collidesWith(Sprite s,boolean pixelLevel)public boolean collidesWith(TiledLayer t,boolean pixelLevel)public void defineCollisionRectangle(int x,int y,int width,int height)教材教材P166,例,例7-1演示了演示了TiledLayer和和Sprite的使用的使用7.1 知识点知识点LayerManager类类LayerManager是个图层管理器,负责管理游戏中是个图层管理器,负责管理游戏中的可见元素(的可见元素(Layer对象)。使用对象)。使用LayerManager能够能够简化游戏界面的绘制过程,并且可以很容易的实现游戏简化游戏界面的绘制过程,并且可以很容易的实现游戏界面的滚动功能。界面的滚动功能。7.1 知识点知识点LayerManager类类7.1 知识点知识点LayerManager类类图层管理方法:图层管理方法:public void append(Layer layer)public void insert(Layer layer,int index)public void remove(Layer layer)public Layer getLayerAt(int index)public int getSize()教材教材P172,例,例7-2演示了图层管理演示了图层管理7.1 知识点知识点定时器定时器TimerTimer定义在定义在java.utiljava.util包中,是个定时器,能够在包中,是个定时器,能够在后台线程中执行定时的任务。根据定时任务执行的次数,后台线程中执行定时的任务。根据定时任务执行的次数,定时器有两种工作方式:一次运行的定时器和重复运行定时器有两种工作方式:一次运行的定时器和重复运行的定时器。的定时器。7.1 知识点知识点定时器定时器定时器在指定的时间执行定时的任务,该任务只被定时器在指定的时间执行定时的任务,该任务只被执行一次。定时器对象调用下面的方法安排任务的执行执行一次。定时器对象调用下面的方法安排任务的执行时间。时间。public void schedule(TimerTask task,Date time)public void schedule(TimerTask task,long delay)7.1 知识点知识点定时器定时器定时器在指定的时间开始执行任务,然后该任务将被重定时器在指定的时间开始执行任务,然后该任务将被重复执行。定时器调用下面的方法安排任务开始执行的时间,复执行。定时器调用下面的方法安排任务开始执行的时间,及任务重复执行的频率。及任务重复执行的频率。public void schedule(TimerTask task,Date firstTime,long period)public void schedule(TimerTask task,long delay,long period)public void scheduleAtFixedRate(TimerTask task,Date firstTime,long period)public void scheduleAtFixedRate(TimerTask task,long delay,long period)7.1 知识点知识点定时器定时器TimerTask是一个抽象类,表示定时器要执行的任务。是一个抽象类,表示定时器要执行的任务。TimerTask的子类负责实现执行任务的的子类负责实现执行任务的run方法。下面代码演示了方法。下面代码演示了定时器的使用。定时器的使用。Timer timer=new Timer();TimerTask task=new TimerTask()public void run()System.out.println(Hello,Tom.);timer.schedule(task,100,200);7.2 设计要求设计要求1.用户通过方向键可以操作游戏中的搬运工推动箱子,用户通过方向键可以操作游戏中的搬运工推动箱子,搬运工一次只能推动一个箱子。当用户把所有的箱子搬运工一次只能推动一个箱子。当用户把所有的箱子都推到指定的位置,即完成任务。都推到指定的位置,即完成任务。2.搬运工推箱子的过程在一个封闭的区域内进行,搬运搬运工推箱子的过程在一个封闭的区域内进行,搬运工和箱子都不能越界。在区域内会有一些障碍,搬运工和箱子都不能越界。在区域内会有一些障碍,搬运工和箱子不能直接穿过,只能绕行。工和箱子不能直接穿过,只能绕行。3.用户可以通过菜单选择进入下一关或者上一关游戏,用户可以通过菜单选择进入下一关或者上一关游戏,也可以选择重新开始当前关的游戏。也可以选择重新开始当前关的游戏。7.2 类设计类设计7.3 代码实现代码实现程序打包程序打包1.启动启动J2ME无线开发工具,新建一个项目。无线开发工具,新建一个项目。2.推箱子游戏需要推箱子游戏需要4个个png格式的图片文件,分别为:格式的图片文件,分别为:worker16.png、storage16.png、box16.png、init.png。把这些文件拷贝到新建项目的。把这些文件拷贝到新建项目的resimg目录中。目录中。3.打开记事本,输入打开记事本,输入7.3节节6描述的第一关游戏的初始数描述的第一关游戏的初始数据,然后把编辑后的文件保存到当前项目的据,然后把编辑后的文件保存到当前项目的resmap目录中,文件名为目录中,文件名为level1.map。4.将将节中的节中的java源文件保存到当前项目的源文件保存到当前项目的src目录中。目录中。单击开发工具的单击开发工具的【生成生成】按钮,编译源文件。如果有按钮,编译源文件。如果有错误,请修改源文件,保存后重新编译。错误,请修改源文件,保存后重新编译。5.选择开发工具的菜单选择开发工具的菜单【项目项目】【包包】【产生包产生包】对对当前项目进行打包。打包成功后,将在当前项目的当前项目进行打包。打包成功后,将在当前项目的bin目录下生成一个目录下生成一个jar文件和一个文件和一个jad文件。文件。7.3 代码实现代码实现运行效果运行效果7.4 代码实现代码实现 代码分析代码分析参见教材参见教材P1811997.5 实践实践1.游戏状态信息显示。游戏状态信息显示。2.请为游戏添加自动记录用户成绩的功能。请为游戏添加自动记录用户成绩的功能。3.请为游戏添加撤销功能。请为游戏添加撤销功能。4.添加屏幕滚动功能。添加屏幕滚动功能。