C#实现魔方仿真游戏的设计(58页).doc

上传人:1595****071 文档编号:34800229 上传时间:2022-08-18 格式:DOC 页数:59 大小:546KB
返回 下载 相关 举报
C#实现魔方仿真游戏的设计(58页).doc_第1页
第1页 / 共59页
C#实现魔方仿真游戏的设计(58页).doc_第2页
第2页 / 共59页
点击查看更多>>
资源描述

《C#实现魔方仿真游戏的设计(58页).doc》由会员分享,可在线阅读,更多相关《C#实现魔方仿真游戏的设计(58页).doc(59页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、-C#设计报告魔方仿真游戏的设计绪论21.1课题的选题背景21.2课题的国内外研究现状31.3本人所做的主要工作3课题需求分析32.1 课题的功能需求32.2 课题的性能需求3涉及的主要工作原理和关键技术介绍33.1 三维图形绘制原理技术介绍33.2 魔方旋转原理技术介绍43.3 关键问题解决思路43.3.1三维魔方的描述问题的解决方法43.3.2 魔方整体旋转问题的解决方法43.3.3 魔方每一层旋转和打乱问题的解决方法4系统设计44.1 系统总体结构、模块或流程54.2 显示三维图形子模块的设计54.3 魔方的整体翻转子模块的设计64.4 魔方的各层旋转子模块的设计64.5 魔方的打乱6系

2、统实现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

3、/C+开发的魔方游戏,它的各个面也只是用颜色绘制。而用C#开发的魔方作品几乎没有。但是DirectX这个开发包的出现让这成为了现实,然而,对于DirectX的研究在国外甚多,在国内用DirectX开发的作品确实太少,在这方面资料也显得非常缺乏,能找到的资料大多数都是外国的,英文版本的。1.3本人所做的主要工作本人通过引进开发包DirectX基于C#,来实现绘制三维的仿真实的九宫格虚拟魔方,并且通过鼠标控制其整体的旋转,和各个层的旋转。课题需求分析2.1 课题的功能需求 绘制三维仿真魔方:绘制一个六面体,是一个3*3*3形式的魔方 魔方的整体的缩放与旋转:通过鼠标控制 魔方的旋转:通过鼠标点击按

4、钮,控制其对应面的旋转2.2 课题的性能需求 在电脑上最好能都简单的通过鼠标控制魔方游戏使其操作更简单。涉及的主要工作原理和关键技术介绍3.1 三维图形绘制原理技术介绍 采用Visual C# 语言对DirectX进行三维图形开发,首先介绍一下Device类,Device类用于完成DirectX 里所有绘图操作,我们可以把这个类假想为图形卡,场景里所有其他图形对象都依赖于Device,计算机里可以有多个Device。通过 Direct3D 绘制的每个对象都是有三角形组成的,一个三角形由三个点组成,而每个点都定义成一个向量来指定点的X、Y 和Z 坐标。DirectX 中有一种定义顶点的结构,那就

5、是CustomVertex 类,只需要在渲染函数中添加绘制图形代码即可绘图。绘制图元(primitives)根据其绘制方式,Device类主要提供了如下四个方法, 本次课程设计主要采用了如下绘图方法:public void DrawUserPrimitives( PrimitiveType primitiveType, int primitiveCount, object vertexStreamZeroData);DrawUserPrimitives()方法通过读取系统内存中的顶点数据来绘制图元。每次调用DrawUserPrimitives()方法时,顶点数据都是从系统内存中传递到显卡中,但

6、通常对于大部分数据没有变换的情况下,采用这种方式绘制图元将导致每次渲染时都要从系统内存中调用重复的数据,当顶点数据量较大时,会导致程序运行速度非常慢。绘制分段直线采用PrimitiveType. LineList 类型。3.2 魔方旋转原理技术介绍 魔方的旋转主要是通过算法记录旋转前各个小块的颜色,旋转后重新对其着色。对图形不停地进行渲染。3.3 关键问题解决思路3.3.1三维魔方的描述问题的解决方法 定义了一个Block类,用来表示一个小的六面体,以及它所在的位置的世界坐标,和给它的每个面着色。包括旋转某个面后,被旋转小块的重新着色的实现。3.3.2 魔方整体旋转问题的解决方法 通过鼠标点击

