J2ME的低级用户界面编程.ppt

上传人:max****ui 文档编号:6357337 上传时间:2020-02-23 格式:PPT 页数:77 大小:981.55KB
返回 下载 相关 举报
J2ME的低级用户界面编程.ppt_第1页
第1页 / 共77页
J2ME的低级用户界面编程.ppt_第2页
第2页 / 共77页
J2ME的低级用户界面编程.ppt_第3页
第3页 / 共77页
点击查看更多>>
资源描述
20 40 1 第8章J2ME的低级用户界面编程 20 40 2 预备知识 高级界面就是界面上的效果都是由控件组成的 与此对应的是低级界面 就是界面效果都是通过编程 在画布上画出来的 Displayable的子类可以充满整个界面 其直接子类有两个 Canvas和Screen 其中 Screen的子类就是以前讲解高级界面 而Canvas就提供了低级界面开发的支持 本章主要讲解低级界面开发 20 40 3 本章知识点 Canvas类 1 图形绘制与Graphics类 2 文字绘制与Font类 3 图像绘制与Image类 4 Canvas事件处理 低级 5 动画实现 6 游戏设计中的基本方法 7 20 40 4 8 1Canvas类 Canvas类代表了设备屏幕的低级抽象绘图表面 画布 它可以用于绘制直线和曲线以及显示图像等图形操作 是游戏屏幕的基础 所有的低级API都是由javax microedition lcdui Canvas类开始 只要继承Canvas 就可以建立一个能够显示在屏幕上的画面 Canvas是一个抽象类 其中只有一个必须要实现的抽象方法paint 每当屏幕需要重绘时 就会产生重绘事件 系统会自动调用paint 并传入一个Graphics的引用 由此 整个画面描绘出来 20 40 5 8 1Canvas类 当屏幕需要重绘时 就会产生重绘事件 系统将自动调用paint 方法 实现整个屏幕画的绘制 画布开发的基本结构 importjavax microedition midlet importjavax microedition lcdui publicclassMyMidletextendsMIDlet publicMyMidlet publicvoidstartApp Canvascanvas newMC Displayd Display getDisplay this d setCurrent canvas publicvoidpauseApp publicvoiddestroyApp booleanu importjavax microedition lcdui 画布类publicclassMCextendsCanvas publicvoidpaint Graphicsg 在画布上画图 20 40 6 8 1Canvas类 Canvas类的方法 20 40 7 8 1Canvas类 Canvas类的方法 20 40 8 8 1Canvas类 Canvas类的方法 20 40 9 8 1Canvas类 如果用户想要调用paint 方法 只能通过repaint 方法 repaint 方法叫重绘 用于请求屏幕重新绘图 repaint 有两个重载方法 repaint 不带参数的方法用于重画整个屏幕 repaint intx inty intpw intph 带参数的方法用于重绘指定的矩形区域 其中 x y 是重绘区域的左上角坐标 pw ph为宽和高 重画整个屏幕的方法 编程实现较简单 但效率比较低 一般 指定重画区的绘图方法会比较有效率 20 40 10 8 1Canvas类 调用repaint 之后会立刻返回 调用paint 回调函数的工作则由另外一个专门处理UI的线程来完成 如果我们希望等到paint 完成后再返回 那么可以在repaint 之后调用serviceRepaints serviceRepaints 的功能 用来强制队列中的重绘事件快点做完 如果队列中根本没有重绘事件 那么serviceRepaints 什么事也不做 为了确保每个重绘事件尽快完成 在调用repaint 之后通常都会伴随一个serviceRepaints 20 40 11 8 1Canvas类 showNotify 在Canvas对象显示到屏幕上之前 AMS 应用程序管理器 先调用showNotify Canvas类的showNotify 方法缺省实现为空 应用程序可以重写该方法 以完成画布显示前的初始化工作 hideNotify 方法在Canvas对象从显示屏幕上删除之后 AMS会自动调用hideNotify Canvas类的hideNotify 方法缺省实现为空 应用程序可以重写该方法 在Canvas对象删除后执行一些清除工作 20 40 12 8 1Canvas类 熟悉低级用户界面编程基本思路 importjavax microedition midlet importjavax microedition lcdui publicclassMyMIDletextendsMIDlet publicvoidstartApp Display getDisplay this setCurrent newMyCanvas publicvoidpauseApp publicvoiddestroyApp booleanun importjavax microedition lcdui publicclassMyCanvasextendsCanvas publicvoidshowNotify System out println showNotify 方法被调用 publicvoidhideNotify System out println hideNotify 方法被调用 publicvoidpaint Graphicsg g setColor 255 0 0 将画笔设置为红颜色g fillRect 0 0 getWidth getHeight 填充矩形g setColor 0 0 0 将画笔设置为黑颜色g drawString CanvasTest 20 120 g BOTTOM g LEFT 在指定位置绘制文本 20 40 13 8 2图形绘制与Graphics类 Graphics类 画笔类 javax microedition lcdui Graphics类Canvas的实例对象代表一块画布 要在画布上绘制图形需要另一个重要的图形类Graphics类 Graphics类是虚拟绘图设备的抽象 类似一支画笔 在Canvas实例中 Graphics对象只能在paint 方法中操作 在低级用户界面API中 取得Graphics对象的方法有两种 在Canvas类的paint 方法传入的参数中获取用Image类的getGraphics 方法获取两者的区别是用getGraphics 方法取得的Graphics对象不能在画布上绘图Graphics类为二维图形绘制提供了丰富的方法 20 40 14 Graphics类的方法 8 2图形绘制与Graphics类 20 40 15 Graphics类的方法 8 2图形绘制与Graphics类 20 40 16 Graphics类的方法 8 2图形绘制与Graphics类 20 40 17 Graphics类的方法 8 2图形绘制与Graphics类 20 40 18 画笔的颜色操作设置画笔颜色两种方法 publicvoidsetColor intred intgreen intblue publicvoidsetColor intRRGGBB 练习熟悉Graphics对象的颜色操作 8 2图形绘制与Graphics类 20 40 19 8 2图形绘制与Graphics类 坐标系和像素在画布上绘制图形和文本 需要坐标定位 在MIDP中绘图 所使用的屏幕坐标 注 由于手机屏幕包括标题区域 内容区域和按钮区域等多个区域 因此实际绘制原点是指内容区域的左上角点 20 40 20 8 2图形绘制与Graphics类 像素 Pixel 像素是指在显示器屏幕上按 行 与 列 排列的点阵元素 像素 是一个面积的概念 每个像素的面积大小由生产工艺决定 工艺越高 每个像素面积越小 每平方英寸屏幕上就能容纳更多的像素 分辨率就越高 图像就越精细 数字图像是由许多像素构成的 每个像素都包含颜色信息和位置信息 它们决定了图像的形态与色彩 Canvas类代表的画布被划分成若干个虚拟栅格 每个栅格代表一个像素 20 40 21 8 2图形绘制与Graphics类 图形裁剪实现图形裁剪的两种方法 1 使用repaint方法2 使用专门设置剪切区的方法 publicvoidsetClip intx inty intwidth intheight 参数意义 x y为剪切区左上角的坐标 width为剪切区的宽度 height为剪切区的高度 注意 通过该方法设置的剪切区 在更新图形时 画图就只对该剪切区起作用了 20 40 22 8 2图形绘制与Graphics类 几何图形绘制绘制直线publicvoiddrawLine intx1 inty1 intx2 inty2 参数说明x1 y1 线段的起点坐标x2 y2 线段的终点坐标实例片段 在画布上绘制 十 字线classMyCanvasextendsCanvas publicvoidpaint Graphicsg g drawLine 0 getHeight 2 getWidth getHeight 2 g drawLine getWidth 2 0 getWidth 2 getHeight 20 40 23 8 2图形绘制与Graphics类 几何图形绘制填充三角形publicvoidfillTriangle intx1 inty1 intx2 inty2 intx3 inty3 参数说明x1 y1 x2 y2 x3 y3分别为三角形三个顶点的坐标实例片段 在画布的中央画填充三角形classMyCanvasextendsCanvas publicvoidpaint Graphicsg intx getWidth 2 y getHeight 2 g fillTriangle x y 30 x 30 y 30 x 30 y 30 注 MIDP没有提供绘制三角形的功能 20 40 24 8 2图形绘制与Graphics类 几何图形绘制绘制直角矩形publicvoiddrawRect intx inty intwidth intheight 填充直角矩形publicvoidfillRect intx inty intwidth intheight 参数说明x y 矩形框左上角坐标width height 矩形框的宽度和高度实例片段 填充与画布尺寸相同的直角矩形classMyCanvasextendsCanvas publicvoidpaint Graphicsg g fillRect 0 0 getWidth getHeight 清屏 20 40 25 8 2图形绘制与Graphics类 练习A在画布中央绘制指定大小的直角矩形 画游戏中的边框 classMyCanvasextendsCanvas intboardWidth getWidth 24 intboardHeight getHeight 12 publicvoidpaint Graphicsg g setColor 0 0 0 g fillRect 0 0 getWidth getHeight 清屏g setColor 255 255 255 intboardX getWidth boardWidth 2 intboardY getHeight boardHeight 2 g drawRect boardX boardY boardWidth boardHeight 20 40 26 8 2图形绘制与Graphics类 几何图形绘制绘制圆角矩形publicvoiddrawRoundRect intx inty intwidth intheight intarcWidth intarcHeight 填充圆角矩形publicvoidfillRoundRect intx inty intwidth intheight intarcWidth intarcHeight 参数说明x y 矩形框左上角坐标width height 矩形框的宽度和高度arcWidth 圆角的水平直径arcHeight 圆角的垂直直径 20 40 27 8 2图形绘制与Graphics类 RectTestCanvas画布类importjavax microedition lcdui importjavax microedition midlet publicclassRectTestCanvasextendsCanvas publicvoidpaint Graphicsg clear g g setColor 255 0 0 g drawRect 5 5 100 20 g setColor 0 255 0 g fillRect 5 30 100 20 g setColor 0 0 255 g drawRoundRect 5 55 100 20 20 20 g setColor 255 0 255 g fillRoundRect 5 80 100 20 20 20 publicvoidclear Graphicsg 把屏幕清成白色g setColor 255 255 255 g fillRect 0 0 getWidth getHeight 20 40 28 8 2图形绘制与Graphics类 几何图形绘制绘制弧形publicvoiddrawArc intx inty intwidth intheight intstartAngle intarcAngle 填充弧形publicvoidfillArc intx inty intwidth intheight intstartAngle intarcAngle 参数说明x y 创建弧的椭圆的边界矩形的左上角坐标width height 创建弧的椭圆的边界矩形的宽度和高度startAngle 起始角度arcAngle 终止角度 是相对于起始角度的增量值 20 40 29 8 2图形绘制与Graphics类 在边框中央画一个卡通形象classMyCanvasextendsCanvas intboardWidth getWidth 24 intboardHeight getHeight 12 intr 40 intdarc 22 在线程中改变这个值 嘴就会动了intxc getWidth r 2 yc getHeight r 2 在线程中改变值 就能移动了publicvoidpaint Graphicsg g setColor 0 0 0 g fillRect 0 0 getWidth getHeight 清屏g setColor 255 255 255 intboardX getWidth boardWidth 2 边框左上角intboardY getHeight boardHeight 2 g drawRect boardX boardY boardWidth boardHeight g setColor 0 x00FFFF00 g fillArc xc yc r r 0 315 darc g setColor 0 x00000000 g fillArc xc 2 r 3 yc r 4 r 7 r 7 0 360 20 40 30 8 2图形绘制与Graphics类 改变线条的样式publicvoidsetStrokeStyle intstyle 参数说明style 只能取值Griphics SOLID或Griphics DOTTED两种绘制模式实例片段 绘制实线与虚线classMyCanvasextendsCanvas publicvoidpaint Graphicsg g setColor 255 255 255 g fillRect 0 0 getWidth getHeight 清屏g setColor 255 0 0 g setStrokeStyle Graphics SOLID g drawLine 10 50 80 50 g setStrokeStyle Graphics DOTTED g drawLine 10 80 80 80 20 40 31 8 2图形绘制与Graphics类 坐标变换publicvoidtranslate intx inty 功能 将坐标原点移到 X Y 的位置 具有积累效果 publicclassMyCanvasextendsCanvas publicvoidpaint Graphicsg for inti 0 i 2 i g drawLine 50 50 150 50 g translate 0 50 垂直向下移动坐标 20 40 32 8 3文字绘制与Font类 Graphics中文字绘制的相关方法绘制字符串的使用方法 publicvoiddrawString Stringstr intx inty intanchor publicvoiddrawSubstring Stringstr intoffset intlen intx inty intanchor 绘制字符的使用方法 publicvoiddrawChar charcharacter intx inty intanchor publicvoiddrawChars char data intoffset intlength intx inty intanchor 20 40 33 8 3文字绘制与Font类 锚点的定义共有7种 分别是Graphics TOP Graphics BOTTOM Graphics LEFT Graphics RIGHT Graphics HCENTER Graphics VCENTER 文本除外 Graphics BASELINE 20 40 34 8 3文字绘制与Font类 关于锚点的实例说明g drawString 游戏暂停 50 50 Graphic TOP Graphics LEFT g drawString 游戏暂停 50 50 Graphic BOTTOM Graphics RIGHT 20 40 35 8 3文字绘制与Font类 Font类获取代表系统缺省所使用字体的Font对象 Font getDefaultFont 获取代表特定字体的对象publicstaticFontgetFont intface intstyle intsize 参数意义 外观 face 选项 Font FACE MONOSPACE Font FACE PROPORTIONAL Font FACE SYSTEM 样式 style 选项 Font STYLE BOLD Font STYLE ITALIC Font STYLE PLAIN Font STYLE UNDERLINED 尺寸 size 选项 Font SIZE SMALL Font SIZE MEDIUM Font SIZE LARGE 20 40 36 8 3文字绘制与Font类 获取系统用来显示输入用的字体以及一般常用的字体 publicstaticFontgetFont intfontSpecifier getFont 只有一个参数 只有FONT INPUT TEXT和FONT STATIC TEXT两种可供选择 Graphics中设置字体的方法 publicvoidsetFont Fontfont 20 40 37 8 3文字绘制与Font类 在画布上绘制文本classMyCanvasextendsCanvas intboardWidth getWidth 24 boardHeight getHeight 12 publicvoidpaint Graphicsg g setColor 0 0 0 g fillRect 0 0 getWidth getHeight 清屏g setColor 255 255 255 intboardX getWidth boardWidth 2 边框左上角intboardY getHeight boardHeight 2 g drawRect boardX boardY boardWidth boardHeight g translate boardX 2 boardY 2 showInfo g 游戏暂停 privatevoidshowInfo Graphicsg Stringstr g setColor 0 x0080FFFF intww boardWidth 4 12 inthh ww 2 intxx boardWidth ww 2 yy boardHeight hh 2 g fillRect xx yy ww hh g setColor 0 x00FF0000 g setFont Font getFont Font FACE SYSTEM Font STYLE PLAIN Font SIZE LARGE g drawString str boardWidth 2 boardHeight 2 Graphics HCENTER Graphics BASELINE 20 40 38 8 4图像绘制与Image类 绘制图片publicvoiddrawImage Imageimg intx inty intanchor 参数说明x y 文本显示坐标位置img 显示的图片对象anchor 锚点 用于计算图片放置的位置 打开图片文件privateImageimg null try img Image createImage gameStart png catch IOExceptione Image类提供了多种创建图像对象的方法 参见 javax microedition lcdui Image 20 40 39 8 4图像绘制与Image类 创建Image对象在游戏中因为内存的限制 通常需要经常载入图片和释放图片 每次都要多写一次trycatch语句很麻烦 为了方便 我们可以重写createImage函数 根据png图片名创建图片publicImagecreateImage StringpngName Imageimage null try image Image createImage pngName png returnimage catch Exceptione returnimage 20 40 40 8 4图像绘制与Image类 创建不变图像从命名资源创建publicstaticImagecreateImage Stringname 从字节数组中创建publicstaticImagecreateImage byte imageData intoffset intlength 从其他图像创建publicstaticImagecreateImage Imagesource 从像素数据创建publicstaticImagecreateImage Imageimage intx inty intwidth intheight inttranasform 从ARGB值创建publicstaticImagecreateImage int rgb intwidth intheight booleanprocessAlpha 20 40 41 8 4图像绘制与Image类 创建可变图像创建publicstaticImagecreateImage intwidth intheight 检测可变性publicbooleanisMutable 20 40 42 8 4图像绘制与Image类 可变图像与不可变图像之间的转换可变图像转换为不可变图像ImagemImg Image createImage 120 120 mImg可变图像ImageiImg Image createImage mImg iImg不可变图像不可变图像转换为可变图像 source为不可变图像Imagesource Image createImage logo png copy为可变图像Imagecopy Image createImage source getWidth source getHeight Graphicsgm copy getGraphics gm drawImage source 0 0 gm TOP gm LEFT 至此 copy图像的内容完全与源图像一样 并可以更改 20 40 43 8 4图像绘制与Image类 创建动态图像 在图像中绘一组直线importjava io IOException importjavax microedition lcdui Canvas importjavax microedition lcdui Graphics importjavax microedition lcdui Image publicclassMyCanvasextendsCanvas protectedvoidpaint Graphicsg Imageimage Image createImage this getWidth this getHeight 创建空动态图像Graphicsgh image getGraphics 得到图像画笔for inti 0 i this getWidth 15 i gh drawLine this getWidth 2 this getHeight i 15 0 画直线 g drawImage image 0 0 Graphics TOP Graphics LEFT 把图像绘到屏幕上 20 40 44 8 5Canvas事件处理 低级 Canvas是个低级组件 为开发人员提供了完全的界面控制能力 并提供了键盘事件和触摸屏事件等低级事件的响应能力 设备支持哪些系统事件 必须由硬件的支持程度来判断 Canvas提供了一些帮助我们判断硬件支持程度的方法 20 40 45 8 5Canvas事件处理 低级 屏幕事件处理Canvas组件是个可显示组件 具有两种屏幕状态 普通状态 默认状态 全屏幕状态利用setFullScreenMode 可以设定屏幕状态 普通状态全屏幕状态 20 40 46 8 5Canvas事件处理 低级 编程示例 CanvasTest javaimportjavax microedition lcdui publicclassCanvasTestextendsCanvasimplementsCommandListener publicCanvasTest setTitle 全屏幕测试 setTicker newTicker 走马灯 addCommand newCommand 全屏幕 Command SCREEN 1 addCommand newCommand 正常 Command SCREEN 1 setCommandListener this publicvoidpaint Graphicsg g setColor 125 125 125 g fillRect 0 0 getWidth getHeight g setColor 0 0 0 g drawLine 10 10 150 10 20 40 47 8 5Canvas事件处理 低级 publicvoidcommandAction Commandc Displayables Stringcmd c getLabel if cmd equals 全屏幕 setFullScreenMode true elseif cmd equals 正常 setFullScreenMode false protectedvoidsizeChanged intw inth System out println 改变后的宽度 w System out println 改变后的高度 h protectedvoidhideNotify System out println 屏幕被系统遮蔽 protectedvoidshowNotify System out println 屏幕显示在屏幕上 20 40 48 8 5Canvas事件处理 低级 键盘事件处理与键盘响应当Canvas的派生类成为当前画面时 只要按下任何按钮 都会引发keyPressed 方法调用 当放开按钮时 会调用keyReleased 方法 如果传入小于0的数值 通常代表不合法的keycode 按钮按下时被调用 voidkeyPressed intkeyCode 按钮连发时被调用 voidkeyRepeated intkeyCode 按钮放开时被调用 voidkeyReleased intkeyCode keyCode的值如果小于0 说明按键不合法keyReapeated 方法JTWI并没有做硬性规定 因此在编程时要用Canvas hasRepeatedEvents 方法进行侦测 JTWI规定MIDP2 0的目标设备必须支持ITU T 国际电信联盟 的电话键盘 即必须使用数字0到9 20 40 49 8 5Canvas事件处理 低级 理解键盘事件处理 为了在Canvas中处理按键事件 必须覆写Canvas的keyPressed keyReleased 和keyReapeated 这三个方法 20 40 50 8 5Canvas事件处理 低级 在这三个函数中 都有一个整型参数keyCode 表示键盘上事件发生时按键所对应的代码值 如当某个按键被按下时 keyPressed方法的参数就变成那个键所对应的键值 各个按键及其对应的值如下表所示 20 40 51 8 5Canvas事件处理 低级 20 40 52 8 5Canvas事件处理 低级 常见的功能键 其值如下表所示 20 40 53 8 5Canvas事件处理 低级 编程示例importjavax microedition lcdui importjavax microedition midlet publicclassKeyEventTestCanvasextendsCanvas booleanpressed false publicvoidpaint Graphicsg g setColor 125 125 125 g fillRect 0 0 getWidth getHeight if pressed g setColor 0 0 0 g drawLine 20 20 120 20 g drawLine 20 20 20 100 g setColor 255 255 255 g drawLine 120 20 120 100 g drawLine 20 100 120 100 else g setColor 255 255 255 g drawLine 20 20 120 20 g drawLine 20 20 20 100 g setColor 0 0 0 g drawLine 120 20 120 100 g drawLine 20 100 120 100 protectedvoidkeyPressed intkeycode pressed true repaint protectedvoidkeyReleased intkeycode pressed false repaint 20 40 54 8 5Canvas事件处理 低级 键盘响应Canvas类中定义了ITU T 国际电信联盟 标准电话键盘上每个键的代码常量 KEY NUM0 KEY NUM1 KEY NUM2 KEY NUM3 KEY NUM4 KEY NUM5 KEY NUM6 KEY NUM7 KEY NUM8 KEY NUM9 KEY STAR KEY POUND共12个 分别代表0 9的数字键 星号键以及井号键 可以利用此常量来判定事件处理函数所传入的keyCode 借以了解哪个按钮被按下 20 40 55 8 5Canvas事件处理 低级 游戏动作Canvas类定义了几个与游戏动作相关的常量 UP DOWN LEFT RIGHT FIRE GAME A GAME B GAME C GAME D 因为有了一层抽象性 在移植的时候比较方便 MIDP里提供两种方法 让程序在处理键盘时更有移植性 intgetGameAction intkeyCode intgetKeyCode intGameAction 20 40 56 8 5Canvas事件处理 低级 getGameAction intkeyCode 该函数传入keyCode 函数会回传所代表的Game键盘代码 其用法如下 publicvoidkeyPressed intkeyCode switch getGameAction keyCode caseCanvas LEFT moveLeft break caseCanvas FIRE goFire break 略 20 40 57 8 5Canvas事件处理 低级 getKeyCode intGameAction 该函数传入Game键盘代码 函数会回传所代表的keyCode 其用法如下 publicvoidkeyPressed intkeyCode if KeyCode getKeyCode Canvas LEFT moveLeft if KeyCode getKeyCode Canvas RIGHT moveRight if KeyCode getKeyCode Canvas UP moveUp if KeyCode getKeyCode Canvas DOWN moveDown if KeyCode getKeyCode Canvas FIRE goFire 20 40 58 8 5Canvas事件处理 低级 触控屏幕事件处理protectedvoidpointerPressed intx inty 手写笔在组件上按下时调用 参数x y手写笔在当前组件中的坐标 protectedvoidpointerReleased intx inty 手写笔在组件上释放时调用 参数x y手写笔在当前组件中的坐标 protectedvoidpointerDragged intx inty 手写笔在组件上按下移动时调用 参数x y手写笔在当前组件中的坐标 使用Canvas类之中的hasPointerEvents 函数查询系统是否支持触控笔事件 使用Canvas类之中的hasPointerMotionEvents 函数询问系统是否支持触控笔拖曳事件 20 40 59 8 6动画实现 处理低级事件的运行模式 20 40 60 8 6动画实现 假设我们希望系统可以同时响应用户的输入 在屏幕上绘出十字标 同时间又想在屏幕的右上角不断地绘制一个会动的图形时 就会导致两难的境地 1 想要不断绘制一个会动的图形 paint 就要进入一个无穷循环 2 想要接受用户的输入 keyPressed 和keyReleased 必须要能被调用 要完成我们的目的 就必须引入线程 20 40 61 8 6动画实现 引入线程后的Canvas运行模式 20 40 62 8 6动画实现 Canvas多线程编程 实现Runnable接口importjavax microedition lcdui importjavax microedition midlet publicclassMyGameextendsCanvasimplementsRunnable publicMyGame Threadt newThread this t start publicvoidpaint Graphicsg clear g paintAnimation g 100 10 r paintCross g x y length publicvoidclear Graphicsg 把屏幕清成白色g setColor 255 255 255 g fillRect 0 0 getWidth getHeight 20 40 63 8 6动画实现 Canvas多线程编程 实现Runnable接口intr 0 publicvoidpaintAnimation Graphicsg intx inty intl g setColor 0 0 0 g drawRect x y l l intx 50 inty 50 intlength 5 publicvoidpaintCross Graphicsg intx inty intlength g setColor 255 0 0 g drawLine x length y x length y g drawLine x y length x y length publicvoidrun while true r if r 10 r 0 repaint 20 40 64 8 6动画实现 Canvas多线程编程 实现Runnable接口protectedvoidkeyPressed intkeycode switch getGameAction keycode caseCanvas UP y y 2 break caseCanvas DOWN y y 2 break caseCanvas LEFT x x 2 break caseCanvas RIGHT x x 2 break 20 40 65 8 6动画实现 Canvas多线程编程 实现Runnable接口 运行结果 当键盘交互时 十字架移动 而右上方的方块不断变化 存在的问题 程序退出后 线程仍然在运行 想一想改进方法 20 40 66 8 6动画实现 线程的控制 使线程能够结束J2ME的Thread类没有提供结束线程的方法 当需要终止线程运行时 可以通过设置while的循环变量来进行控制实现 booleanconti true while conti 执行线程 publicvoidstop conti false 20 40 67 8 6动画实现 改进后程序importjavax microedition lcdui importjavax microedition midlet publicclassMyGameCanStopextendsCanvasimplementsRunnable CommandListener Commandstart newCommand 开始 Command OK 1 Commandstop newCommand 停止 Command STOP 1 publicMyGameCanStop addCommand start setCommandListener this publicvoidpaint Graphicsg clear g paintAnimation g 100 10 r paintCross g x y length publicvoidclear Graphicsg 把屏幕清成白色g setColor 255 255 255 g fillRect 0 0 getWidth getHeight 20 40 68 8 6动画实现 改进后程序intr 0 publicvoidpaintAnimation Graphicsg intx inty intl g setColor 0 0 0 g drawRect x y l l intx 50 inty 50 intlength 5 publicvoidpaintCross Graphicsg intx inty intlength g setColor 255 0 0 g drawLine x length y x length y g drawLine x y length x y length 20 40 69 8 6动画实现 改进后程序booleanconti true publicvoidcommandAction Commandc Displayables Stringcmd c getLabel if cmd equals 停止 conti false removeCommand stop addCommand start elseif cmd equals 开始 removeCommand start addCommand stop conti true Threadt newThread this t start 20 40 70 8 6动画实现 改进后程序publicvoidrun while conti r if r 10 r 0 repaint 20 40 71 8 6动画实现 改进后程序protectedvoidkeyPressed intkeycode switch getGameAction keycode caseCanvas UP y y 2 break caseCanvas DOWN y y 2 break caseCanvas LEFT x x 2 break caseCanvas RIGHT x x 2 break repaint 20 40 72 8 6动画实现 改进后结果按开始命令conti true newThread this start 启动线程 按停止命令conti false 结束线程 存在的问题右上角的动画绘制速度随着机器的速度变化 如果游戏的话 那就可能出现在有的机器上运行快 有的机器运行慢 想一想改进方法 20 40 73 8 6动画实现 时间控制s System currentTimeMillis r if r 10 r 0 e System currentTimeMillis diff e s System out println diff if diff rate System out println Sleep rate diff try Thread sleep rate diff catch Exceptionexc 20 40 74 8 6动画实现 改进的部分为intrate 50 每1 20秒画一次publicvoidrun longs 0 longe 0 longdiff 0 while conti s System currentTimeMillis r if r 10 r 0 e System currentTimeMillis diff e s System out println diff if diff rate System out println Sleep rate diff try Thread sleep rate diff catch Exceptionexc repaint 20 40 75 8 7游戏设计中的基本方法 程序退出的方法两种退出程序的方法 使用直接用户输入使用命令事件直接用户输入包括用户按下MID的按键和移动MID的指针 按下MID的按键使用方法 keyPressed keyRepeatedkeyReleased 移动MID的指针使用方法 pointerPressed pointerDragged pointerReleased 20 40 76 8 7游戏设计中的基本方法 使用直接用户输入退出程序publicvoidexit destroyApp true notifyDestroyed protectedvoidkeyPressed intkeyCode exit 使用命令事件退出程序privateCommandexitCommand newCommand Exit Command SCREEN 1 publicvoidcommandAction Commandc Displayabled if c exitCommand exit 20 40 77 8 7游戏设计中的基本方法 清屏的方法在MIDP的低级用户界面设计中 并没有提供清屏功能 采用的方法 在屏幕上画一个矩形将整个屏幕遮住 同时将矩形填充为屏幕的底色 例 使用白色绘制一个屏幕大小的矩形覆盖整个屏幕 g setColor 255 255 255 g fillRect 0 0 getWidth getHeight
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!