项目第二天上午_第1页
项目第二天上午_第2页
项目第二天上午_第3页
项目第二天上午_第4页
项目第二天上午_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

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

文档简介

设置速度.这里的原理与坦克移动的原理类似.即在子弹类的draw()中,改变坐标位置.2publicvoiddraw()intxgetX();intyStringpath="";switch(code){casey=Config.SPEED_BULLET;修改坐标path="res\\img\\bullet_u.gif";caseDirection.MOVE_DOWN:y=Config.SPEED_BULLET;path=caseDirection.MOVE_LET:x=Config.SPEED_BULLET;path="res\\img\\bullet_l.gif";caseDirection.MOVE_Rxpath="res\\img\\bullet_r.gif";try{DrawUtils.draw(path,getX(),3}catch(OExceptione)}}了,造成这个现象的原因是,在自定义窗口类的onKeyEvent(intkey)方法中,caseKeyboard.KEY_RETURN:bullet=了.因此,我们需要一个容器来存放每次按下回车键时生成的子弹对象.caseKeyboard.KEY_RETURN:bullet=tank.shot();然后在自定义窗口类 方法中,遍历容器并将元素绘制上去protectedvoid{for(Elementelement:{接下来我们需要对子弹发射的频率做处理,即限制每秒钟最多发射几颗子弹.原理是将上次发射间隔,就发射子弹,并将当前时间赋值给上次发射时间.privateprivatelonglastShotTime;//第二步,在坦克类 方法中,判断间隔时间,从而决定是否发射子publicBulletlongcurrentShotTime=returnlastShotTime=currentShotTime;//returnnewlastShotTimeConfig.TME_NTERVAL){//由于不发射时返 值,为了防止空指针异常,需要在自定义窗口onKeyEvent(int onKeyEvent(intcaseKeyboard.KEY_RETURN:bullet=tank.shot();大,这样是不太合理的.因此我们需要对子弹进行销毁.子弹销毁的时机是越界的一瞬间.因此,我们可以在子弹类中定义一个销毁的方 ,用于判断子弹是否被销毁publicisDestroy(){intx=super.getX();inty=DTH_SCREEN){return}elseif(xConfig.HEGHT_BULLET<0){returntrue;}elseif(y>Config.HEGHT_SCREEN){returntrue;}elseif(yConfig.HEGHT_BULLET<0){returntrue;return接下来,在自定义窗口类的 方法中,当绘制完成后,遍历集合,如果子弹应该被销毁,则将集合中的元素进行移除.这里推荐一个不会发生并发修改异常的集 ,使用方式 protectedvoidonDisplayUpdate()for(Elementif(einstanceof Bulletbullet=(Bullet) 类中定义渲染级别的常publicpublicstaticfinalintLEVEL_RENDER_0= publicstaticfinalint =在父 中定义获取渲染级别的方法,默认情况下返publicintreturn 方法,将渲染级别定义在自定义窗口类的onDisplayUpate()方法中,在绘制动作发生前,调 集 方法,传入比较 ,为集合进行排protectedvoid{list.sort(newComparator<Element>(){publicintcompare(Elemente,Elemente2)returne.getOrdere2.getOrder();//自然排序即级别高的后画级别低的先画在子弹 中,定义一个方法,用来判断子弹是否与钢墙发生了碰super.getX(),Config.WDTH_BULLET,Config.HEelement.getX(),Config.WDTH_STELL,Config.HE onDisplayUpateprotectedvoidonDisplayUpdate()e:list){instanceofBullet&&e2instanceofSteel){Bulletbullet=(Bullet)e;if(bullet.isHit(e2)){//如果发生碰撞就让子弹销毁Keepinmind定义爆炸 类,继 中,定义一个爆炸方 ,计算爆炸物坐标,并返回爆炸物对publicBlastintx_blast=super.getX()inty_blast=Config.WConfig.HEreturnnewBlast(x_blast, 方法中,如果子弹与钢墙发生了碰撞,就调用钢墙对 方法,返回爆炸物对象并添加到集合中.protectedvoidonDisplayUpdate().//在这里发生了碰撞,Blastblast=}}}}}publicstaticfinalString[]PATHS_BLAST{"res\\img\\blast_.gif",

publicvoiddraw()i=0;i<Config.PATHS_BLAST.length;i){try{DrawUtils.draw(Config.PATHS_BLAST[i],getX(),getY());}catch(OException{draw(加,因此看不到动画效果. ,用于记录索privateintprivateintdraw(publicvoiddraw()Stringpath=;//每次画完后都将索引加,if(index==Config.PATHS_BLAST.length){//为了防止越界,数组最后一个元素时,index=tryDrawUtils.draw(path,getX(),}catch(OException{ privateprivatebooleanisinish=is 方法中判断,如果此时已经播放到最后一张图片,需要将该成员变量重新赋ispublicvoiddraw()Stringpath=Config.PATHS_BLAST[index];index=isinishtrue;//此时代表播放完毕,将isinish置为tryDrawUtils.draw(path,getX(),}catch(OException{ 类中定义销毁的方法,该方法的返回值依赖publicbooleanisDestroy(){returnis在自定义窗口类 protectedvoidonDisplayUpdate()for(intElementelement=if(elementinstanceofBlast){//判断是否为爆炸物对象Blastblast=(Blast)element;我们发现,此时子弹与爆炸物都定义的有销毁的方法,而销毁功能属于扩展功能,因此不能在父 中定义,而应该定义成接口.因为接口体现的是体系的扩展功能,而父类则体现的是

publicinterfaceDestroyablepublicabstractboolean让子弹与爆炸物都实现该接口,优化自定义窗口类 方法,将两

}} publicpublicstaticfinalintBLOOD_STEEL=在钢墙 中定义血量的成员变privateprivateintblood=在钢墙类 方法中,每次被攻击,都需要减少一滴; 让钢墙类实现Destroyablepublicboolean{return和实现钢墙的爆炸类似,能,因此我们需要抽取出一个接口publicinterface{publicabstractpublicpublicclassSteelextendsElementimplementspublicclassWallextendsElementimplements修改子弹 的撞击方 ,将参数改 类publicbooleanisHit(BeAttackablee)优化自定义窗口类 中的代Blastblast=.}}}}8没被摧毁时,播放4张图片,墙体被摧毁时,再播放8张图片.为了实现这个效果,我们需要在爆炸物 类中定义一个成员变量,用于记录墙体是否被摧毁 privateprivateboolean接着,在爆炸 类中的构造方法增加一个参数,用于给成员变量赋publicBlast(intx,inty,booleanisDie){super(x,y); D D 接着,在爆炸物 方法中,根据状态决定是画4张图片还是画8张图}}else{//如果墙体没有被销毁,就播放4if(index==Config.PATHS_BLAST.length.index=isinish=}}tryDrawUtils.draw(path,getX(),}catch(OExceptione)}2}

方法里,根据当前血量是否为0去创建不同publicBlastbeAttack(){intx_blast=inty_blast=Config.WConfig.HEif(this.blood==0){//如果血量为0,就将isDie的状态置为returnnewBlast(x_blast,}else{//否则,将isDie的状态置为returnnewBlast(x_blast,

,在发生碰撞时,根据图形分析的结论重publicbooleanisHit(Element{intx=getX();//获取坦克横坐intygetY();//获取坦克纵坐booleanflagsuper.getY(),Config.WConfig.HEe.getX(),e.getY(),Config.WConfig.HE(flag//当发生碰撞时y=e.getY()caseConfig.HEy=caseDirection.MOVE_LEConfig.HEcaseDirection.MOVE_Rx= 2}//最后,}return3}Tanktank=(Tank)eSteelsteel=(Steel)}.}}}

publicpublicinterfaceBlockablepublicclasspublicclassSteelextendsElementimplements}publicclassWallextendsElementimplements}publicclassWaterextendsElementimplementsTank

温馨提示

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

评论

0/150

提交评论