7、拖动,控制魔方的整体旋转。 定义了一个鼠标监听函数,鼠标移动后,坐标的改变将引起视图显示的角度的变化,然后视觉上给人以不同的效果。 3.3.3 魔方每一层旋转和打乱问题的解决方法 每一层的旋转,定义了一个旋转函数,每次指定旋转层,根据其中心块的表面颜色,来执行旋转函数。旋转函数通过改变块的颜色,视觉上给人以旋转后的效果,即重新对魔方的部分要求被改变的小块进行着色。 打乱魔方则是通过随机指定旋转面,然后调用旋转函数。进行很多次的随机旋转后就会显现打乱后的魔方。系统设计4.1 系统总体结构、模块或流程图一:系统的总体结构根据礼品魔方的功能,主要分三个模块,三维魔方的显示,魔方的整体翻转,还有魔方的

8、各层的旋转。4.2 显示三维图形子模块的设计图二:显示三维图形 三维图形的绘制是通过DirectX中的device设备实现的,通过摄像机,将世界坐标系中的图形转换到视图矩阵,然后采用PositionColored形式来定义顶点格式结构4.3 魔方的整体翻转子模块的设计图三:魔方的整体翻转 魔方的整体翻转:是通过鼠标监听函数接受鼠标输入来改变三维图形的显示角度,控制矩阵的偏移。4.4 魔方的各层旋转子模块的设计图四:魔方各层旋转结构图 魔方各层的旋转:是通过记录改变各个小块的面的颜色情况来实现旋转的。4.5 魔方的打乱 魔方的打乱只是多次随机调用魔方的层旋转函数。系统实现在主菜单上选择“项目添加

9、引用”,然后在.NET 中添加Microsoft.DirectX.Microsoft.DirectX.Direct3D 和Microsoft.DirectX.Direct3DX,如下图所示:打开窗体和类的代码,为其添加DirectX 引用,如下:using Microsoft.DirectX;using Microsoft.DirectX.Direct3D;public partial class CubeUI : Form /定义全局变量public static Microsoft.DirectX.Direct3D.Device device = null;/定义绘图设备 private

10、static Microsoft.DirectX.DirectInput.Device mouse;/定义鼠标设备 private Vector3 cameraPos;/定义摄像机位置 private Vector3 mousepos;/定义鼠标位置 private float rho;/角度r变量 private float theta;/角度变量(前后) private float phi;/角度变量(左右) Rubix rubixCube;/类的声明private CustomColor rotateFace;/旋转面颜色 渲染图形函数:/ / 渲染函数,告诉绘图设备渲染哪些内容 / p

