超级Rubik魔方演示程序源代码及数据结构分析(源代码有修正,20110105版)
先介绍一下程序:第一个提示界面:
选择好魔方大小后:
这个程序能模拟任意的x * y * z尺寸的魔方
可执行程序包(Win32):
魔方.zip
(155.45 KB)
修正版源代码工程(即上面的可执行程序包的源代码工程,使用VS2008):
rubik_src.zip
(151.27 KB)
老版本源代码工程(有BUG,且方块间无黑边分隔,同使用VS2008):
rubik_src.zip
(149.96 KB)
程序的交互:
使用鼠标:
左键:拖放可旋转你所拖动的层(注意拖放和拖动的区别)
右键:拖动可整体旋转整个魔方
滚轮:前进后退,以达到放大缩小的效果
喜欢的就回帖支持一下吧
=====================================================================================
如果你对数据结构分析不感兴趣,可以就此打住了
以下是程序数据结构简要分析
为了能支持任意 x * y * z 的魔方,数据结构及其关联性的定义见结构图:
结构的基本作用:
Rubik 结构:对整个魔方的状态控制和逻辑控制,以及渲染控制,它控制三个 Dimension 和 x * y * z 个 Cube
Dimension 结构:维度结构,相当于三个旋转轴,每一个维度结构控制若干个Layer结构
Layer 结构:层,控制本层的旋转,逻辑更新,每一层控制它所在的那一层的全部Cube
Cube 结构:每个独立小方块的逻辑结构,包含六个Face子结构,而每一个Cube都会由三个Layer所控制
Face 结构:渲染控制最小单元,用于绘制一个面,并记录这个面所映射的纹理
主要逻辑流程控制:
Render: Rubik -> Cube -> Face
Rotate: Rubik -> Dimension -> Layer -> Cube
Update: Rubik -> Dimension -> Layer
Pick: Rubik -> Cube -> Face ->(返回) Rubik -> Dimension -> Layer ->(返回) Rubik -> Rotate
单层Rotate实现:
每个Layer有一个指向本层的全部Cube的指针,通过交换Cube内的数据实现旋转,同时无需同步另两层相应的Cube,因为指向的是同一个Cube
这个不难
Pick实现:
由Rubik与所有Cube的可见面做Pick测试,找到z最小但大于0的Cube及其相应的面
然后根据这个面的编号,比如这个面是属于顶面或者底面的,就只向x维和z维查询这个Cube(因为这时不可能是y轴旋转)
获取所在维和所在层,以及所在层的面,并记录下来
鼠标控制时,就对两次Pick的数据进行比较,查找匹配的层,计算出旋转方向,再调用单层Rotate实现旋转
就是繁琐而已
Pick测试:
就是鼠标的点击生成一条空间直线,与一个空间三角形的碰撞检测
总的来说,所有主循环发起的操作都会通过Rubik结构向下传递,类似消息链
以上就是这个结构模型的简要抽象描述,还有很多细节
比如看起来生成了x * y * z个Cube,实际只有最外一层的Cube受控制
Layer自己根据自己所在层的大小决定旋转90度还是180度,
还有使用map技巧缩短代码等等
不过代码还是有很多地方没整理,有一些地方显得有点乱,将就着吧,我这菜鸟花12小时写的程序就只能这水平了
如果有什么细节上的问题可以线下讨论,见这里白色字: 可以加群127893384
其它:散分
PS:我就喜欢压缩EXE,这个也不例外,要用各种理由找茬的请自便,我不喜欢反驳。
另,继续期待我的朋友愿意和我交真正的朋友
[ 本帖最后由 御坂美琴 于 2011-1-5 20:48 编辑 ]