Controllers.h
资源名称:g.rar [点击查看]
上传用户:laitongbao
上传日期:2021-02-20
资源大小:8176k
文件大小:8k
源码类别:

射击游戏

开发平台:

Visual C++

  1. //typedef unsigned long       DWORD;
  2. class NodeObject;
  3. #pragma warning(disable: 4786)
  4. #include "MeshObject.h"
  5. #include "SceneTree.h"
  6. #include "Utility.h"
  7. #include "Time.h"
  8. #include "RandGenerator.h"
  9. #include "VECTOR.h"
  10. #include "CGLDEF.h"
  11. #ifndef CONTROLLERS_H
  12. #define CONTROLLERS_H
  13. //UI对象边界宽度
  14. #define BORDER_WIDE   5
  15. struct Parameter{//通用显示属性结构
  16. bool Mutisample;
  17. int MutisampleLevel;
  18. PAR_FILLMODE fillMode;
  19. PAR_SHADEMODE shadeMode;
  20. bool fog;
  21. float fogStart;
  22. float fogEnd;
  23. DWORD fogColor;
  24. DWORD globalAmbientColor;
  25. DWORD backgroundColor;
  26. bool forcedTwoSide;
  27. bool lighting;
  28. };
  29. struct InputStatus{//鼠标键盘当前状态信息(由于没有使用Direct_Input 所以暂时不用,
  30. //由消息处理函数代为检测用户输入)
  31. };
  32. class TransitionController{
  33. public:
  34. static void SetPosition(NodeObject* obj,VECTOR3 pos);
  35. static void SetWorldPosition(NodeObject* obj,VECTOR3 gpos);
  36. static VECTOR3 GetPosition(NodeObject* obj);
  37. static VECTOR3 GetWorldPosition(NodeObject* obj);
  38. static void SetRotation(NodeObject* obj,VECTOR3 rot);
  39. static VECTOR3 GetRotation(NodeObject* obj);
  40. static void SetScale(NodeObject* obj,VECTOR3 scale);
  41. static VECTOR3 GetScale(NodeObject* obj);
  42. static void UpdateMatrix(NodeObject *obj);//更新物体的转换矩阵(将3个矩阵合成为一个叫转换矩阵的矩阵)
  43. static D3DXMATRIX* GetMatrix(NodeObject* obj);
  44. static void ApplyMatrix(NodeObject* obj,Camera* cam);//设置物体在视图中的位置(将转换矩阵*视图矩阵的结果传递给Device)
  45. };
  46. class FileController{//管理磁盘文件操作
  47. public:
  48. static void       LoadSceneFromFile(TCHAR* fileName,SceneTree* scene);
  49. static void       SaveSceneToFile(TCHAR* fileName,SceneTree* scene);
  50. static void       LoadMeshFromFile(TCHAR* fileName,MeshObject* mesh);
  51. static void       SaveMeshToFile(TCHAR* fileName,MeshObject* mesh);
  52. static void       LoadSurfaceFromFile(TCHAR* fileName,Surface*sur,RECT*rect=NULL,DWORD colorKey=0);
  53. static void       SaveSurfaceToFile(TCHAR* fileName,Surface *sur);
  54. };
  55. /*
  56. GraphicController
  57. 负责管理全局的图像设置
  58. */
  59. class GraphicController{//管理全局图像效果,如雾化
  60. friend class View;
  61. public:
  62. GraphicController(Parameter param){SetParameter(param);};
  63.     GraphicController();
  64. void        SetParameter(Parameter param);//改变全局设置
  65. Parameter   GetParameter();
  66. void        SetFog(bool fog,float near,float far,DWORD color=0xffffffff);
  67. void        SetBgColor(DWORD color);
  68. void        SetAmbient(DWORD color);
  69. void        SetTowSideRender(bool towside);
  70. void        Apply();//设置渲染状态
  71. private:
  72. Parameter   parameter;
  73. };
  74. /*
  75. ShaderController
  76. 管理单个网格物体显示效果
  77. */
  78. class ShaderController{
  79. public:
  80. static void    RenderSubtree(NodeObject* rootObject,Camera* cam);//渲染子场景树,从root向它的child和next节点遍历子树
  81. static void    ApplyShader(NodeObject* object);//设置顶点着色器
  82. static void    UpdateSubtree(NodeObject* rootObject);
  83. private:
  84. static void    IteratorRender(NodeObject* object,Camera* cam);//叠代渲染,从root向它的child和next节点遍历子树
  85. };
  86. /*
  87. UIController
  88. 创建管理用户界面,响应用户输入
  89. */
  90. class UIController{
  91. private:
  92. //用户UI对象结构 
  93. struct PanelElement{
  94. DWORD type;
  95. int x,y;//左上角坐标
  96. int width,height;
  97. int indicatorx;
  98. int indicatory;
  99. int indicatorw;
  100. int indicatorh;
  101. TCHAR text[MAXTEXT];//显示文字
  102. DWORD align;//摆放文字方式
  103. int ID;//惟一的标示此对象的ID
  104. DWORD bg_color;//背景颜色
  105. DWORD text_color;//字体颜色
  106. LPDIRECT3DTEXTURE9 texture;//UI贴图
  107. LPDIRECT3DTEXTURE9 over_texture;//当鼠标在其上时的UI贴图
  108. LPDIRECT3DTEXTURE9 indicator_texture;//滑竿按钮图片
  109. IDirect3DVertexBuffer9* vertex_buffer;//长方形顶点缓存
  110. IDirect3DVertexBuffer9* indicator_buffer;//长方形顶点缓存
  111. BOOL button;//是否是按钮
  112. BOOL over;//鼠标是否在其上
  113. BOOL active;//是否激活
  114. BOOL visable;//是否可见
  115. BOOL drag;//是否正在被拖拽
  116. float min;
  117. float max;
  118. float step;
  119. float currentpos;//当前滑竿位置(逻辑位置)
  120. };
  121. enum PE_TYPE{
  122. PE_LABEL=0,PE_BUTTON=1,PE_SLIDEBAR
  123. };
  124. friend class View;
  125. friend class ShaderController;
  126. public:
  127. UIController();
  128. ~UIController();
  129. void    SetFont( TCHAR* pstrFont, DWORD dwSize ,bool bold=false);
  130. void       GetSelected(NodeObject* objectList,int objectCount)const;
  131. void       GetMousePosition(int& x,int& y)const;
  132. void       SetSelected(NodeObject* objectList,int objectCount);
  133. void       SetMousePosition(int x,int y);
  134. //使用Windows消息处理机制获得用户输入
  135. LRESULT    MsgProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
  136.     void       AddLabel(int x, int y, int width,int height,
  137.   TCHAR* text,DWORD align,int ID,
  138.   DWORD text_color,DWORD bg_color,
  139.   MEM_FILE*image);
  140.     void       AddButton(int x, int y, int width,
  141.    int height,TCHAR* text,DWORD align,int ID,
  142.    DWORD text_color,DWORD bg_color,MEM_FILE*image,
  143.    MEM_FILE*over_image);
  144. void       AddSlideBar(int x,int y,int width,
  145. int height,int ID,
  146. DWORD bg_color,MEM_FILE*image,
  147. MEM_FILE*indicator_image,float min=0,float max=255.f,
  148. float step=1.f);//indicator_image表示滑竿按钮图片,step表示精度(最少的改变量)
  149. void       HideUI(int id);//隐藏指定UI对象
  150. void       ShowUI(int id);//显示指定UI对象
  151. void       EnableUI(int id);//激活UI对象
  152. void       DisableUI(int id);//冻结UI对象
  153.     void       MoveUI(int ID,float x,float y,float width,float height);//修改UI对象的大小位置,大小为0时不修改大小
  154. void       ReloadUI_image(int ID,MEM_FILE*image,MEM_FILE*over_image,
  155. BOOL resize=FALSE);
  156. void       ReloadUI_image(int ID,TCHAR*image,TCHAR*over_image,
  157. BOOL resize=FALSE);
  158.     void       SetText(int ID,const TCHAR*newText,...);
  159. void       SetColor(int ID,BOOL set_text_color,DWORD color);
  160. void       SetTransparent(int ID,int value,bool background=true);//0完全透明-255完全不透明
  161. void       SetSlidePos(int ID,float value);//设置滑块的逻辑位置,
  162. //真实位置也会随逻辑位置改变
  163. float      GetSlidePos(int ID);
  164. void       SetButtonClickProc(void(CALLBACK*OnButtonClick)(int buttonID));
  165. void       SetMouseClickProc(void(CALLBACK*OnMouseClick)(InputStatus status));
  166. void       SetKeyDownProc(void(CALLBACK*OnKeyDown)(InputStatus status));
  167. void       SetKeyUpProc(void(CALLBACK*OnKeyUp)(InputStatus status));
  168. void       SetKeyPressProc(void (CALLBACK*OnKeyPress)(InputStatus status));
  169. void       SetMouseMoveProc(void(CALLBACK*OnMouseMove)(InputStatus status));
  170. void       SetMouseButtonDownProc(void(CALLBACK*OnMouseButtonDown)(InputStatus status)); 
  171. void       SetMouseButtonUpProc(void(CALLBACK*OnMouseButtonUp)(InputStatus status));
  172. void       ClearAll();
  173. private:
  174. std::list<PanelElement> m_panelList;
  175. void       DrawPanelElement(PanelElement ele);
  176. void       DrawAll();
  177. void (CALLBACK*m_OnButtonClick)(int buttonID);//相应按钮被按时间的函数
  178. LPD3DXFONT font;
  179. LPD3DXSPRITE ui;
  180. };
  181. /*
  182. AnimationController
  183. 控制物体运动速度和动画播放速度
  184. */
  185. class AnimationController
  186. {
  187. public:
  188. AnimationController();
  189. void SetSpeed(float factor);
  190. void MoveObject(NodeObject *obj);
  191. void Orbit(NodeObject*obj,VECTOR3 center,float radius,float link_speed);
  192. private:
  193. Timer*timer;
  194. };
  195. /*
  196. ObjectScatter
  197. 负责复制并在空间中随意散布物体
  198. */
  199. class ObjectScatter
  200. {
  201. public:
  202. ObjectScatter(SceneTree*scene,NodeObject*obj,int count=100,float min=1,float max=1,float xstart=-100,float ystart=-100,float zstart=-100,float xend=100,float yend=100,float zend=100,int seed=1);
  203. void SetBoundary(float xstart,float ystart,float zstart,float xend,float yend,float zend);
  204. void SetSize(float min ,float max);
  205. void SetCount(int count);
  206. void Scatter();
  207. private:
  208. float min;
  209. float max;
  210. float xstart;
  211. float ystart;
  212. float zstart;
  213. float xend;
  214. float yend;
  215. float zend;
  216. int count;
  217. NodeObject*obj;
  218. SceneTree*scene;
  219. RandGenerator*gen;
  220. };
  221. /*
  222. LineCreater
  223. 创建各种线条
  224. */
  225. class LineCreater
  226. {
  227. public:
  228.     LineCreater(bool _3d);
  229. void SetColor(DWORD color);
  230. void SetWidth(float width);
  231. void SetAntialias(bool antialias);
  232. void SetPatten(DWORD patten);
  233. void DrawLine(VECTOR start,VECTOR end);
  234. void DrawPolyline(VECTOR*pointList,int count);
  235. void DrawLaydownCircle(VECTOR center,float radius,int step=80);
  236. private:
  237. DWORD color;
  238. bool _3d;
  239. ID3DXLine* line;
  240. D3DXMATRIX transform;
  241. };
  242. #endif