C#實現魔方仿真游戲的設計說明_第1頁
C#實現魔方仿真游戲的設計說明_第2頁
C#實現魔方仿真游戲的設計說明_第3頁
C#實現魔方仿真游戲的設計說明_第4頁
C#實現魔方仿真游戲的設計說明_第5頁
已閱讀5頁,還剩11頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

./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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論