
MMORPG大型游戏设计与开发(客户端架构 part3 of vegine)
发布日期:2021-05-09 04:33:04
浏览次数:10
分类:博客文章
本文共 4194 字,大约阅读时间需要 13 分钟。
无论在何处在什么地方,我们都或多或少的接触到数学知识。特别是在客户端中,从打开界面的那一刻起就有太多与数学扯上的关联,如打开窗口的大小,窗口的位置,窗口里面的元件对象,以及UI的坐标等等。而在进入游戏之后,不仅有这些坐标,还有了世界的坐标,以及场景坐标,还有粒子对象的各种属性值。但为什么要扩展ogre的数学库呢?就让我们看看有哪些类型的吧。
CODE
文件math/base.h
/** * PAP Engine ( -- ) * $Id math.h * @link -- for the canonical source repository * @copyright Copyright (c) 2013-2014 viticm( viticm@126.com ) * @license * @user viticm* @date 2014-3-12 11:15:08 * @uses the base config macros and defines, also with system include */#ifndef VENGINE_MATH_BASE_H_#define VENGINE_MATH_BASE_H_#include "vengine/config.h"namespace vengine_math {namespace base {struct VENGINE_API twofloat_vector_t { public: inline twofloat_vector_t& operator = (const twofloat_vector_t& vector) { x = vector.x; y = vector.y; return *this; } inline bool operator == (const twofloat_vector_t& vector) const { return (x == vector.x && y == vector.y); } inline bool operator != (const twofloat_vector_t& vector) const { return ( x != vector.x || y != vector.y ); } inline twofloat_vector_t operator + (const twofloat_vector_t& vector) const { twofloat_vector_t sum; sum.x = x + vector.x; sum.y = y + vector.y; return sum; } inline twofloat_vector_t operator - (const twofloat_vector_t& vector) const { twofloat_vector_t diff; diff.x = x - vector.x; diff.y = y - vector.y; return diff; } inline twofloat_vector_t operator * (float scalar ) const { twofloat_vector_t prod; prod.x = scalar * x; prod.y = scalar * y; return prod; } inline friend twofloat_vector_t operator * (float scalar, const twofloat_vector_t& vector) { twofloat_vector_t prod; prod.x = scalar * vector.x; prod.y = scalar * vector.y; return prod; } inline float length() const; float normalise(float aimlength = 1.0f); public: twofloat_vector_t() : x(0.0f), y(0.0f) {} twofloat_vector_t(float _x, float _y) : x(_x), y(_y) {} public: float x; float y;};//tow int32_t vector structstruct VENGINE_API twoint_vector_t { public: twoint_vector_t() : x(0), y(0) {} twoint_vector_t(int32_t _x, int32_t _y) : x(_x), y(_y) {} public: int32_t x; int32_t y;};struct VENGINE_API threefloat_vector_t { public: inline threefloat_vector_t& operator = (const threefloat_vector_t& vector) { x = vector.x; y = vector.y; z = vector.z; return *this; } inline bool operator == ( const threefloat_vector_t& vector) const { return (x == vector.x && y == vector.y && z == vector.z); } inline bool operator != ( const threefloat_vector_t& vector ) const { return (x != vector.x || y != vector.y || z != vector.z); } inline threefloat_vector_t operator + (const threefloat_vector_t& vector) const { threefloat_vector_t sum; sum.x = x + vector.x; sum.y = y + vector.y; sum.z = z + vector.z; return sum; } inline threefloat_vector_t operator - (const threefloat_vector_t& vector) const { threefloat_vector_t diff; diff.x = x - vector.x; diff.y = y - vector.y; diff.z = z - vector.z; return diff; } inline threefloat_vector_t operator * (const float& mult) const { threefloat_vector_t vector; vector.x = x * mult; vector.y = y * mult; vector.z = z * mult; return vector; } inline float length() const; float normalise(float aimlength = 1.0f); public: threefloat_vector_t() : x(0.0f), y(0.0f), z(0.0f) {} threefloat_vector_t(float _x, float _y, float _z) : x(_x), y(_y), z(_z) {} public: float x; float y; float z;};struct VENGINE_API threeint_vector_t { public: threeint_vector_t() : x(0), y(0), z(0) {} threeint_vector_t(int32_t _x, int32_t _y, int32_t _z) : x(_x), y(_y), z(_z) {} public: int32_t x; int32_t y; int32_t z;};struct VENGINE_API floatray { public: threefloat_vector_t origin; threefloat_vector_t direction;};}; //namespace base}; //namespace vengine_math#endif //VENGINE_MATH_BASE_H_
总结
从上面的代码中不难看出,扩展的数学库将二维坐标、三维坐标,以整型与浮点的形式进行了结构体的封装,而这些正是在3D游戏中经常用到的各种坐标数据类型。floatray为最后一个封装,是屏幕射线的结构,一个是起点坐标,一个是方向的坐标,两个坐标组成了一条线。学习过立体几何的都应该知道,在点与点之间这条直线自然就确定了一个方向。
这两节都讲的比较简单,接下来会讲一下客户端的性能接口模块,其实性能接口就是在引擎接口中实现了的,我们下节再说。
发表评论
最新留言
留言是一种美德,欢迎回访!
[***.207.175.100]2025年04月13日 05时42分30秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
(数据科学学习手札27)sklearn数据集分割方法汇总
2019-03-06
(数据科学学习手札40)tensorflow实现LSTM时间序列预测
2019-03-06
8 个警示和学习的 5 个阶段
2019-03-06
从零开始学安全(十六)● Linux vim命令
2019-03-06
阿里巴巴Json工具-Fastjson教程
2019-03-06
Spring Cloud Gateway - 快速开始
2019-03-06
Java对象转JSON时如何动态的增删改查属性
2019-03-06
Python 面向对象进阶
2019-03-06
Linux常用统计命令之wc
2019-03-06
Git安装及使用以及连接GitHub方法详解
2019-03-06
docker容器与虚拟机的区别
2019-03-06
shell脚本里使用echo输出颜色
2019-03-06
并发编程——IO模型详解
2019-03-06
Java之封装,继承,多态
2019-03-06
wait()与notify()
2019-03-06
使用js打印时去除页眉页脚
2019-03-06
Spring security OAuth2.0认证授权学习第二天(基础概念-RBAC)
2019-03-06
ORA-00904: "FILED_TYPE": 标识符无效
2019-03-06
java中DelayQueue的使用
2019-03-06
线程stop和Interrupt
2019-03-06