C#实现魔方仿真游戏的设计.docx

上传人:b****6 文档编号:8155119 上传时间:2023-01-29 格式:DOCX 页数:26 大小:373.96KB
下载 相关 举报
C#实现魔方仿真游戏的设计.docx_第1页
第1页 / 共26页
C#实现魔方仿真游戏的设计.docx_第2页
第2页 / 共26页
C#实现魔方仿真游戏的设计.docx_第3页
第3页 / 共26页
C#实现魔方仿真游戏的设计.docx_第4页
第4页 / 共26页
C#实现魔方仿真游戏的设计.docx_第5页
第5页 / 共26页
点击查看更多>>
下载资源
资源描述

C#实现魔方仿真游戏的设计.docx

《C#实现魔方仿真游戏的设计.docx》由会员分享,可在线阅读,更多相关《C#实现魔方仿真游戏的设计.docx(26页珍藏版)》请在冰豆网上搜索。

C#实现魔方仿真游戏的设计.docx

C#实现魔方仿真游戏的设计

 

C#设计报告

 

魔方仿真游戏的设计

绪论2

1.1课题的选题背景2

1.2课题的国内外研究现状3

1.3本人所做的主要工作3

课题需求分析3

2.1课题的功能需求3

2.2课题的性能需求3

涉及的主要工作原理和关键技术介绍3

3.1三维图形绘制原理技术介绍3

3.2魔方旋转原理技术介绍4

3.3关键问题解决思路4

3.3.1三维魔方的描述问题的解决方法4

3.3.2魔方整体旋转问题的解决方法4

3.3.3魔方每一层旋转和打乱问题的解决方法4

系统设计4

4.1系统总体结构、模块或流程5

4.2显示三维图形子模块的设计5

4.3魔方的整体翻转子模块的设计6

4.4魔方的各层旋转子模块的设计6

4.5魔方的打乱6

系统实现6

5.1显示三维魔方子模块的实现8

5.2魔方的整体翻转子模块的实现11

5.3魔方的各层旋转子模块的实现12

5.4魔方打乱子模块的实现16

系统测试17

6.1测试环境17

6.1.1.测试环境搭建17

6.1.2.测试还击搭配的基本原则17

6.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魔方整体旋转问题的解决方法

通过鼠标点击拖动,控制魔方的整体旋转。

定义了一个鼠标监听函数,鼠标移动后,坐标的改变将引起视图显示的角度的变化,然后视觉上给人以不同的效果。

3.3.3魔方每一层旋转和打乱问题的解决方法

每一层的旋转,定义了一个旋转函数,每次指定旋转层,根据其中心块的表面颜色,来执行旋转函数。

旋转函数通过改变块的颜色,视觉上给人以旋转后的效果,即重新对魔方的部分要求被改变的小块进行着色。

打乱魔方则是通过随机指定旋转面,然后调用旋转函数。

进行很多次的随机旋转后就会显现打乱后的魔方。

系统设计

4.1系统总体结构、模块或流程

图一:

系统的总体结构

根据礼品魔方的功能,主要分三个模块,三维魔方的显示,魔方的整体翻转,还有魔方的各层的旋转。

4.2显示三维图形子模块的设计

图二:

显示三维图形

三维图形的绘制是通过DirectX中的device设备实现的,通过摄像机,将世界坐标系中的图形转换到视图矩阵,然后采用PositionColored形式来定义顶点格式结构

4.3魔方的整体翻转子模块的设计

图三:

魔方的整体翻转

魔方的整体翻转:

是通过鼠标监听函数接受鼠标输入来改变三维图形的显示角度,控制矩阵的偏移。

4.4魔方的各层旋转子模块的设计

图四:

魔方各层旋转结构图

魔方各层的旋转:

是通过记录改变各个小块的面的颜色情况来实现旋转的。

4.5魔方的打乱

魔方的打乱只是多次随机调用魔方的层旋转函数。

系统实现

在主菜单上选择“项目——添加引用”,然后在.NET中添加Microsoft.DirectX.Microsoft.DirectX.Direct3D和Microsoft.DirectX.Direct3DX,如下图所示:

打开窗体和类的代码,为其添加DirectX引用,如下:

usingMicrosoft.DirectX;

usingMicrosoft.DirectX.Direct3D;

publicpartialclassCubeUI:

Form

{

//定义全局变量

publicstaticMicrosoft.DirectX.Direct3D.Devicedevice

=null;//定义绘图设备

privatestaticMicrosoft.DirectX.DirectInput.Device

mouse;//定义鼠标设备

privateVector3cameraPos;//定义摄像机位置

privateVector3mousepos;//定义鼠标位置

privatefloatrho;//角度r变量

privatefloattheta;//角度Θ变量(前后)

privatefloatphi;//角度Φ变量(左右)

RubixrubixCube;//类的声明

privateCustomColorrotateFace;//旋转面颜色

渲染图形函数:

///

///渲染函数,告诉绘图设备渲染哪些内容

///

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;//定义一个简单变量用于确定图形顶点位置

///

///绘制一个六面体(小方块)并且着色函数

///定义的是未经过转换的坐标,也就是世界空间坐标,采用PositionColored形式来定义顶点

///转换后的坐标不需要定义视图和投影变换而直接在屏幕上展示,采用的TransformedColored形式

///CustomVertex.TransformedColored结构表示一个自定义顶点格式结构,该结构包含已转换的顶点和颜色信息。

///

///

///

///

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魔方的整体翻转子模块的实现

魔方的整体翻转主要是通过鼠标控制的:

///

///初始化鼠标设备函数

///

privatevoidInitialMouse()

{

mouse=newMicrosoft.DirectX.DirectInput.Device(SystemGuid.Mouse);//实例化鼠标对象

mouse.SetCooperativeLevel(this,CooperativeLevelFlags.Background|CooperativeLevelFlags.NonExclusive);

mouse.Acquire();//得到访问输入设备

}

///

///定义鼠标监听函数

///

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魔方的各层旋转子模块的实现

///

///旋转魔方函数

///

///旋转面的中心块颜色

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°

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 工学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1