基于 glfw/glad 的三维中国象棋游戏与场景建模项目报告
9
所要求的几何体我们都做了封装。
(3)棋盘管理组件
SQUARE.h
含一个类 Square,这个类的实例对象对应的就是一块
矩形片。构造函数接受中心坐标,水平高度以及自身的宽
度和长度。我们的棋盘盘面,棋盘上的线和标记,实际上底
层都是它。
如右图,银质的盘面是一个大矩形块,实际上就是一
个 Square 对象。金质的十字盘标,是由 8 块 Square 对象
拼凑而成的,十字盘标被封装在另一个 Tag 类中,但是
Tag 类里实例化了 8 个 Square 对象。盘面上纵横交错的线条是红色橡胶材质,每一条线都
是长窄的 Square 对象。
CHESSBOARD.h
含一个类 chessBoard,这是棋盘的顶层对象。这个类含有几个比较重要的成员。
Square*Line[26],是棋盘上纵横若干条线。boardCross *corss[2],是棋盘上双方主将所行区
域的那个×型线条。Square *groundObj[3];这是棋盘的盘面,我们切割成了三块进行渲染。
chessManager* myManager 是用来管理棋盘逻辑的对象!!
这个顶层对象管理了棋盘盘身的渲染,同时麾下有一个棋盘管理器,它是 chessManager
类的实例化对象,这也是我们将要介绍的。
CHESSMANAGER.h
含四个类
boardCross 对应的是棋盘上 x 形线条。Tag 对应的是棋盘上兵,炮初始位置的几个 target
型图标。
Focus 对应的是我们棋盘上可移动的光标,这个类里面还封装了,关于 focus 事件的一些
内容,它控制着光标移动,棋子选定等逻辑。
应该重点关注的是 chessManager 类,这是管理我们棋盘的类。可以看到它下面管理了
Focus 光标,水流面和一个棋子控制对象:chessGo* myChess。这个类的实例对象起到了管
理盘面上可移动物的渲染和事件。
CHESSGO.h
含一个类 chessGo,它的实例化对象被用来具体的管理 32 个棋子。包括它们移动的合
法性检测,游戏胜负的检测,棋子的移动动画控制,棋子被消灭的动画控制,以及棋子本身
的布局逻辑。
麾下有一个 chessModelManager 类的对象。这个对象被用来具体的控制每一个棋子模
型。chessGo 对象对每一个棋子的任何操作都是通过命令 chessModelManager 对象去完成
底层实现的。
CHESSMODELMANAGER.h
含一个类 chessModel,主要是具体的存储了每个棋子的 Model 对象(或者 nurbsCar 对
象),同时维护了每个棋子的模型矩阵。构造函数接受模型对象指针,放缩因子,旋转角度,
平移量。这样可以让我们的模型在初始的时候,有一个合适的大小,朝向,并且对齐每一个
落子点。
同时,chessModel 还提供了一个接口,接受一个平移量,对棋子模型进行平移。chessGo
对象就是调用的这一个方法,来实现棋子的运动。
(4)主程序
chineseChess.cpp :
主程序,调用 Toolkit 类中的相关方法,初始化 OpenGL 的上下文。
调用 Material 类的静态方法 initMaterail 加载我们预设的 24 种材质。