




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
./C#设计报告魔方仿真游戏的设计绪论21.1课题的选题背景21.2课题的国外研究现状31.3本人所做的主要工作3课题需求分析32.1课题的功能需求32.2课题的性能需求3涉及的主要工作原理和关键技术介绍33.1三维图形绘制原理技术介绍33.2魔方旋转原理技术介绍43.3关键问题解决思路4三维魔方的描述问题的解决方法43.3.2魔方整体旋转问题的解决方法43.3.3魔方每一层旋转和打乱问题的解决方法4系统设计44.1系统总体结构、模块或流程54.2显示三维图形子模块的设计54.3魔方的整体翻转子模块的设计64.4魔方的各层旋转子模块的设计64.5魔方的打乱6系统实现65.1显示三维魔方子模块的实现85.2魔方的整体翻转子模块的实现115.3魔方的各层旋转子模块的实现125.4魔方打乱子模块的实现16系统测试176.1测试环境176.1.1.测试环境搭建176.1.2.测试还击搭配的基本原则176.2测试记录18软件安装运行说明书24心得体会24参考文献24绪论1.1课题的选题背景真实的魔方总是让人不停地钻研,人们通过旋转魔方,开发自己的思维,可是有时候买一个魔方还是一件很麻烦的事情,很多人都有自己的电脑,他们有时候也想能否在电脑上就能体验一下玩魔方的感觉。1.2课题的国外研究现状如今有很多通过Java,Flash,或者OpenGL基于C/C++开发的魔方游戏,它的各个面也只是用颜色绘制。而用C#开发的魔方作品几乎没有。但是DirectX这个开发包的出现让这成为了现实,然而,对于DirectX的研究在国外甚多,在国用DirectX开发的作品确实太少,在这方面资料也显得非常缺乏,能找到的资料大多数都是外国的,英文版本的。1.3本人所做的主要工作本人通过引进开发包DirectX基于C#,来实现绘制三维的仿真实的九宫格虚拟魔方,并且通过鼠标控制其整体的旋转,和各个层的旋转。课题需求分析2.1课题的功能需求绘制三维仿真魔方:绘制一个六面体,是一个3*3*3形式的魔方魔方的整体的缩放与旋转:通过鼠标控制魔方的旋转:通过鼠标点击按钮,控制其对应面的旋转2.2课题的性能需求在电脑上最好能都简单的通过鼠标控制魔方游戏使其操作更简单。涉及的主要工作原理和关键技术介绍3.1三维图形绘制原理技术介绍采用VisualC#语言对DirectX进行三维图形开发,首先介绍一下Device类,Device类用于完成DirectX里所有绘图操作,我们可以把这个类假想为图形卡,场景里所有其他图形对象都依赖于Device,计算机里可以有多个Device。通过Direct3D绘制的每个对象都是有三角形组成的,一个三角形由三个点组成,而每个点都定义成一个向量来指定点的X、Y和Z坐标。DirectX中有一种定义顶点的结构,那就是CustomVertex类,只需要在渲染函数中添加绘制图形代码即可绘图。绘制图元〔primitives根据其绘制方式,Device类主要提供了如下四个方法,本次课程设计主要采用了如下绘图方法:publicvoidDrawUserPrimitives<PrimitiveTypeprimitiveType,intprimitiveCount,objectvertexStreamZeroData>;DrawUserPrimitives<>方法通过读取系统存中的顶点数据来绘制图元。每次调用DrawUserPrimitives<>方法时,顶点数据都是从系统存中传递到显卡中,但通常对于大部分数据没有变换的情况下,采用这种方式绘制图元将导致每次渲染时都要从系统存中调用重复的数据,当顶点数据量较大时,会导致程序运行速度非常慢。绘制分段直线采用PrimitiveType.LineList类型。3.2魔方旋转原理技术介绍魔方的旋转主要是通过算法记录旋转前各个小块的颜色,旋转后重新对其着色。对图形不停地进行渲染。3.3关键问题解决思路3.3.1三维魔方的描述问题的解决方法定义了一个Block类,用来表示一个小的六面体,以及它所在的位置的世界坐标,和给它的每个面着色。包括旋转某个面后,被旋转小块的重新着色的实现。3.3.2魔方整体旋转问题的解决方法通过鼠标点击拖动,控制魔方的整体旋转。定义了一个鼠标监听函数,鼠标移动后,坐标的改变将引起视图显示的角度的变化,然后视觉上给人以不同的效果。魔方每一层旋转和打乱问题的解决方法每一层的旋转,定义了一个旋转函数,每次指定旋转层,根据其中心块的表面颜色,来执行旋转函数。旋转函数通过改变块的颜色,视觉上给人以旋转后的效果,即重新对魔方的部分要求被改变的小块进行着色。打乱魔方则是通过随机指定旋转面,然后调用旋转函数。进行很多次的随机旋转后就会显现打乱后的魔方。系统设计4.1系统总体结构、模块或流程图一:系统的总体结构根据礼品魔方的功能,主要分三个模块,三维魔方的显示,魔方的整体翻转,还有魔方的各层的旋转。4.2显示三维图形子模块的设计图二:显示三维图形三维图形的绘制是通过DirectX中的device设备实现的,通过摄像机,将世界坐标系中的图形转换到视图矩阵,然后采用PositionColored形式来定义顶点格式结构4.3魔方的整体翻转子模块的设计图三:魔方的整体翻转魔方的整体翻转:是通过鼠标监听函数接受鼠标输入来改变三维图形的显示角度,控制矩阵的偏移。4.4魔方的各层旋转子模块的设计图四:魔方各层旋转结构图魔方各层的旋转:是通过记录改变各个小块的面的颜况来实现旋转的。4.5魔方的打乱魔方的打乱只是多次随机调用魔方的层旋转函数。系统实现在主菜单上选择"项目——添加引用",然后在.NET中添加Microsoft.DirectX.Microsoft.DirectX.Direct3D和,如下图所示:打开窗体和类的代码,为其添加DirectX引用,如下:usingMicrosoft.DirectX;usingMicrosoft.DirectX.Direct3D;publicpartialclassCubeUI:Form{//定义全局变量publicstaticMicrosoft.DirectX.Direct3D.Devicedevice=null;//定义绘图设备privatestaticMicrosoft.DirectX.DirectInput.Devicemouse;//定义鼠标设备privateVector3cameraPos;//定义摄像机位置privateVector3mousepos;//定义鼠标位置privatefloatrho;//角度r变量privatefloattheta;//角度Θ变量〔前后privatefloatphi;//角度Φ变量〔左右RubixrubixCube;//类的声明privateCustomColorrotateFace;//旋转面颜色渲染图形函数:///<summary>///渲染函数,告诉绘图设备渲染哪些容///</summary>publicvoidRender<>{if<device==null>//如果device为空则不渲染{return;}device.Clear<ClearFlags.Target|ClearFlags.ZBuffer,Color.Cyan,1.0f,0>;//清除windows界面为Cyan深度缓冲device.BeginScene<>;////在此添加渲染图形代码//MouseListen<>;//鼠标监听函数device.Transform.World=Matrix.Translation<-1.5f,-1.5f,-1.5f>;//矩阵偏移量for<intx=0;x<3;x++>{for<inty=0;y<3;y++>{for<intz=0;z<3;z++>{rubixCube.GetBlock<x,y,z>.draw<x,y,z>;}}}device.RenderState.Lighting=false;//排除灯光,以防变成黑色device.RenderState.CullMode=Cull.None;//〔使用摄象机变换则用到不需要背面提出功能PositionCamera<>;device.EndScene<>;device.Present<>;this.Invalidate<>;}}5.1显示三维魔方子模块的实现Block类:publicCustomColortop,bottom,front,back,left,right;publicstaticintscale=1;//定义一个简单变量用于确定图形顶点位置///<summary>///绘制一个六面体〔小方块并且着色函数///定义的是未经过转换的坐标,也就是世界空间坐标,采用PositionColored形式来定义顶点///转换后的坐标不需要定义视图和投影变换而直接在屏幕上展示,采用的TransformedColored形式///CustomVertex.TransformedColored结构表示一个自定义顶点格式结构,该结构包含已转换的顶点和颜色信息。///</summary>///<paramname="x"></param>///<paramname="y"></param>///<paramname="z"></param>publicvoiddraw<floatx,floaty,floatz>{//CustomVertex.PositionColored表示包含位置和颜色信息的自定义顶点格式结构CustomVertex.PositionColored[]vertices=newCustomVertex.PositionColored[8];//六面体八个顶点的位置vertices[0].Position=newVector3<x,y,z>;//使用世界坐标来保存顶点位置vertices[1].Position=newVector3<x,y,z+scale>;vertices[2].Position=newVector3<x+scale,y,z+scale>;vertices[3].Position=newVector3<x+scale,y,z>;vertices[4].Position=newVector3<x,y+scale,z>;vertices[5].Position=newVector3<x,y+scale,z+scale>;vertices[6].Position=newVector3<x+scale,y+scale,z+scale>;vertices[7].Position=newVector3<x+scale,y+scale,z>;//通过更新VertexFormat属性来让固定功能管道使用新的为变换但填充过颜色的顶点CubeUI.device.VertexFormat=CustomVertex.PositionColored.Format;//前面CustomVertex.PositionColored[]frontside={vertices[0],vertices[4],vertices[7],vertices[3]};frontside=colorFace<frontside,mapColor<front>>;//PrimitiveType.TriangleFan将顶点呈现为三角扇形。PrimitiveType是枚举类型CubeUI.device.DrawUserPrimitives<Microsoft.DirectX.Direct3D.PrimitiveType.TriangleFan,2,frontside>;CustomVertex.PositionColored[]flines={vertices[0],vertices[4],vertices[4],vertices[7],vertices[7],vertices[3],vertices[3],vertices[0]};//PrimitiveType.LineList将顶点呈现为一系列独立的直线段。如果顶点计数小于二或是奇数,则使用此基元类型的调用将失败。//画线<图元类型:直线,图元数目:4条直线,直线走向>CubeUI.device.DrawUserPrimitives<Microsoft.DirectX.Direct3D.PrimitiveType.LineList,4,flines>;//后面CustomVertex.PositionColored[]backside={vertices[1],vertices[5],vertices[6],vertices[2]};frontside=colorFace<backside,mapColor<back>>;CubeUI.device.DrawUserPrimitives<Microsoft.DirectX.Direct3D.PrimitiveType.TriangleFan,2,backside>;CustomVertex.PositionColored[]blines={vertices[1],vertices[5],vertices[5],vertices[6],vertices[6],vertices[2],vertices[2],vertices[1]};CubeUI.device.DrawUserPrimitives<Microsoft.DirectX.Direct3D.PrimitiveType.LineList,4,blines>;//左面CustomVertex.PositionColored[]leftside={vertices[0],vertices[1],vertices[5],vertices[4]};frontside=colorFace<leftside,mapColor<left>>;CubeUI.device.DrawUserPrimitives<Microsoft.DirectX.Direct3D.PrimitiveType.TriangleFan,2,leftside>;CustomVertex.PositionColored[]llines={vertices[0],vertices[1],vertices[1],vertices[5],vertices[5],vertices[4],vertices[4],vertices[0]};CubeUI.device.DrawUserPrimitives<Microsoft.DirectX.Direct3D.PrimitiveType.LineList,4,flines>;//右面CustomVertex.PositionColored[]rightside={vertices[3],vertices[7],vertices[6],vertices[2]};frontside=colorFace<rightside,mapColor<right>>;CubeUI.device.DrawUserPrimitives<Microsoft.DirectX.Direct3D.PrimitiveType.TriangleFan,2,rightside>;CustomVertex.PositionColored[]rlines={vertices[3],vertices[7],vertices[7],vertices[6],vertices[6],vertices[2],vertices[2],vertices[3]};CubeUI.device.DrawUserPrimitives<Microsoft.DirectX.Direct3D.PrimitiveType.LineList,4,rlines>;//上面CustomVertex.PositionColored[]topside={vertices[4],vertices[5],vertices[6],vertices[7]};frontside=colorFace<topside,mapColor<top>>;CubeUI.device.DrawUserPrimitives<Microsoft.DirectX.Direct3D.PrimitiveType.TriangleFan,2,topside>;CustomVertex.PositionColored[]tlines={vertices[4],vertices[5],vertices[5],vertices[6],vertices[6],vertices[7],vertices[7],vertices[4]};CubeUI.device.DrawUserPrimitives<Microsoft.DirectX.Direct3D.PrimitiveType.LineList,4,tlines>;//底面CustomVertex.PositionColored[]bottomside={vertices[0],vertices[1],vertices[2],vertices[3]};frontside=colorFace<bottomside,mapColor<bottom>>;CubeUI.device.DrawUserPrimitives<Microsoft.DirectX.Direct3D.PrimitiveType.TriangleFan,2,bottomside>;CustomVertex.PositionColored[]botlines={vertices[0],vertices[1],vertices[1],vertices[2],vertices[2],vertices[3],vertices[3],vertices[0]};CubeUI.device.DrawUserPrimitives<Microsoft.DirectX.Direct3D.PrimitiveType.LineList,4,botlines>;}5.2魔方的整体翻转子模块的实现魔方的整体翻转主要是通过鼠标控制的:///<summary>///初始化鼠标设备函数///</summary>privatevoidInitialMouse<>{mouse=newMicrosoft.DirectX.DirectInput.Device<SystemGuid.Mouse>;//实例化鼠标对象mouse.SetCooperativeLevel<this,CooperativeLevelFlags.Background|CooperativeLevelFlags.NonExclusive>;mouse.Acquire<>;//得到访问输入设备}///<summary>///定义鼠标监听函数///</summary>privatevoidMouseListen<>{MouseStatestate=mouse.CurrentMouseState;mousepos.X=state.X;//鼠标所在的位置mousepos.Y=state.Y;mousepos.Z=state.Z;byte[]buttons=state.GetMouseButtons<>;//返回为一个长度为8的Byte数组if<buttons[1]!=0>//鼠标左键{theta+=Geometry.DegreeToRadian<mousepos.X>;//控制前后翻转phi+=Geometry.DegreeToRadian<mousepos.Y>;//控制左右翻转}}按住鼠标左键拖动鼠标即可实现魔方整体翻转。5.3魔方的各层旋转子模块的实现///<summary>///旋转魔方函数///</summary>///<paramname="color">旋转面的中心块颜色</param>publicvoidRotate<CustomColorcolor>{//旋转某个面重新每小块的着色//取得四个棱块的未曾旋转时着况Edgeleftmid=<Edge>GetBlock<0,1,color>;//左边棱块坐标轴|__<x,y>=<0,0>Edgetopmid=<Edge>GetBlock<1,2,color>;//顶部棱块Edgerightmid=<Edge>GetBlock<2,1,color>;//右边棱块Edgebotmid=<Edge>GetBlock<1,0,color>;//底部棱块//取得四个角块的未曾旋转时着况Cornertopleft=<Corner>GetBlock<0,2,color>;//顶层左角块Cornertopright=<Corner>GetBlock<2,2,color>;//顶层右角块Cornerbotleft=<Corner>GetBlock<0,0,color>;//底层左角块Cornerbotright=<Corner>GetBlock<2,0,color>;//底层右角块//顺时针旋转90°EdgeedgeBucket=leftmid;//棱块的旋转leftmid=<Edge>botmid.Rotate<color>;//左边棱块==底部棱块botmid=<Edge>rightmid.Rotate<color>;rightmid=<Edge>topmid.Rotate<color>;topmid=<Edge>edgeBucket.Rotate<color>;CornercornerBucket=topleft;//角块的旋转topleft=<Corner>botleft.Rotate<color>;botleft=<Corner>botright.Rotate<color>;botright=<Corner>topright.Rotate<color>;topright=<Corner>cornerBucket.Rotate<color>;}///<summary>///筛选魔方小块函数///</summary>///<paramname="position">确定的颜色面</param>///<paramname="dataset">魔方小块集合</param>///<paramname="axis">坐标轴</param>///<returns></returns>publicList<Block>GetSlice<CustomColorposition,List<Block>dataset,intaxis>{//查询表达<C#>////Example#1:varisoptionalbecause////theselectclausespecifiesastring//string[]words={"apple","strwawberry","grape","peach","banana"};//varwordQuery=fromwordinwords//whereword[0]=='g'//selectword;varslice=fromBlockblockindatasetselectblock;//定义隐式类型switch<position>{caseCustomColor.Blue:slice=fromBlockblockindatasetwhereblock.back!=CustomColor.Hidden&&block.front==CustomColor.Hiddenselectblock;break;caseCustomColor.Green:slice=fromBlockblockindatasetwhereblock.front!=CustomColor.Hidden&&block.back==CustomColor.Hiddenselectblock;break;caseCustomColor.Hidden:if<axis==0>{slice=fromBlockblockindatasetwhereblock.left==CustomColor.Hidden&&block.right==CustomColor.Hiddenselectblock;}elseif<axis==1>{slice=fromBlockblockindatasetwhereblock.bottom==CustomColor.Hidden&&block.top==CustomColor.Hiddenselectblock;}elseif<axis==2>{slice=fromBlockblockindatasetwhereblock.front==CustomColor.Hidden&&block.back==CustomColor.Hiddenselectblock;}break;caseCustomColor.Orange:slice=fromBlockblockindatasetwhereblock.left!=CustomColor.Hidden&&block.right==CustomColor.Hiddenselectblock;break;caseCustomColor.Red:slice=fromBlockblockindatasetwhereblock.right!=CustomColor.Hidden&&block.left==CustomColor.Hiddenselectblock;break;caseCustomColor.White:slice=fromBlockblockindatasetwhereblock.top!=CustomColor.Hidden&&block.bottom==CustomColor.Hiddenselectblock;break;caseCustomColor.Yellow:slice=fromBlockblockindatasetwhereblock.bottom!=CustomColor.Hidden&&block.top==CustomColor.Hiddenselectblock;break;}List<Block>toReturn=newList<Block><>;foreach<Blockbinslice>{toReturn.Add<b>;}returntoReturn;}///<summary>///确定某个位置方块的颜色///</summary>///<paramname="x">方块:x坐标</param>///<paramname="y">方块:y坐标</param>///<paramname="z">方块:z坐标</param>///<returns></returns>publicBlockGetBlock<intx,inty,intz>{List<Block>dataset;switch<x>{//获得坐标x处所有方块的着况<执行后会有9个块>case0:dataset=GetSlice<CustomColor.Orange,this.blocks,0>;break;case1:dataset=GetSlice<CustomColor.Hidden,this.blocks,0>;break;case2:dataset=GetSlice<CustomColor.Red,this.blocks,0>;break;default:thrownewException<"InvalidCoordinate">;}switch<y>{//获得坐标〔x,y处所有方块的情况〔执行后会有3个块case0:dataset=GetSlice<CustomColor.Yellow,dataset,0>;break;case1:dataset=GetSlice<CustomColor.Hidden,dataset,1>;break;case2:dataset=GetSlice<CustomColor.White,dataset,0>;break;default:thrownewException<"InvalidCoordinate">;}switch<z>{//获得坐标<x,y,z>处所有方块的情况<执行后只有一块>case0:dataset=GetSlice<CustomColor.Green,dataset,0>;break;case1:dataset=GetSlice<CustomColor.Hidden,dataset,2>;break;case2:dataset=GetSlice<CustomColor.Blue,dataset,0>;break;default:thrownewException<"非法坐标系">;}return<Block>dataset[0];}5.4魔方打乱子模块的实现随机调用层旋转函数:///<summary> ///随机打乱魔方函数///</summary>publicvoidScramble<>{Randomrn=newRandom<>;//声明一个随机数对象rnintn=rn.Next<75,150>;CustomColorcolorToRotate;while<--n!=0>{introtateColorFace=rn.Next<1,7>;//产生一个1到小于7之间的随机数switch<rotateColorFace>{//确定旋转中心面颜色case1:colorToRotate=CustomColor.Blue;break;case2:colorToRotate=CustomColor.Green;break;case3:colorToRotate=CustomColor.Orange;break;case4:colorToRotate=CustomColor.Red;break;case5:colorToRotate=CustomColor.White;break;default:colorToRotate=CustomColor.Yellow;break;}Rotate<colorToRotate>;//调用旋转函数}}系统测试6.1测试环境测试环境〔Testingenvironment=软件+硬件+网络。6.1.1.测试环境搭建1.1三个方面:软件+硬件+网络。1.2搭建测试环境注意以下几点:真实、干净、无毒、独立。6
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年山西体育职业学院高职单招高职单招英语2016-2024历年频考点试题含答案解析
- 2025年安徽汽车职业技术学院高职单招职业适应性测试历年(2019-2024年)真题考点试卷含答案解析
- 气管插管患者管道护理
- 2025年天津海运职业学院高职单招职业适应性测试历年(2019-2024年)真题考点试卷含答案解析
- 2025年天津城市职业学院高职单招高职单招英语2016-2024历年频考点试题含答案解析
- 物流运输总结汇报模板
- 6岁小学生音乐课件
- BJ20养护知识课件
- 简约清新毕业答辩
- 6S相关知识课件
- 新疆维吾尔自治区和田地区墨玉县2023-2024学年七年级下学期5月期中道德与法治试题
- 工厂化循环水产养殖项目投资计划书
- 精神疾病患者自杀风险评估与预防措施
- 山西省太原市2023-2024学年七年级下学期期中数学试题
- XF-T 3004-2020 汽车加油加气站消防安全管理
- 人教版九年级英语单词表(中文)
- 湿式电除尘施工方案(完整常用版)
- 物流运输安全培训课件
- 第9课《呵护我们的鼻子》课件
- 期末测试题(试题)-2023-2024学年四年级下册数学人教版
- 2024年广东恒健投资控股有限公司招聘笔试参考题库含答案解析
评论
0/150
提交评论