一个魔方仿真游戏的设计课程设计报告.docx
- 文档编号:9472069
- 上传时间:2023-02-04
- 格式:DOCX
- 页数:31
- 大小:373.91KB
一个魔方仿真游戏的设计课程设计报告.docx
《一个魔方仿真游戏的设计课程设计报告.docx》由会员分享,可在线阅读,更多相关《一个魔方仿真游戏的设计课程设计报告.docx(31页珍藏版)》请在冰豆网上搜索。
一个魔方仿真游戏的设计课程设计报告
综合课程设计报告
一个魔方仿真游戏的设计
绪论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);//底层右角块
//顺时针
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 一个 魔方 仿真 游戏 设计 课程设计 报告