第7章游戏编程(1)ppt课件_第1页
第7章游戏编程(1)ppt课件_第2页
第7章游戏编程(1)ppt课件_第3页
第7章游戏编程(1)ppt课件_第4页
第7章游戏编程(1)ppt课件_第5页
已阅读5页,还剩59页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

.,1,本课教学内容,JavaME针对游戏开发提供了一些功能强大的API。从这章开始,针对游戏开发介绍一些类。游戏画布GameCanvas图层LayerSpriteTitleLayer图层管理LayerManager,.,2,游戏开发介绍,游戏画布:展示游戏场景的界面。-GameCanvas图层:游戏中某个可视的物体。-Layer游戏精灵:游戏中可以运动的角色。-Sprite游戏场景:游戏静态背景,如地图。-TileLayer图层管理:解决多个图层管理,保证图层能够自动在正确的区域,以正确的顺序被绘制。-LayerManager,.,3,.,4,javax.microedition.lcdui.game树型图如图所示:,游戏开发介绍,.,5,GameCanvas类,GameCanvas类提供了基本的游戏用户接口,为游戏提供基本的屏幕功能,可以充满整个界面,也可以在上面进行画图,支持按键和指针事件等,同时还提供了游戏专用的功能,如:查询当前游戏键状态的能力,同步图像输出等。,.,6,GameCanvas类,GameCanvas类的定义为:publicabstractclassGameCanvasextendsCanvasGameCanvas类是抽象类,所以必须派生新类。,.,7,GameCanvas类基本开发流程,获得画笔,绘制图形,显示在屏幕上,获得游戏画布对象,.,8,设计流程,创建一个Midlet手机应用程序,创建一个Display手机屏幕对象,创建一个游戏画布对象,将该画布对象添加到手机屏幕上,创建一个游戏画布上的画笔对象,利用画笔对象的绘图方法绘图,.,9,GameCanvas类之构造方法,GameCanvas类构造方法有1个:ProtectedGameCanvas(booleansuppressKeyEvents)GameCanvas类的构造方法里有一个boolean参数。,.,10,GameCanvas类之构造方法,这个参数的意义是:可以确定特殊键(上下左右键和选择键以及键盘上的1、3、7、9键)是否被禁用,如果为true,表示禁用,如果为false,表示不禁用。,.,11,GameCanvas类之构造方法,在前面讲解了GameCanvas的构造函数的参数问题,这个参数在实际开发的过程中,选用true还是false呢?答案是选择true。选择了true,不是功能键会被禁用吗?不用担心,GameCanvas类有一个重要函数getKeyStates()。,.,12,publicintgetKeyStates()该函数在特殊键被禁用时,可以得到特殊当前被按下的键的状态。这样虽然禁用了特殊键,但通过getKeyStates函数,反而解放了特殊键(上下左右键和选择键以及键盘上的1、3、7、9键),而屏蔽了其他键,让游戏中的键盘判断能够很好地移植到线程中去执行。,GameCanvas类之构造方法,.,13,游戏画布之键盘策略,getKeyStates函数的返回值和键盘上功能键之间的对应关系如下表所示:,.,14,一般情况下,可以用如下方法查询某个键是否被按下:方法1:if(this.getKeyStates()=某个返回值);如下代码:判断“1”键是否被按下。,if(this.getKeyStates()=512)/或者if(this.getKeyStates()=GameCanvas.GAME_A_PRESSED),游戏画布之键盘策略,.,15,方法2:if(this.getKeyStates()privateImagespriteImage;tryspriteImage=Image.createImage(“/npc01.png”);catch(Exceptione)sprite=newSprite(spriteImage);,.,28,构造函数2:publicSprite(Imagei,intframeWidth,intframeHeight):将一幅图片封装至Sprite对象,并分割。该构造函数用于创建带动画的Sprite,将在后面讲解。,Sprite类的构造函数,.,29,privateSpritesprite;privateImagespriteImage;tryspriteImage=Image.createImage(“/npc01.png”);catch(Exceptione)sprite=newSprite(spriteImage,32,48);,示例:创建Sprite对象,.,30,构造函数3:publicSprite(Sprites):将另一个Sprite封装至Sprite对象,该构造函数使用较少。很明显,第一个构造函数使用较多。,Sprite类的构造函数,.,31,Sprite常用函数,将Sprite画到界面上去的函数:publicfinalvoidpaint(Graphicsg)设置Sprite左上角的横纵坐标位置:publicvoidsetPosition(intx,inty)移动Sprite,dx为正,表示右移,dy为正,表示下移:publicvoidmove(intdx,intdy),.,32,示例,Imageimg=Image.createImage(“/img1.png”);Sprites=newSprite(img);s1.setPosition(0,0);/初始位置在左上角s.move(-1,-1);表示将Sprite对象s向左上移动1个象素位置,.,33,很多游戏中的角色还有碰撞的效果。如飞机遇到子弹之后就爆炸,汽车撞到墙等等,实际上是一个碰撞的问题。那么怎样知道两个物体碰撞了呢?在Sprite中,对碰撞检测也具有一定的支持。,碰撞检测,.,34,Sprite的碰撞检测可以分两种:一种是矩形碰撞检测,另一种是像素碰撞检测。游戏中Sprite的大小往往是用包围它的矩形的大小来表示的,如图3中的飞机和导弹并没有发生碰撞但检查的结果却发生了碰撞。矩形碰撞检测:只要两个Sprite默认的碰撞边界相交,就被判定为发生碰撞。,碰撞检测,.,35,图3矩形碰撞检测,碰撞检测,.,36,对于像素碰撞检测,往往把Sprite的背景色设置为相同的颜色,碰撞检查的时候就只判断两个图片除背景色以外的其他像素是否发生了重叠。像素碰撞检测比较精确,但计算复杂,浪费大量的系统资源,所以一般没有特殊要求都使用矩形碰撞检测。,碰撞检测,.,37,下面的例子两个矩形发生了碰撞但飞机和导弹并没有发生碰撞,如图4所示。,图4像素碰撞检测,碰撞检测,.,38,Sprite里面有一个重要函数:publicvoiddefineCollisionRectangle(intx,inty,intwidth,intheight)该函数在Sprite上定义一个矩形区域,如果其他Sprite或者图片的像素点进入了这个区域,则视为碰撞。此指定的矩形是相对于未经变换的Sprite的左上角。,碰撞检测定义碰撞区域,.,39,要判断两个Sprite是否碰撞,或者与其他Layer是否碰撞,可以使用collidesWith()方法。collidesWith()共有三种形式:,怎样得知两个角色是否碰撞了呢?,碰撞检测判断是否碰撞,.,40,(1)publicfinalbooleancollidesWith(Sprites,BooleanpixelLevel)很明显,该函数的第一个参数是被检测的碰撞对象;第二个参数是一个boolean类型,意义如下:如果为true,则认为两个Sprite上不透明点发生了重叠,就算碰撞,即像素检测;如果为false,则认为两个Sprite所在矩形区域发生了重叠,就算碰撞,即矩形检测。,碰撞检测判断是否碰撞,.,41,(2)publicfinalbooleancollidesWith(TitledLayert,BooleanpixelLevel)该函数参数1表示和Sprite进行碰撞检测的TiledLayer,关于TiledLayer我们将在下一章进行讲解;参数2和前面所述相同。,碰撞检测判断是否碰撞,.,42,(3)publicfinalbooleancollidesWith(Imageimage,intx,inty,BooleanpixelLevel):检测一个精灵和一个图片是否发生碰撞。x,y是图片左上角的横坐标和纵坐标。,碰撞检测判断是否碰撞,.,43,Sprite旋转,刚才已经讲述了Sprite的生成,但是,图片在界面上运行的时候,是平移的。实际上,很多游戏中的角色还有旋转的效果。如一块石头飞出去,边飞边旋转,就可以用旋转的效果做到。,.,44,Sprite对旋转具有较好的支持。打开文档,找到javax.microedition.lcdui.game.Sprite,里面有一个重要函数:publicvoidsetTransform(inttransform)参数是一个整数,决定旋转的方向。旋转方向有如下几种:1:Sprite.TRANS_NONE:不旋转。,Sprite旋转,.,45,2:Sprite.TRANS_ROT90:旋转90度。3:Sprite.TRANS_ROT180:旋转180度。4:Sprite.TRANS_ROT270:旋转270度。5:Sprite.TRANS_MIRROR:镜像。6:Sprite.TRANS_MIRROR_ROT90:镜像,然后旋转90度。7:Sprite.TRANS_MIRROR_ROT180:镜像,然后旋转180度。8:Sprite.TRANS_MIRROR_ROT270:镜像,然后旋转270度。,Sprite旋转,.,46,刚才的图片实际上是绕着其左上角旋转的。为什么会出现这种效果呢?那是因为Sprite在画到界面上时,其位置确定是以其左上角的横纵坐标为准。但是在实际项目中,有时候我们不一定要让左上角坐标作为参考点,比如在旋转时,我们希望图片绕着其中心旋转,或者一片树叶绕其悬挂点飘动。,Sprite旋转,.,47,悬挂点,图1取Sprite上参考像素点作为悬挂点定义悬挂点,Sprite的定义悬挂点,.,48,Sprite里面有一个重要函数来定义悬挂点:publicvoiddefineReferencePixel(intx,inty)参数是2个整数,表示在Sprite上取一点作为悬挂点,(x,y)是悬挂点在Sprite上的位置,是图像上的悬挂点的坐标。,Sprite的定义悬挂点,.,49,例:如果取Sprite中心作为悬挂点,那就可以取x为Sprite宽度的一半,y为Sprite高度的一半。s.defineReferencePixel(s.getWidth()/2,s.getHeight()/2);,Sprite的定义悬挂点,.,50,Sprite的定义悬挂点,图2参考像素点被定位在树枝末端,.,51,可以通过以下函数,将悬挂点定位在界面的(x,y)位置,画出这个Sprite。publicvoidsetRefPixelPosition(intx,inty)定义的是界面上的坐标。例:s.setRefPixelPosition(30,30);表示将悬挂点定位在屏幕上的(30,30)位置,画出这个Sprite,Sprite的定义悬挂点,.,52,带动画的Sprite,前面所讲述的Sprite,虽然可以运动,但是其内部的图片本身是一成不变的,也就是说,Sprite内部没有动画效果。实际上,很多游戏中的角色还有自身动画的效果。带动画的Sprite在运行的过程之中,实际上相当于按照顺序载入不同的图片。,.,53,Sprite对动画具有一定的支持。如一只蚊子在移动的过程中,翅膀在拍打,就可以使用带动画的Sprite做到。界面上一个蚊子,在移动的过程中,翅膀也在不断拍打,其拍打的一个周期有4个动作,周而复始,带动画的Sprite,.,54,如案例中的蚊子,翅膀拍打4次,需要有4幅图片。那么这时传入的图片怎么确定呢?方法是,将这4幅图片放在一幅大图片里面一起传过来。,带动画的Sprite,.,55,带动画的Sprite,使用Sprite类可以可以读取一个存储完整动画的大图片,然后把这个大图片按照动画的每一帧分割为一个个小图片,并且把它们按照一定的顺序存储在数组里面,然后在屏幕上显示出来其中的一个小图片,如果连续的更换显示的小图片,则屏幕上表现为一个完整的动画效果。,.,56,带动画的Sprite,Spirte类分割一个大的原始图片是有一定的规则的:从左到右、从上到下的按行循序分割图片的,分割后的小图片按照分割顺序被分配一个整数作为分割后的图片序号,从0开始。,.,57,带动画的Sprite,图8-8分割图片,序号分配情况,.,58,Sprite类开发,序号分配情况,.,59,带动画的Sprite,Sprite中有一个较复杂的构造函数:publicSprite(Imageimage,intframeWidth,intframeHeight)参数1是一个Image对象,表示Sprite封装的图片。参数2和参数3确定了单帧的宽度和高度。注意:如果整幅图片的宽度和高度不是单帧宽度和高度的整数倍,则会抛异常。,.,60,带动画的Sprite,案例图片如图:该图片传入之后,系统使用第2、3个参数将其分为4帧。参数2、3决定了单

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论