您好,欢迎访问三七文档
当前位置:首页 > 机械/制造/汽车 > 制造加工工艺 > 第7章游戏编程(1)
手机游戏开发本课教学内容JavaME针对游戏开发提供了一些功能强大的API。从这章开始,针对游戏开发介绍一些类。游戏画布—GameCanvas图层—LayerSpriteTitleLayer图层管理—LayerManager手机游戏开发游戏开发介绍游戏画布:展示游戏场景的界面。--GameCanvas图层:游戏中某个可视的物体。--Layer游戏精灵:游戏中可以运动的角色。--Sprite游戏场景:游戏静态背景,如地图。--TileLayer图层管理:解决多个图层管理,保证图层能够自动在正确的区域,以正确的顺序被绘制。--LayerManager手机游戏开发手机游戏开发javax.microedition.lcdui.game树型图如图所示:游戏开发介绍手机游戏开发GameCanvas类GameCanvas类提供了基本的游戏用户接口,为游戏提供基本的屏幕功能,可以充满整个界面,也可以在上面进行画图,支持按键和指针事件等,同时还提供了游戏专用的功能,如:查询当前游戏键状态的能力,同步图像输出等。手机游戏开发GameCanvas类GameCanvas类的定义为:publicabstractclassGameCanvasextendsCanvasGameCanvas类是抽象类,所以必须派生新类。手机游戏开发GameCanvas类基本开发流程获得画笔绘制图形显示在屏幕上获得游戏画布对象手机游戏开发设计流程创建一个Midlet手机应用程序创建一个Display手机屏幕对象创建一个游戏画布对象,将该画布对象添加到手机屏幕上创建一个游戏画布上的画笔对象利用画笔对象的绘图方法绘图手机游戏开发GameCanvas类之构造方法GameCanvas类构造方法有1个:ProtectedGameCanvas(booleansuppressKeyEvents)GameCanvas类的构造方法里有一个boolean参数。手机游戏开发GameCanvas类之构造方法这个参数的意义是:可以确定特殊键(上下左右键和选择键以及键盘上的1、3、7、9键)是否被禁用,如果为true,表示禁用,如果为false,表示不禁用。手机游戏开发GameCanvas类之构造方法在前面讲解了GameCanvas的构造函数的参数问题,这个参数在实际开发的过程中,选用true还是false呢?答案是选择true。选择了true,不是功能键会被禁用吗?不用担心,GameCanvas类有一个重要函数getKeyStates()。手机游戏开发publicintgetKeyStates()该函数在特殊键被禁用时,可以得到特殊当前被按下的键的状态。这样虽然禁用了特殊键,但通过getKeyStates函数,反而解放了特殊键(上下左右键和选择键以及键盘上的1、3、7、9键),而屏蔽了其他键,让游戏中的键盘判断能够很好地移植到线程中去执行。GameCanvas类之构造方法手机游戏开发游戏画布之键盘策略getKeyStates函数的返回值和键盘上功能键之间的对应关系如下表所示:手机游戏开发一般情况下,可以用如下方法查询某个键是否被按下:方法1:if(this.getKeyStates()==某个返回值);如下代码:判断“1”键是否被按下。if(this.getKeyStates()==512){}//或者if(this.getKeyStates()==GameCanvas.GAME_A_PRESSED){}游戏画布之键盘策略手机游戏开发方法2:if((this.getKeyStates()&某个返回值)!=0)。如下代码:判断“1”键是否被按下。if((this.getKeyStates()&512)!=0){}//或者if((this.getKeyStates()&GameCanvas.GAME_A_PRESSED)!=0){}游戏画布之键盘策略手机游戏开发游戏画布之画图策略游戏都是丰富多彩的,在游戏界面上经常会出现动画、键盘控制等。动画的运行是持续性的,相当于每隔一段时间在画布的不同位置重画图形。在游戏画布中,这个过程可以用多线程来实现。所以,结合动画开发策略,基于游戏画布的动画线程的结构一般采用以下方法:手机游戏开发游戏画布之画图策略GameCanvas类有一个函数:该函数可以直接得到画布上的画笔,直接画图。GameCanvas类和Graphics类的关系就是画布和画笔的关系。我们使用Graphics类可以在屏幕上绘制图片、线条、文字等多种低级别的界面来。手机游戏开发注意:画好的图放在内存里面,如果要在界面上显示,则还需要调用:该函数的作用是将内存缓冲内画好的图在界面上显示。游戏画布之画图策略手机游戏开发图层游戏画布只提供游戏运行的平台,对于游戏的开发来说,还远远不够。在JavaME中,还提供了更为强大的支持,那就是图层。打开javax.microedition.lcdui.game包,会发现里面有一个重要的类:Layer。手机游戏开发Layer意为图层,可以表示画布上的某个可视的物体,是抽象类,一般情况下我们可以扩展它。在GameAPI中,提供了两个子类:javax.microedition.lcdui.Sprite:图层的子类,可以充当游戏中的运动角色,如子弹、汽车等。javax.microedition.lcdui.TiledLayer:图层的子类,可以充当游戏中的静态角色,如环境角色、地图等。图层手机游戏开发图层Layer类具有如下重要功能:1:将图层中内容画到g所在的画布上:2:得到图层的宽度:3:得到图层的高度:手机游戏开发图层4:得到图层的左上角坐标:5:将图层左上角移动到画布上的某个位置:手机游戏开发图层6:移动图层,dx表示向右移动的像素个数,dy表示向下移动的像素个数,如果为负值,则方向相反:7:设置让图层显示或隐藏:手机游戏开发Sprite类简介Sprite:游戏精灵,是Layer的子类,也具有Layer的所有功能。Sprite用来实现人物动画、移动和碰撞检测。Sprite类还提供了分割图片的功能。手机游戏开发设计流程创建一个Midlet手机应用程序创建一个Display手机屏幕对象创建一个游戏画布对象,将该画布对象添加到手机屏幕上创建一个游戏画布上的画笔对象创建Sprite精灵对象,设置精灵的初始位置添加手机游戏开发Sprite类的构造函数构造函数1:publicSprite(Imageimage):将一幅图片封装至Sprite对象。其参数是一个Image对象,表示Sprite封装的图片,如子弹、汽车、飞机等。手机游戏开发示例:创建Sprite对象privateSpritesprite;privateImagespriteImage;try{spriteImage=Image.createImage(“/npc01.png”);}catch(Exceptione){}sprite=newSprite(spriteImage);手机游戏开发构造函数2:publicSprite(Imagei,intframeWidth,intframeHeight):将一幅图片封装至Sprite对象,并分割。该构造函数用于创建带动画的Sprite,将在后面讲解。Sprite类的构造函数手机游戏开发privateSpritesprite;privateImagespriteImage;try{spriteImage=Image.createImage(“/npc01.png”);}catch(Exceptione){}sprite=newSprite(spriteImage,32,48);示例:创建Sprite对象手机游戏开发构造函数3:publicSprite(Sprites):将另一个Sprite封装至Sprite对象,该构造函数使用较少。很明显,第一个构造函数使用较多。Sprite类的构造函数手机游戏开发Sprite常用函数将Sprite画到界面上去的函数:publicfinalvoidpaint(Graphicsg)设置Sprite左上角的横纵坐标位置:publicvoidsetPosition(intx,inty)移动Sprite,dx为正,表示右移,dy为正,表示下移:publicvoidmove(intdx,intdy)手机游戏开发示例Imageimg=Image.createImage(“/img1.png”);Sprites=newSprite(img);s1.setPosition(0,0);//初始位置在左上角s.move(-1,-1);表示将Sprite对象s向左上移动1个象素位置手机游戏开发很多游戏中的角色还有碰撞的效果。如飞机遇到子弹之后就爆炸,汽车撞到墙等等,实际上是一个碰撞的问题。那么怎样知道两个物体碰撞了呢?在Sprite中,对碰撞检测也具有一定的支持。碰撞检测手机游戏开发Sprite的碰撞检测可以分两种:一种是矩形碰撞检测,另一种是像素碰撞检测。游戏中Sprite的大小往往是用包围它的矩形的大小来表示的,如图3中的飞机和导弹并没有发生碰撞但检查的结果却发生了碰撞。矩形碰撞检测:只要两个Sprite默认的碰撞边界相交,就被判定为发生碰撞。碰撞检测手机游戏开发图3矩形碰撞检测碰撞检测手机游戏开发对于像素碰撞检测,往往把Sprite的背景色设置为相同的颜色,碰撞检查的时候就只判断两个图片除背景色以外的其他像素是否发生了重叠。像素碰撞检测比较精确,但计算复杂,浪费大量的系统资源,所以一般没有特殊要求都使用矩形碰撞检测。碰撞检测手机游戏开发下面的例子两个矩形发生了碰撞但飞机和导弹并没有发生碰撞,如图4所示。图4像素碰撞检测碰撞检测手机游戏开发Sprite里面有一个重要函数:publicvoiddefineCollisionRectangle(intx,inty,intwidth,intheight)该函数在Sprite上定义一个矩形区域,如果其他Sprite或者图片的像素点进入了这个区域,则视为碰撞。此指定的矩形是相对于未经变换的Sprite的左上角。碰撞检测—定义碰撞区域手机游戏开发要判断两个Sprite是否碰撞,或者与其他Layer是否碰撞,可以使用collidesWith()方法。collidesWith()共有三种形式:怎样得知两个角色是否碰撞了呢?碰撞检测—判断是否碰撞手机游戏开发(1)publicfinalbooleancollidesWith(Sprites,BooleanpixelLevel)很明显,该函数的第一个参数是被检测的碰撞对象;第二个参数是一个boolean类型,意义如下:如果为true,则认为两个Sprite上不透明点发生了重叠,就算碰撞,即像素检测;如果为false,则认为两个Sprite所在矩形区域发生了重叠,就算碰撞,即矩形检测。碰撞检测—判断是否碰撞手机游戏开发(2)publicfinalbooleancollidesWith(TitledLayert,BooleanpixelLevel)该函数参数1表示和Sprite进行碰撞检测的TiledLayer,关于TiledLayer我们将在下一章进行讲解;参数2和前面所述相同。碰撞检测—判断是否碰撞手机游戏开发(3)publicfinalbooleancollidesWith(Imageimage,intx,inty,BooleanpixelLevel):检测一个精灵和一个图片是否发生碰撞。x,y是图片左上角的横坐标和纵坐标。碰撞检测—判断是否碰撞手机游戏开发Sprite旋转刚才已经讲述了Sprite的生成,但是,图片在界面上运行的时候,是平移的。实际上,很多游戏中的角色还有旋转的效果。如一块石头飞出去,边飞边旋转,就可以用旋转的效果做到。手机游戏开发Sprite对旋转具有较好的支持。打开文档,找到javax.microedition.lcdui..game.Sprite,里面有一个重要函数:publicvoidsetTransform(inttr
本文标题:第7章游戏编程(1)
链接地址:https://www.777doc.com/doc-3257250 .html