11、ublic void Render() 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 (int

12、 x = 0; x 3; x+) for (int y = 0; y 3; y+) for (int z = 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显

13、示三维魔方子模块的实现Block类:public CustomColor top, bottom, front, back, left, right;public static int scale = 1;/定义一个简单变量 用于确定图形顶点位置 / / 绘制一个六面体(小方块)并且着色函数 /定义的是未经过转换的坐标,也就是世界空间坐标,采用PositionColored形式来定义顶点 /转换后的坐标不需要定义视图和投影变换而直接在屏幕上展示,采用的TransformedColored形式 /CustomVertex.TransformedColored 结构表示一个自定义顶点格式结构,该结

14、构包含已转换的顶点和颜色信息。 / / / / public void draw(float x, float y, float z) /CustomVertex.PositionColored表示包含位置和颜色信息的自定义顶点格式结构 CustomVertex.PositionColored vertices = new CustomVertex.PositionColored8; /六面体八个顶点的位置 vertices0.Position = new Vector3(x, y, z);/使用世界坐标来保存顶点位置 vertices1.Position = new Vector3(x, y

15、, z + scale); vertices2.Position = new Vector3(x + scale, y, z + scale); vertices3.Position = new Vector3(x + scale, y, z); vertices4.Position = new Vector3(x, y + scale, z); vertices5.Position = new Vector3(x, y + scale, z + scale); vertices6.Position = new Vector3(x + scale, y + scale, z + scale);

16、 vertices7.Position = new Vector3(x + scale, y + scale, z); /通过更新VertexFormat属性来让固定功能管道使用新的为变换但填充过颜色的顶点 CubeUI.device.VertexFormat = CustomVertex.PositionColored.Format; /前面 CustomVertex.PositionColored frontside = vertices0, vertices4, vertices7, vertices3 ; frontside = colorFace(frontside, mapColo

17、r(front); /PrimitiveType.TriangleFan 将顶点呈现为三角扇形。 PrimitiveType是枚举类型 CubeUI.device.DrawUserPrimitives(Microsoft.DirectX.Direct3D.PrimitiveType.TriangleFan, 2, frontside); CustomVertex.PositionColored flines = vertices0, vertices4, vertices4, vertices7, vertices7, vertices3, vertices3, vertices0 ; /Pr

18、imitiveType.LineList 将顶点呈现为一系列独立的直线段。如果顶点计数小于二或是奇数,则使用此基元类型的调用将失败。 /画线(图元类型:直线,图元数目:4条直线,直线走向) CubeUI.device.DrawUserPrimitives(Microsoft.DirectX.Direct3D.PrimitiveType.LineList, 4, flines); /后面 CustomVertex.PositionColored backside = vertices1, vertices5, vertices6, vertices2 ; frontside = colorFac

19、e(backside, mapColor(back); CubeUI.device.DrawUserPrimitives(Microsoft.DirectX.Direct3D.PrimitiveType.TriangleFan, 2, backside); CustomVertex.PositionColored blines = vertices1, vertices5, vertices5, vertices6, vertices6, vertices2, vertices2, vertices1 ; CubeUI.device.DrawUserPrimitives(Microsoft.D

20、irectX.Direct3D.PrimitiveType.LineList, 4, blines); /左面 CustomVertex.PositionColored leftside = vertices0, vertices1, vertices5, vertices4 ; frontside = colorFace(leftside, mapColor(left); CubeUI.device.DrawUserPrimitives(Microsoft.DirectX.Direct3D.PrimitiveType.TriangleFan, 2, leftside); CustomVert

21、ex.PositionColored llines = vertices0, vertices1, vertices1, vertices5, vertices5, vertices4, vertices4, vertices0 ; CubeUI.device.DrawUserPrimitives(Microsoft.DirectX.Direct3D.PrimitiveType.LineList, 4, flines); /右面 CustomVertex.PositionColored rightside = vertices3, vertices7, vertices6, vertices2

22、 ; frontside = colorFace(rightside, mapColor(right); CubeUI.device.DrawUserPrimitives(Microsoft.DirectX.Direct3D.PrimitiveType.TriangleFan, 2, rightside); CustomVertex.PositionColored rlines = vertices3, vertices7, vertices7, vertices6, vertices6, vertices2, vertices2, vertices3 ; CubeUI.device.Draw

23、UserPrimitives(Microsoft.DirectX.Direct3D.PrimitiveType.LineList, 4, rlines); /上面 CustomVertex.PositionColored topside = vertices4, vertices5, vertices6, vertices7 ; frontside = colorFace(topside, mapColor(top); CubeUI.device.DrawUserPrimitives(Microsoft.DirectX.Direct3D.PrimitiveType.TriangleFan, 2

24、, topside); CustomVertex.PositionColored tlines = vertices4, vertices5, vertices5, vertices6, vertices6, vertices7, vertices7, vertices4 ; CubeUI.device.DrawUserPrimitives(Microsoft.DirectX.Direct3D.PrimitiveType.LineList, 4, tlines); /底面 CustomVertex.PositionColored bottomside = vertices0, vertices

25、1, vertices2, vertices3 ; frontside = colorFace(bottomside, mapColor(bottom); CubeUI.device.DrawUserPrimitives(Microsoft.DirectX.Direct3D.PrimitiveType.TriangleFan, 2, bottomside); CustomVertex.PositionColored botlines = vertices0, vertices1, vertices1, vertices2, vertices2, vertices3, vertices3, ve

26、rtices0 ; CubeUI.device.DrawUserPrimitives(Microsoft.DirectX.Direct3D.PrimitiveType.LineList, 4, botlines); 5.2 魔方的整体翻转子模块的实现魔方的整体翻转主要是通过鼠标控制的:/ / 初始化鼠标设备函数 / private void InitialMouse() mouse = new Microsoft.DirectX.DirectInput.Device(SystemGuid.Mouse);/实例化鼠标对象 mouse.SetCooperativeLevel(this, Coope

27、rativeLevelFlags.Background | CooperativeLevelFlags.NonExclusive); mouse.Acquire();/得到访问输入设备 / / 定义鼠标监听函数 / private void MouseListen() MouseState state = mouse.CurrentMouseState; mousepos.X = state.X;/鼠标所在的位置 mousepos.Y = state.Y; mousepos.Z = state.Z; byte buttons = state.GetMouseButtons();/返回为一个长度

28、为8 的Byte数组 if (buttons1 != 0) /鼠标左键 theta += Geometry.DegreeToRadian(mousepos.X);/控制前后翻转 phi += Geometry.DegreeToRadian(mousepos.Y);/控制左右翻转 按住鼠标左键拖动鼠标即可实现魔方整体翻转。5.3 魔方的各层旋转子模块的实现/ / 旋转魔方函数 / / 旋转面的中心块颜色 public void Rotate(CustomColor color) /旋转某个面重新每小块的着色 /取得四个棱块的未曾旋转时着色情况 Edge leftmid = (Edge)GetBl

29、ock(0, 1, color);/左边棱块 坐标轴|_(x,y)=(0,0) Edge topmid = (Edge)GetBlock(1, 2, color);/顶部棱块 Edge rightmid = (Edge)GetBlock(2, 1, color);/右边棱块 Edge botmid = (Edge)GetBlock(1, 0, color);/底部棱块 /取得四个角块的未曾旋转时着色情况 Corner topleft = (Corner)GetBlock(0, 2, color);/顶层左角块 Corner topright = (Corner)GetBlock(2, 2, c

30、olor);/顶层右角块 Corner botleft = (Corner)GetBlock(0, 0, color);/底层左角块 Corner botright = (Corner)GetBlock(2, 0, color);/底层右角块 /顺时针旋转90 Edge edgeBucket = leftmid;/棱块的旋转 leftmid = (Edge)botmid.Rotate(color);/左边棱块=底部棱块 botmid = (Edge)rightmid.Rotate(color); rightmid = (Edge)topmid.Rotate(color); topmid = (

31、Edge)edgeBucket.Rotate(color); Corner cornerBucket = topleft; /角块的旋转 topleft = (Corner)botleft.Rotate(color); botleft = (Corner)botright.Rotate(color); botright = (Corner)topright.Rotate(color); topright = (Corner)cornerBucket.Rotate(color); / / 筛选魔方小块函数 / / 确定的颜色面 / 魔方小块集合 / 坐标轴 / public List GetSl

32、ice(CustomColor position, List dataset, int axis) /查询表达(C#) / Example #1: var is optional because / the select clause specifies a string /string words = apple, strwawberry, grape, peach, banana ; /var wordQuery = from word in words / where word0 = g / select word; var slice = from Block block in dat

33、aset select block;/定义隐式类型 switch (position) case CustomColor.Blue: slice = from Block block in dataset where block.back != CustomColor.Hidden & block.front = CustomColor.Hidden select block; break; case CustomColor.Green: slice = from Block block in dataset where block.front != CustomColor.Hidden &

34、block.back = CustomColor.Hidden select block; break; case CustomColor.Hidden: if (axis = 0) slice = from Block block in dataset where block.left = CustomColor.Hidden & block.right = CustomColor.Hidden select block; else if (axis = 1) slice = from Block block in dataset where block.bottom = CustomCol

35、or.Hidden & block.top = CustomColor.Hidden select block; else if (axis = 2) slice = from Block block in dataset where block.front = CustomColor.Hidden & block.back = CustomColor.Hidden select block; break; case CustomColor.Orange: slice = from Block block in dataset where block.left != CustomColor.Hidden & block.right = CustomColor.Hidden select block; break; case CustomColor.Red: slice = from Block block in dataset where block.right != CustomColor.Hidden & block.left = Custo

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 单元课程

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com