![](https://img-blog.csdnimg.cn/20201014180756926.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
AI
文章平均质量分 74
PureDesigner
这个作者很懒,什么都没留下…
展开
-
游戏逻辑底层,MainLoop&&FSM&&MSG(一)
MainLoop–游戏主循环简单的程序主要分为两个线程,一个线程负责处理界面刷新(一般需要较高FPS),另一个线程负责处理程序逻辑(刷新频率较低),此篇文章主要介绍游戏的逻辑线程,我称之为GameMainLoop(以下简称ML)。 基本的ML很简单,定义逻辑刷新频率,定义刷新执行事件,我们直接来看代码MainLoop.h//headers...typedef std::function<void(原创 2016-04-06 00:47:34 · 859 阅读 · 0 评论 -
导航图,无向稀疏连通图
前言数据成员从xml加载保存添加和删除顶点添加和删除边清空根据id获取顶点To be continued前言我们上一篇描述了需求,这一篇详细地实现图类。数据成员public class SparseGraph:GraphRemote { protected Dictionary<int, object> _objects = new Dictionary<in原创 2017-01-12 18:05:51 · 672 阅读 · 1 评论 -
导航图寻路(三)--Dijkstra代码实现
前言前一篇我们描述了Dijkstra的算法,这篇文章中我们会将它变成c#代码。纠正几个错误之前我们的文章中,存放边界顶点用的数组,应该是栈,这样便于代码描述,但是如果想优化速度,可以使用数组,我们将在下面说明如何优化。之前我们在重载EdgeBase类的==运算符时,没有加入对null类型的判断,应该改为: public static bool operator ==(EdgeBase self原创 2017-01-17 16:54:32 · 1868 阅读 · 0 评论 -
导航图寻路(二)--Dijkstra
前言之前的几篇文章我们描述了图作为一种容器的基本属性和作为树形结构的基本算法。 在探讨Dijkstra算法之前,请准备好笔和纸,我们一起来画一画该算法的解决过程,否则你将很难理解该算法。先行知识问题: 求一个带权无向图两个顶点b,e的最短路径p P {b - e} = P {b - … k - … - s … - e},k和s为路径p上的两个顶点 如果P为最短路径,那么这条路径的部分路原创 2017-01-13 17:20:46 · 734 阅读 · 1 评论 -
GeoHash补充
最近在逛cocoa的时候发现有一些小细节可以优化的 - 我们在设定二分精度时可以设置精度为个体的影响范围为精度,这样我们在搜索的时候可以直接用“==”而非“like” - 我们可以不用进行base32编码,直接将其转化为unsinged long,可以大大减少计算,数据库使用字符串是因为很多数据库对字符串类型有很好的支持,c上面用字符串效率低得可以 - 之前那个写得仓促,有很多错误没整理,这次原创 2016-05-09 16:03:31 · 540 阅读 · 0 评论 -
游戏底层逻辑,空间划分
前言 不知道大家注意到之前有一个寻找相邻个体的方法叫做getNeighbors没有,该方法的实现如下: - 遍历所有个体,计算距离是否小于一定范围,确定邻居 我们可以预知,该方法在个体总数较小的时候效率较高,一旦个体数突破上百个,就很容易造成极大的cpu开销,所以此处我们需要研究出另外的索引方案来得到邻居。空间划分的方案主流的有很多,例如四叉树,八叉树,bsp树,四叉树主要用于原创 2016-05-07 14:17:54 · 2777 阅读 · 0 评论 -
游戏底层逻辑,运动&&寻路(五)
终于要开始激动人心的Flocking集群行为了,不过在讨论集群行为之前,我们要先来探讨一些很有意思的哲学逻辑。Emergent Behaviors涌现行为这里先安利一本神作《失控》,看了这本书,我相信对整个人工智能,社会学,人类学和分布式理论都会有极大地认知提高。我们先讲一讲蜂巢现象: 一群蜜蜂,他们并没有中枢参与控制,蜜蜂仅仅能做一些基本行为,例如:四处乱飞,找到视野里的花朵,接收一定范围内其原创 2016-04-20 00:32:36 · 1276 阅读 · 0 评论 -
游戏底层逻辑,运动&&寻路(四)
接着上次的来,我们在群体算法之前把基本的个体运动解决掉。9、WallAvoidance避开墙壁此处的墙被抽象为一条线段,不论你的游戏使用的是一条线段作为墙面的碰撞检测,或者用一个几何形状作为墙面,几何形状我们可以看作多条线段的集合,都可以用此方法。墙类的实现首先是线段类,作为基类,拥有几种几何计算的方法,便于计算平面线段的交点,不多说。struct Seg{ Seg(Point p1, P原创 2016-04-19 13:17:31 · 1579 阅读 · 0 评论 -
游戏AI--决策(1)
机器学习的引入机器学习最近由于AlphaGo和数据挖掘的大热而变得流行起来,然而我们可以让它变得更加cool,在接下来的模块中,我将讲述我对游戏中应用机器学习的理解以及我的现有成果。应用机器学习的意义游戏进行中,尤其是网络游戏,会积累大量的数据,数据赋予了计算机行为意识,而我们如果能“告诉”计算机数据归纳总结的方法,那计算机可能会产生惊人的思维能力,而机器学习就是这样的一种神奇的工具。前景目前的游戏原创 2016-05-26 12:00:51 · 1479 阅读 · 0 评论 -
游戏底层逻辑,运动&&寻路(三)
上篇文章我们解释了几种基本的控制力,今天我们会讨论几种较为复杂的行为,涉及了碰撞,以及辅助图形进行运动控制。7、Wander徘徊(巡逻)徘徊(四处巡逻)是一种很常见的行为,但是要得到smoothly平滑的转向行为,并不是特别容易,这里有一种借用辅助圆实现的平滑移动。如图,我们在物体前面构造了一个辅助圆,我们控制目标点,从而用seek方法控制运动行为,如果我们让目标点在圆周上运动,就可以产生一个力,他原创 2016-04-16 10:42:07 · 4351 阅读 · 0 评论 -
游戏底层逻辑,运动&&寻路(二)
目标驱动产生控制力我们知道一个合理的物理世界的运动不是自发的,也不能是突发的。我们不能突然的moveTo。我们首先知道,由牛顿定理可知,物体的变速需要力的作用,而在游戏世界里,力不是由其他物体施加的,而是由目标驱动的,这一原则将是接下来运动的基本哲学。运动物体我们先抛开实体的详细设计,在控制力实现过程中逐步添加实体属性。 这里有一个简单的可运动物体的设计(省略了ctor&set&get):Movi原创 2016-04-12 09:32:36 · 873 阅读 · 0 评论 -
游戏底层逻辑,运动&&寻路(一)
从今往后的项目,由于需要图形化界面,所以建立在cocos2d 3.4引擎基础之上。 说到运动,不得不复习一下平面向量的有关知识(忘完了,尴尬 ^_^;) 这里我就不多做讲解了,向量方面需要用到点乘,内积,外积,矩阵变换,转角之类的,还好基本的引擎都带有matrix和vector2d的库。先给大家展示一下《游戏人工智能编程》中的例子(自己的还没写好) 此例子中呈现了原创 2016-04-07 21:07:15 · 1161 阅读 · 0 评论 -
游戏底层逻辑,MainLoop&&FSM&&MSG(四)
Entity–实体今天我们把游戏逻辑集成起来,看一下状态机和消息分发具体的引用过程。 BaseEntity.hclass BaseEntity{public: BaseEntity(int IDcount) { setID(IDcount); } ~BaseEntity(){}; int ID() const {原创 2016-04-06 21:02:32 · 664 阅读 · 0 评论 -
游戏逻辑底层,MainLoop&&FSM&&MSG(三)
FSM–有限状态机今天我们来探讨一下Finite State Machine,有限状态机,简称FSM,有兴趣的同学可以看一下《游戏编程中的人工智能》这本书,写得很经典(无论从代码上来说还是思维上来说),此次的例子基本是在此书的思想结构上来编程的。FSM的基本思想我不多赘述,我们只关注代码的实现。首先是State基类 State.htemplate<class Type>class State{原创 2016-04-06 09:49:29 · 586 阅读 · 0 评论 -
游戏底层逻辑,MainLoop&&FSM&&MSG(二)
MSG消息机制准备写一个有关游戏底层算法物理算法以及AI重点是机器学习在游戏中的应用的长篇博客欢迎大家指正交流MSG–消息机制学过操作系统的同学们都知道,windows底层的数据传递有一个完善的消息机制(当时读书的时候也是烦透了PeekMsg这种东西,不过不得不说现在想起来其实操作系统是一门很有用的软件架构设计的书,操作系统基本包含了所有的基本软件体系架构),好了,闲谈无多,我们来看看代码。 首原创 2016-04-06 09:07:00 · 546 阅读 · 0 评论 -
导航图寻路(一)
通用算法我们先来讲基础的算法,树形结构基本都能使用的算法。辅助函数辅助函数和类,为了书写方便,path使用了类似c++迭代器的设计。int nextEdge(VertexBase v, List<bool> visited) { for (int i = 0; i < v.Edges.Count; ++i) {原创 2017-01-13 11:08:37 · 551 阅读 · 0 评论