MMORPG大型游戏设计与开发(客户端架构 part3 of vegine)
无论在何处在什么地方,我们都或多或少的接触到数学知识。特别是在客户端中,从打开界面的那一刻起就有太多与数学扯上的关联,如打开窗口的大小,窗口的位置,窗口里面的元件对象,以及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<viticm@126.com/viticm.ti@gmail.com>
* @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 struct
struct VENGINE_API twoint_vector_t {
public:
twoint_vector_t() : x(), y() {}
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(), y(), z() {}
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为最后一个封装,是屏幕射线的结构,一个是起点坐标,一个是方向的坐标,两个坐标组成了一条线。学习过立体几何的都应该知道,在点与点之间这条直线自然就确定了一个方向。
这两节都讲的比较简单,接下来会讲一下客户端的性能接口模块,其实性能接口就是在引擎接口中实现了的,我们下节再说。
MMORPG大型游戏设计与开发(客户端架构 part3 of vegine)的更多相关文章
- MMORPG大型游戏设计与开发(客户端架构 part8 of vegine)
脚本模块是游戏设计中争论比较多的话题,那是因为作为脚本本身所带来的利弊.其实这都无关紧要,取舍是人必须学会的一项技能,如果你不会取舍那么就让趋势给你一个满意的答复.自从魔兽世界以及传奇(世界)问世以来 ...
- MMORPG大型游戏设计与开发(概述)updated
1.定义 MMORPG,是英文Massive(或Massively)Multiplayer Online Role-PlayingGame的缩写,即大型多人在线角色扮演游戏. 2.技术与知识 在这系列 ...
- MMORPG大型游戏设计与开发(UI SYSTEM SHOW)
接下来一段时间,这些文件可能不再更新,期间我会学习和掌握一些前端知识.虽然我非常欣赏剑侠网络版叁和九阴真经的画面,但是那是一个庞大的游戏引擎,一般人是无法窥伺的,除非你是天才而且要拥有机器毫无中断的毅 ...
- MMORPG大型游戏设计与开发(服务器 游戏场景 核心详述)
核心这个词来的是多么的高深,可能我们也因为这个字眼望而却步,也就很难去掌握这部分的知识.之所以将核心放在最前面讲解,也可以看出它真的很重要,希望朋友们不会错过这个一直以来让大家不熟悉的知识,同我一起进 ...
- MMORPG大型游戏设计与开发(游戏服务器 游戏场景 概述 updated)
我们在玩游戏的时候,我们进入游戏后第一眼往往都是看到游戏世界中的场景,当然除了个别例外,因为那些游戏将游戏场景隐藏了起来,如文字游戏中的地点一样.既然我们接触了游戏世界的核心,那么作为核心的场景又包括 ...
- MMORPG大型游戏设计与开发(客户端架构 part12 of vegine)
在游戏中的交互过程中输入是一个必不可少的过程,比如登陆的时候需要用户输入用户名与密码,就算是单机游戏很多时候也要求用户输入一个用户名作为存档的依据.网络游戏中没有了输入,只用鼠标来交互是不切实际的,因 ...
- MMORPG大型游戏设计与开发(客户端架构 part2 of vgui)
这一节我将讲解vgui的基础系统部分,也是该库提供给外部使用的一些重要接口.作为UI部分比较重要的部分,该节有着至关重要的部分,如果没有看到上一节内容,请留意下面的连接.我们现在可以猜想一下在客户端U ...
- MMORPG大型游戏设计与开发(客户端架构 part16 of vegine)
由于近来比较忙碌和有些困倦的原因,所以关于这部分的文章没有及时更新,一句话:让朋友们久等了!今天所讲的是客户端vengine(微引擎)中最后一个部分,就像上节所说,这一部分的内容比较多.可能有些朋友看 ...
- MMORPG大型游戏设计与开发(客户端架构 part9 of vegine)
时间在人们的生活中是多么重要的东西,如果打乱了时间,不知道这个时间会成什么样子.在客户端中,自然也有时间模块,因为不同的时间可能会处理不同的事情,特别是在追求高度自由化的同时,时间也成为了一个很重要的 ...
- MMORPG大型游戏设计与开发(客户端架构)
首先为所有等待的朋友说一声歉意,实在让大家等的太久.客户端的设计本来就是一个大的工程,而且工作的关系,也没有太多时间在这方面做研究.不过在私下有空的时间,我还是继续着这方面的研究,很遗憾没有用期望的o ...
随机推荐
- 初探百度F.I.S — 由工具到解决方案
1. 前言 阅兵放假三天,我哪儿也没去,宅着看了一些东东:git命令行.svn命令以及下面的主角——百度FIS.对看过的git.svn的命令也做了一些总结,请参见:<git命令学习笔记>和 ...
- MySQL之MySQL5.7安装包(msi文件)在Windows8下安装
最近自己在使用MySQL5.7.16.msi安装MySQL.自己下载的是.msi文件,在安装的过程中遇到了许多文件,网上大部分的Blog都是关于免安装包的安装方法,希望我的方法对大家有帮助. 1,下载 ...
- Web安全之点击劫持(ClickJacking)
点击劫持(ClickJacking)是一种视觉上的欺骗手段.大概有两种方式,一是攻击者使用一个透明的iframe,覆盖在一个网页上,然后诱使用户在该页面上进行操作,此时用户将在不知情的情况下点击透明的 ...
- 解决html表格中内容超出不强制换行和超出宽度自动隐藏并显示省略号
在表格布局中经常会遇到因为表格内容长短的变化导致布局混乱的情况,这个时候我们可能会有为了布局稳定把单元格宽度写死的情况:但是我们设置了宽度却发现超出了宽度之后会自动变大,用css定义元素的overfl ...
- 【思维导图】Fiddler学习笔记
最近在学习Fiddler这款工具,边学边画了如下的思维导图,可以方便自己对这款工具有一个全面的了解. 软件介绍(摘自百度百科):Fiddler是一个http协议调试代理工具,它能够记录并检查所有你的电 ...
- Sharepoint学习笔记—习题系列--70-576习题解析 -(Q78-Q80)
Question 78 You are designing an application configuration approach for a custom SharePoint 2010 app ...
- Ubuntu 安装Samba服务器
1.安装 sudo apt-get update sudo apt-get install samba (如果出现库依赖问题可用命令sudo apt-get install samba libwbcl ...
- iOS 跳转到系统的设置界面
跳到健康设置 上网找了一下 你会发现很难找到.代码如下 不信你试试 . NSURL *url = [NSURL URLWithString:@"prefs:root=Privacy& ...
- iOS--归档和解档(Archiver)、(UnArchiver)
一.已有类型的归档和解档 首先来看一个简单的例子: //第一方式:归档对象 //对象-->文件 NSArray *array = [NSArray arrayWithObjects:@" ...
- nodejs API
1.querystring参数处理 序列化 > querystring.stringify({'name':'scott',course:['jade','node'],from:''}) 'n ...