版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
人机交互实验 骰子来袭一.系统使用说明:本次实验是在win7系统下的android的平台进行的。Eclipse系统没有自带的UML图生成插件,所以将ModleGoon插件下载到eclipse文件夹下的dropins文件夹中,重新启动eclipse后,可以在file—>new—>other打开的窗体看到ModleGoonDigrams的显示,其中包含三种类型的文件:ClassDigrams,InteractionDigrams,以及PackgeDependenciesDigrams。由于生成图是只需要显示类之间的关系即可,所以用ClassDigrams即可。关于eclipse系统的简介:Eclipse是一个开放源代码的、基于Java的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。幸运的是,Eclipse附带了一个标准的插件集,包括Java开发工具(JavaDevelopmentKit,JDK)。关于Android系统的简介:Android是Google于2007年11月05日宣布的基于Linux平台的开源移动操作系统的名称,该平台由操作系统、中间件、用户界面和应用软件组成。它采用软件堆层的架构,主要分为三部分。底层以Linux内核工作为基础,由C语言开发,只提供基本功能;中间层包括函数库Library和虚拟机VirtualMachine,由C++开发。最上层是各种应用软件,包括通话程序,短信程序等,应用软件则由各公司自行开发,以Java作为编写程序的一部分。二.实验要求:根据已有的安卓框架和程序包,运行程序,经过漫长等待可以看到安卓系统的开机界面,运行其中的Cube_OpenGl图标的应用程序,可以看到一个很可爱的骰子,在鼠标的控制下可以实现旋转。而本次实
验的任务就是让这个骰子还可以实现移动和放缩的功能,虽然功能简单但是对于不熟悉android系统的我们是一个不轻松的任务。三.实验整体架构在这个骰子游戏的构造中,共定义了两个包:1.src文件夹下的com.macrocheng.cubeopengl:1)GLTutorialBase类;2)GLTutorialCube类3)MainActivity类;4)ViewAnimator类;2.gen文件夹下的com.macrocheng.cubeopengl:(1)BuildConfig类;(2)R类;这两个包及类中的关系可以用UML类图表示如下:GLTutorial匚uhm-rnode:intwjcflcidt~_y;float-bmp;Elitm日p[]-braH[];float-cubeBuff:FloatBuff日[]-flagont-|ightAinbierit[]:float~lightt>iffuEe[]^flojt-lightPos:float[]-m3tAmbi&nt[]:flo3t«matDiffu5e[]:float~num;float~tei;int-texBuff;FIc細uffer[]-texCocrds[][]:flca七-trmp_tex:int[]-xra-tiflcatratfloat+onT□uchEvent[MotionEventjiboole-anGLTutorialBase类:该类作为GLTutorialCube的父类,继承了SurfaceView类,并实现了SurfaceHolder.Callback和Runnable接口,根据资料可知其中接口SurfaceHolder.Callback被用来接收摄像头预览界面变化的信息,而Runnable接口用来实现多线程。而类中的方法可以在类图中看到,而每个类的方法的作用,在源程序中均有备注,此处不再赘述。GLTutorialCube类:该类继承了GLTutorialBase类,本次实验的关键代码就在于此。类中设臵了环境光和漫反射光的数组作为照明模型,分别用matAmbient和matDiffuse两个数组表示。用一个二维数组box来构建在空间坐标系的正方体骰子,骰子有6个面,用6个二维数组元素表示,每个面用面的4个顶点表示,顶点则是用x,y,z三个坐标表示。但在手机屏幕上只有x,y两个坐标系,所以用二维数组texCoodrs来记录六个面在屏幕上的分布情况,同样6个面,每个面用4个点表示,每个点用x,y表示。用位图数组来记录六个面的图片。而后初始化游戏界面。下面重点介绍关于旋转,平移,缩放的代码部分:首先用一下代码来重定位坐标系:gl・glLoadldentity();0,03戈0,0.陽% 0);旋转:使用opengl的方法glRatatef()来控制x,y方向上的旋转:gl.glRotatef(-xrotj1}0,0);gLglRotatef(-yrotj1?0);其中xrot和yrot是在x,y上的旋转角,之所以取负,是因为这样才可以保持旋转方向和手势方向一致。Xrot和yrot由以下代码计算:if(flag==1)x-ro-t+=2.0fjif(flag==2}Knot--2.0f;elseif(flag==3}yro-1十=2.0f;if(flag==4)yrot-=2.0fjif(flag==1||flag==2))(xrot5£90j==6)flag二0;if(flag-==M||flag==4)if((in±)rot%90)--&)平移:使用glopengl的glTranslated()方法实现平移其中distance表示在x,y方向上的偏移量,distance的计算如下:distance=event・getX(J-_x ;distance=event・getY()-_y ;_x,_y是在之前手指触摸到屏幕时就记录下的坐标点,当手指移动一定距离后使用event.getX()和event.getY()来获得当前手指所在位臵坐标,然后取二者之差,即可得到偏移量。放缩:使用glopengl的glScalef()方法实现放缩:gl.glScalef(numjnuntjnum);其中num表示在x,y方向上的放缩倍数,num的计算如下:
num=(newDist/oldDist);oldDist=mewDist;其中oldDist表示在手指移动前,两手指间的距离;而newDist表示在手指移动后两手指间的距离,所以两距离的比值可以用作放缩倍数至于屏幕上有几个手指触摸屏幕可以用变量mode来计数和判断:publicbooleanonTouchEvent(finalMotioriEven±even七){flea七oldDist=05suitch(event-getA匚tiernq)&MotionEvent.ACTION^W.SK'){case^otionEvent.^CTLON_Dmode-L-//mode用来计数当前荷几牛点鯉控_k=event.且已七只])]_y=event.getY();break-caseM口匕“REn匕MDXW—DP:"当屏幕上唯—的点祝議开时飙岌mode=B;b户sak•caseMotionEvent.ACTION_POIhfTER_UPz//当屏幕上有毛傑誠按住,松开其中一平点时融岌mode-=1;break;caseMotionEvent.ACTLON_POINTER_DO^-.〃当屏幕上已经有一个.点複按住,此时再按下其他乏时融oldDist=spacing(event}^氓得剛刚触摸屏幕的两手指间匙离mode+=1;break:caseMotionEvent.>4(77™問DVF:yrot十二(_xyrot十二(_xnnot*[yevent.getX())/20'event.getY())/2@jif(modeif(mode==2)£//有两个以上触控点floatnewDist
if(newDist>=spacxng(event)joldDist+1)num=[newDist/oldDist);oldDist=newD-ist;if(newDist<oldDist-1)num=(newDist/oldDist);oldDist=new&istj}if(mode==3)distance=-=vent-g5tX()-_s< ;di5tance=event_ge±Y()-_y ;break;true
//OTO手指间葩离priva-tefloa*tspac£mg(MotionEventevent){floatx=event.getX(0)-event.getX(1);floaty=event.g@tY(0)-event.getY(l);rwturnFloaizM日七li・乂用厂士{乳*x+y*y)jMainActivity类:继承自Activity类,并重写了Activity中的方法onCreate(),启动服务时将会调用onCreate()方法,创建了GLTutorialCube类对象,来开启主要活动。publicclassMainActivityextendsActivity{/**Calledwhenthe日匚七ivityis卡匸「$七created・*/(©OverridepublicvoidonCrea七亡(EundJ.Esavedins七日n匚七日七e)■{super.onCreate(sawedlnstanceState);requ-=stWindowFeature(Hindow.F£/iryffE_fVD_rrrLE)jgetWindow().5e±Format(PixelFormat.TRANSLUCENT};CLTutarialCub-ev=nwwGLTutorieiECubE{*hiw);>}—丽ViewAnimator类:继承自Handler类,可以使用其invalidate()来实现view的重绘,关于animation的介绍如下:XML中alpha 渐变ifi明度动iffl效果scale 渐变尺寸伸缩动画效果translate 画面转换位置移动动画效果rotate 转移施转动画效果JavaCode^渐变透明度动画敷果渐变尺寸伸缩动画蝕果渐变透明度动画敷果渐变尺寸伸缩动画蝕果画面转换位證移动动画效果画面轻移旋轻动画敷果ScaleAnimationTranslateAnimationRotateAnimation使用start()和stop()来现实对animation的启动与关闭。Handler是Message的主要处理者,负责将Message添加到消息队列以及对消息队列中的Message进行处理。
BuildConfig类:新增了一个特性,允许开发者只在Debug模式下运行部分代码。Builds会生成一个叫做BuildConfig的类,该类包含一个名为DEBUG的常量,其常量值会依据开发者的Build类型自动设定。如此,便可以利用BuildConfig.DEBUG来实现只在Debug模式下运行的代码。R类:定义了游戏中要用到的骰子的六个图标和游戏图标以及布局管理器和串设臵:public,finalclassR{publicstaticfinalclassattr{publicstaticfinalclassdrawab丄e{publicstaticfinalintpublicfinalintpublicstaticfinalintpublicstaticfinalintpublicstaticfinal"七publicstaticfinalintpublicstaticfinalajitaa=0x7f020000;bb=0y7f0200Gl;匸匚=0x7f020602;c/c/=0x7f020003jee=0x7f020004j/^=0x7f020005;£con=0-x7f02Q00&;}publicsta七卡inalclasslayout{publicstaticfinalintma-rn=0x7f030000;publicsta*ti匚final匚1日蛊皮string{publicstaticfinalintapp_raOTe=0x7f94-0001;public,staticfinaliniheli-c=0x7f9400-03,下面简单展示运行界面:05Cannera05Cannera11:06APRSWiDGETSCalculatorCalendarAPIDemosBrowserCameraClock□evSettingsDevToolsDownloadsEmailMessagingMusicPeopleSearchSettingsCustomLocaleSpeechRecorderGesturesBuilderCube.OpneGL0®011:06APRSWiDGETSCalculatorCalendarAPIDemosBrowserCameraClock□evSettingsDevToolsDownloadsEmailMessagingMusicPeopleSearchSettingsCustomLocaleSpeechRecorderGesturesBuilderCube.OpneGL0®0ImidanItailnH wahMbfi五.实验小结:本次实验虽然并不困难,但诚如前面所言,因为对android系统缺乏了解,所以很多知识都需要从头整理,并在网上查阅了大量资料,在此感谢网上热心的网友提供的帮助。开始对各类间的关系很不清楚,后来参考了去年的面向对象的课程设计,忽然想到可以使用UML建模,这样就可以直观的得到几个类间的关系。在网上参考了一个网友的建议,原本在src下又建了一个包zoom,其中有一个zoomListener,这样可以给GLTutorialCube的点击事件添加监听器,但是程序没办法运行。后来与同学讨论,关键在于重写onTouchEvent(),但是既然在重写放缩时有用mode==2判断两指事件,那么也可以用mode==1来判断一指触摸时的旋转,所以不必重写,直接添加就好。但在传参时不小心沿用了网友给出的模板onTouchEvent(Viewvie
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 新疆生产建设兵团兴新职业技术学院《风景园林设计》2023-2024学年第一学期期末试卷
- 【课件】新出台党风廉政建设法规解读及案例分析专题培训课件高效学习廉政规定互动式模板
- 司法所工作总结
- 九年级上册道德与法治知识点对应材料
- 《英语课程标准与教科书研究》教学大纲
- 二零二五年度高新技术企业财务咨询服务合同范本2篇
- 2025服装加盟合同书范文
- 《共同追梦》课件
- 水库加固工程顶管施工合同
- 酒店餐饮石匠施工合同
- 2025年中国高纯生铁行业政策、市场规模及投资前景研究报告(智研咨询发布)
- 2022-2024年浙江中考英语试题汇编:完形填空(学生版)
- 2025年广东省广州市荔湾区各街道办事处招聘90人历年高频重点提升(共500题)附带答案详解
- 中试部培训资料
- 北师大版数学三年级下册竖式计算题100道
- 计算机网络技术全套教学课件
- 屋顶分布式光伏发电项目施工重点难点分析及应对措施
- 胃镜下超声穿刺护理配合
- 2024解析:第三章物态变化-基础练(原卷版)
- 2023年浙江杭州师范大学附属医院招聘聘用人员考试真题
- 小学三年级数学上册《三位数加减乘法》口算专项练习300道
评论
0/150
提交评论