OOP 第8章:Container
第8-1章 Container8.1 STL8.1.1 STL定义(1)STL = Standard Template Library
(2)是ISO Standard C++ Library的一部分
(3)包含C++实现的数据结构、算法
8.1.2 STL的三个部分(1)Containsers:容器
(2)Algorithms:算法
(3)Iterators:迭代器
8.2 顺序访问的容器(1)vecotor:可变长数组
(2)deque:双向队列
(3)list:双向链表
(4)forward_list
(5)array
(6)string:字符数组
8.2.1 vector#include <vector>using namespace std;//定义及初始化vector<Elem> c;vector<Elem> c1(c2);vector<int> v(100); //预分配100个元素的内存地址//方法v.size();v.empty();==,!=,>,<,<= ...
OOP 第7章:Polymorphism 多态
第7章 Polymorphism 多态7.1 类型转换 Conversions(1)public继承,应该包含替换:即将子类转成父类(子类是父类的超集)
(a)如果B是A的子类,那么能使用A的地方,一定能使用B
(b)如果B是A的子类,那么对A成立的,对B也成立
class A{ int m_a;public: int getA(){m_a = 0; return m_a;}}class B : public A{ int getA(){m_a = 10; return m_a;}}void func(A a){ cout << getA();}int main(){ B b_ins; func(b_ins); //此时,会将b_ins转换为A类型,因此其输出为0}
7.1.1 向上转换 UpcastManager pete("Pete", "444- ...
OOP 第6章:Inline and Inheritance
第6章 Inline and Inheritance6.1 Inline6.1.1 函数调用的基本流程(1)将参数、返回地址压栈
(2)计算返回值
(3)将栈中的所有内容出栈
6.1.2 inline的原理将短函数转化为类似宏定义,在调用处将函数展开,如下图
6.1.3 inline的使用注意(1)inline函数的函数体需要定义在头文件内
(2)inline的函数调用的代码,可能不会在*.obj中存在(直接被编译器在调用inline函数的地方展开了)
(3)inline函数是声明,而不是定义
(4)inline函数由于是直接展开,其会增加代码的长度
(5)inline函数是否展开,由编译器决定,当函数太大/递归,就不会展开
(6)有的编译器不实现inline
6.2 对象的组合 Composition(1)直接在一个class中,实例化另一个class,作为自己的成员变量
(2)调用的class必须有缺省构造函数
class Person { … };class Currency { … };clas ...
OOP 第4章:Object Interactive
第4章 Object Interactive构造函数的调用顺序:基类 → 成员变量 → 派生类
析构函数的调用顺序:派生类 → 成员变量 → 基类
4.1 构造函数4.1.1 构造函数的作用(1)函数名与类名相同
(2)通过编译器调用,进行初始化,保证实例化的类一定会初始化
class X{ int i;public: X();};void f(){ X a;//此时,等同于调用a.X()}
4.1.2 构造函数的参数class Tree{ int i;public: Tree(){}; Tree(int i){...}}void f(){ Tree t(12);}
(1)构造函数可以有很多个
(2)如果仅定义了一个带参数的构造函数,那么缺省构造函数会丢失,在实例化时,必须添加参数
struct Y{ float f; int i; Y(int a);};Y ...
OOP 第3章:class
三、class3.1 C语言–面向过程
定义:定义结构体、对结构体的操作函数
使用:传入结构体指针、对应的参数
// 定义typedef struct point { float x; float y;}Point;void print(const Point *p){ printf("%f %f\n",p->x,p->y);}void move(Point* p,int dx,int dy){ p->x += dx; p->y += dy;}// 使用Point a;a.x = 1;a.y = 2;move(&a,2,2);print(&a);
3.2 C++语言–面向对象
定义:将对象和操作绑定到一起
使用:操作Point对象
// 定义class Point{public: void init(int x,int y); void move(int dx,int dy); void prin ...
OOP 第2章:Using Object
二、Using Object2.1 string#include <string>using namespace std;// 定义string str1 = "Hello", str2, str3;// 输入、输出cin >> str1;cout << str1;printf("%s", str1.c_str());// 运算str2 = str1;str3 = str1 + str2;str1 += str2;str1 += "lalala";// 构造函数string s1("Hello"), s2("World");string(const char *cp, int len);string(const string& s2, int pos);string(const string& s2, int pos, int len);// 子串substr(int pos, int len);// 修改串assign() ...
GAMES104-18:网络游戏的架构基础
十八、网络游戏的架构基础18.1 同步算法18.1.1 快照同步Snapshot
如Quake
步骤:
客户端:把输入发送给服务器
服务器:将所有客户的输入集合起来,在服务器中进行游戏世界的模拟,然后将游戏世界的状态生成快照返回给客户端
客户端:拿到服务器给的快照后,将所有对象设置为对应的状态,然后进行渲染
优点:
结构清晰,保证了绝对的一致性,无法作弊
不用担心同步的问题
客户端只负责输入和最后的渲染
当客户端非常多时,服务器的计算量是最低的,因为只需要对世界模拟一次即可
针对实际情况的改进:
服务器端的帧率通常会很低,需要客户端进行插值
快照可能包含非常多的信息,但是相邻两帧通常差距不大,因此可以只传delta,从而降低信息量
缺点:
浪费了客户端的算力
服务器生成快照传递给每一个客户端,会占用非常大的服务器处的上行带宽
18.1.2 帧同步Lockstep
如DOOM、王者荣耀
步骤:
每一帧:客户端把输入统一交给服务器
服务器等待所有服务器提交输入,然后把所有输入分发给客户端
客户端得到服务器的指令,做一致的游戏逻辑模拟,得到的 ...
GAMES104-14:工具链:高级概念及应用
十四、工具链:高级概念及应用14.1 World Editor
A hub for everything to build the world
14.1.1 World Editor中的编辑工具14.1.1.1 Editor Viewport用户和游戏世界交互的窗口
底层跑的实际上就是引擎的runtime,但是是以editor mode
引擎有一些代码会是editor-only
Viewport有时是不止一个的,需要改造引擎支持多个viewport
14.1.1.2 可编辑游戏对象
由对象的属性,反射出的一个schema,可以直接修改对象的属性
14.1.1.3 内容浏览器
资产不一定是在本地,也可能是在数据库
内容浏览器负责将所有的资产显示到引擎中,从而不需要专门去某个静态文件夹中找
将静态文件夹转化为内容的ocean
14.1.1.4 总结
14.1.2 鼠标选取Ray Casting:通过射线检测,与物体的包围盒碰撞,表示选取哪个物体
透明物是不写入depth buffer的,需要特殊处理:如在part ...
GAMES104-13:工具链:基础
十三、工具链:基础13.1 工具链
工具链的任务:
让不同思维方式的人,能够共同工作
对于不同的人,打开同一个游戏,关注的侧重点、看到的形式都是不同的
13.2 复杂的工具13.2.1 GUI
13.2.1.1 直接模式 Immediate Mode直接由游戏逻辑绘制GUI
优点:简单易实现
缺点:难以扩展
13.2.1.2 Retained Mode将要画的东西存储到一个buffer中,绘制时根据这些指令自动绘制
优点:将UI的逻辑和渲染划分开,扩展性好,性能高(绘制指令集中在一起)
13.2.2 设计模式13.2.2.1 MVCModel:数据
View:根据model进行渲染
Controller:修改model
13.2.2.2 MVPModel:数据
View:根据presenter的指令更新界面,并反馈给presenter用户事件
Presenter:从model中取数据,并更新model
13.2.2.3 MVVMModel:数据
ViewModel:由程序员编写,将view与对应的model ...
GAMES104-12:特效:粒子和声效系统
十二、特效:粒子和声效系统12.1 粒子基础12.1.1 粒子空间中的一个面片/3D模型,包含如下属性:
位置、速度、大小、颜色、生命周期
12.1.2 粒子的生命周期
12.1.3 粒子发射器发射器设置粒子的随即初始值:
随机速度、随机方向
12.1.4 粒子生成生成位置:
单点、区域、mesh
生成模式:
连续型、爆发型
12.1.5 粒子模拟
可以改变粒子的
位置、旋转、颜色、大小
与环境产生碰撞
12.1.6 粒子的类型12.1.6.1 Billboard Particle一个面片,始终朝向摄像机
12.1.6.2 Mesh Particle每个粒子都是一个3D模型
每个particle都不一样,可以通过XYZ方向的随机放缩&旋转实现
12.1.6.3 Ribbon Particle每个粒子拖出的是一条光带
粒子在飞行的过程中,会拉出一个个额外的控制点
每个粒子有一定的宽度,把一个个控制点连接在一起
一般会使用样条曲线插值,使用Catmull曲线
12 ...