首页 > 代码库 > 基于C/S架构的3D对战网络游戏C++框架_03客户端详细设计与OpenGL、Qt基础
基于C/S架构的3D对战网络游戏C++框架_03客户端详细设计与OpenGL、Qt基础
本系列博客主要是以对战游戏为背景介绍3D对战网络游戏常用的开发技术以及C++高级编程技巧,有了这些知识,就可以开发出中小型游戏项目或3D工业仿真项目。
笔者将分为以下三个部分向大家介绍(每日更新):
1、实现基本通信框架,包括对游戏的需求分析、设计及开发环境和通信框架的搭建;
2、实现网络底层操作,包括创建线程池、序列化网络包等;
3、实战演练,实现类似于CS反恐精英的3D对战网络游戏;
技术要点:C++面向对象思想、网络编程、Qt界面开发、Qt控件知识、Boost智能指针、STL算法、STL、容器、Boost网络库、OpenGL坐标变换、OpenGL加载3D模型、MD2模型加载、MDL模型加载
好了,下面就让我们来开始今天的学习之旅,今天我们将进行客户端的详细设计,同时带大家熟悉OpenGL的相关知识及使用和Qt的相关知识及应用,为了深入的学习和研究,这个游戏框架的客户端我没有选择用Cocos、Unity、UE等游戏引擎直接进行制作,而是选择了Qt和OpenGL,对Unity引擎进行实战游戏开发感兴趣的可以关注我后续会发表的其他博客,感谢大家的支持~。
一、OpenGL基础
(1)什么是OpenGL:
OpenGL是一套应用程序编程接口(API),借助这个API我们开发人员就可以开发出对图形硬件具有访问的能力的程序。我们可以使用OpenGL开发出运行效率较高的图形程序或游戏,因为OpenGL非常接近底层硬件并且OpenGL使得我们不必去关注图形硬件的细节。既然我们开发人员不必关注图形硬件的细节,那么我们需要关注什么呢?我们需要关注OpenGL如何绘制,按照专业术语就是根据物体的规格参数及相关属性,借助虚拟照相机和光照生成一幅该物体的图像。OpenGL程序与平台是无关的,所以OpenGL API中不包含任何输入函数或窗口函数,原因是因为这两种函数都要依赖于特定的平台,例如Windows,Linux或是其他系统。
OpenGL API是过程性的,不是描述性的,即OpenGL不是面向对象的,所以OpenGL无法利用面向对象的特性,例如重载,继承等,但是我们可以使用面向对象的程序与OpenGL的实现进行链接就可以了。作为开发人员来说,我们不需要去描述场景的性质和外观,而是去确定一些操作步骤,为些操作步骤是为实现一定图形或图像所服务的。我们在实现这些步骤时可以调用OpenGL中的一些命令,可以利用这些命令绘制点、直线、多边形或是其它图形,还可以调用这些命令实现光照、着色,动画等各种效果。
OpenGL的实现可以是软件实现,也可以是硬件实现。软件实现是对OpengGL函数调用时作出的响应并创建二维或三维图像的函数库,那么硬件实现则是通过设置能够绘制图形或图像的图形卡驱动程序。一般来说,硬件实现要比软件实现快得多。我们都应该熟悉,在Windows上,是由图形设备接口将图形或图像显示在屏幕上或是其他显示设备上的。OpenGL的实现就软件实现来说,在Windows上会根据程序命令的要求,生成相应的图形或图像,然后会将这个图形或图像移交给图形设备接口,由图形设备接口将图形或是图像显示在我们的屏幕上或是其他显示设备。这样一说,我们可能会明白一点OpengGL原来是在应用程序和图形设备接口之间运作,但我感觉还不能准确地这样说。大家看下下面的图对OpenGL的工作原理可能会理解得更明白一点:
上图是OpenGL的软件实现的工作原理。需要注意的是上图中的构造图形是通过软件进行构造的。
OpenGL的硬件实现与软件实现稍微有些不同,硬件实现是将OpenGL的调用传递给硬件驱动程序,而硬件驱动程序不会将生成的图形或图像传递给图形设备接口,而是直接与显示设备通信,直接将图形或图像结果传递给显示器或其他显示设备。如下图所示:
OpenGL在绘制图形时是基于一个被称为流水线模型的模式。也就是说其中的几何图形在程序中通过描述空间位置或顶点来指定其形状并由程序生成,这些顶点在流经一系列模块时,每个模块在图形的基本组成部分(在这里称为图元)经过时对其实施一种或多种操作。模块负责对流经的图元实施一种或多种操作变换,例如:旋转、平移、缩放及对摄像机进行定位等。
(2)OpenGL的组成
OpenGL中包含许多对图形图像处理的函数,主要包括以下几种:
图元函数:指定要生成图形或图像的图元。主要有两种类型,一种是绘制二维或三维的几何图元,如点,线,多边形等;另一种是离散型的实体,例如:位图。
属性函数:属性函数主要是控制图元的外观及样式,例如:对图元的颜色、线型、光照及纹理等效果处理。
观察函数:观察函数主要是对摄像机属性的操作。我们可以操作摄像机显示图形或图像近距或是远距效果。
控制函数:能够让我们启用或是彬各种OpenGL的特性。
查询函数:可以让我们查询OpenGL状态变量的值。
输入与窗口控制函数:这个本身不属于OpenGL,但是由于我们会经常在程序中输入输出或是窗口控制操作,所以,这些函数还是比较重要的。
二、Qt基础
(1)什么是QT:
Qt是1991年奇趣科技开发的一个跨平台的C++图形用户界面应用程序框架。它提供给应用程序开发者建立艺术级的图形用户界面所需的所有功能。Qt很容易扩展,并且允许真正地组件编程。基本上,Qt 同 X Window 上的 Motif,Openwin,GTK 等图形界 面库和 Windows 平台上的 MFC,OWL,VCL,ATL 是同类型的东西。
(2)为什么选用QT:
1.支持各大主流桌面操作系统:mac、windows、linux
2.提供大量的库:xml、数据库、线程、网络、容器、智能指针、正则、OpenGL等等
3.C++开发,执行速度比Java和C#快得多
4.堪称典范的开发文档
5.支持LGPL免费授权
6.快速实用的UI设计器
7.单根继承和元对象系统,弥补了C++的一些不足
8.优美的接口,清晰的代码,是最漂亮的C++库之一
9.强大的内存管理
三、游戏客户端设计
(1)思考:
根据之前对客户端的分析和设计,我们如何对客户端进行一个详细设计?
(2)类图:
四、3D场景模块设计
(1)思考:
根据对3D界面的显示需求以及3D场景模块的关接口需求,应该从哪些方面考虑该模块的详细设计?
(2)类图:
欢迎大家学习交流,如有不足恳请批评指正,转载请注明出处,感谢您的支持。如果您也喜欢我的博客可以持续关注我,让我们一起成长,共同进步。
生活很精彩 剔除杂质,留下对编程的穷极探索 纯粹追求。
基于C/S架构的3D对战网络游戏C++框架_03客户端详细设计与OpenGL、Qt基础