Articles of 架构

我怎样才能在组件实体引擎中定位精灵?

我正在构建我的第一个组件/实体引擎,我不确定我的一些select。 我在这里问我第一个疑问的建议。 我画了两个不同的行为的对象: 物理驱动的位置。 其他逻辑定义的位置。 目前,我只创建了第一种对象,添加到一些实体的一个Render component (其中包含关于要绘制的精灵的信息)和一个包含正文信息的Physic component 。 Rendering system仅将Render components sprites连接到主视图, Physic System将拥有拥有Physic component每个实体并为每个实体定义精灵位置。 问题1) 直接通过物理系统访问(和修改)Sprites职位是否是一个有效的select? 问题2) 对于第二种types的对象,我应该使用只负责这个的第三个组件来管理精灵位置吗? 这是一个有效的解决scheme,或者我完全错了吗? 我对如何用这种系统管理逻辑和职位感到有点困惑……为我需要定义的每一个行为创建一个组件似乎有点令人难以置信。

需要意见我的基于组件的devise

我有一个实体类和一个组件类。 实体类有一个附加组件的列表,每个组件也有一个成员variables,该variables是对它所连接的实体(循环devise)的引用。 然后,有EntityManager类,它有一个(你猜对了!)实体的列表,每个实体也有一个对其封装实体管理器的引用。 这种周期性devise的原因是由于数据依赖。 为了进一步解释,我的实体类实质上只是一个巨大的数据桶:实例化时,任何types的实体需要的任何数据已经存在于这个类中。 但是,为了使用这些数据,实体需要附加相关的组件。 例如,我的渲染组件将实体的spriteData成员和绘制到后台缓冲区。 没有渲染组件,spriteData不被使用。 由于我的组件需要访问实体的成员variables,所以每个组件都需要对它所连接的实体的引用。 例如,为什么我的实体需要引用实体管理器,这是因为某些组件(例如碰撞)需要访问其他实体的数据桶才能运行(对于碰撞,这将检查附近实体的位置向量并将其与组件的引用实体进行比较)。 除此之外还有更多的东西,但是我只想强调我正在做的事情的核心思想,并且想要一个像这样的周期性方法(只有很less的数据封装)是一个好主意。 也许我只是在过度嘲笑/耸耸肩。 关于如何引导devise的意见也将受到极大的赞赏。

实施爆炸

我想添加爆炸到我的2D游戏,但我很难与建筑。 有几个游戏元素可能是爆炸的原因,比如爆炸桶和子弹(可能会发生连锁反应)。 唯一的select我可以拿出来是: 1 – 有一系列的爆炸,并把它们当作游戏元素,与其他游戏一样重要 优点:有一个单独的数组,更新和绘制所有其他游戏元素数组使得它更有组织和简单的更新,乍一看爆炸桶很容易创建,只需将爆炸数组作为指针到每个炸药桶的构造 缺点:子弹可能很难为vector增加一个爆炸,因为子弹是由位于每个暴徒的武器类射击的,所以可以说,如果我创建一个新的敌人并将其添加到敌人arrays,那个敌人将有一个武器和function可以使用它,如果我想要武器(在这种情况下火箭发射器)有权访问爆炸arrays可以添加一个新的,ID必须通过爆炸arrays作为指向敌人的指针,然后将其传递给武器,并将其传递给子弹(丑陋链)。 我能想到的另一个问题是更奇怪:如果我检查爆炸和桶之间的碰撞(所以我创建一个连锁反应),我发现与桶爆炸碰撞,如果我添加一个新的爆炸,而即时迭代爆炸java会抛出一个exception。 所以这有点烦人,我无法迭代爆炸,并添加一个新的爆炸,我必须以另一种方式做… 另一种不是真正深思熟虑的方式,就是为每一个可能爆炸的元素添加一个爆炸性的元素,以便当它死亡,爆炸或什么,但是我没有很好的方法来实现这个理论 老实说,我不喜欢任何解决scheme,所以编号喜欢知道如何通常由实际的游戏开发者,如果我的问题似乎微不足道,愚蠢对不起。

Node.js锁步多人体系结构

背景 我在客户端 – 服务器体系结构中为多人Node.js / Socket.IO游戏使用了锁​​步模型。 用户input(鼠标或按键)被parsing成客户端上的'attack'和'move'等命令,这些命令被发送到服务器并被安排在特定的时间点执行。 这与将状态数据发送给客户端相反,因为带宽问题,我不想使用它们。 每次打勾,服务器都会将该打勾的命令列表(可能为空)发送给每个客户端。 然后服务器和所有客户端将处理命令并以完全相同的方式模拟该打勾。 有了Node.js,实际上这很简单,因为可能在服务器和客户端之间共享代码。 我只是将确定性模拟器放在可以由服务器和客户端运行的/共享文件夹中。 服务器仿真是必需的,以便有客户端不能改变的仿真权威版本。 问题 现在,游戏中有很多实体类,比如Unit , Item , Tree等。实体在模拟器中创建。 但是,对于每个类,它都有一些共享的方法,一些是特定于客户端的方法。 例如, Unit类具有共享的addHp方法。 它也有getSprite (获取实体的图像), isVisible (检查单元是否可以被客户端看到), onDeathInClient (当它只在客户端上死了,像添加公告一样)和isMyUnit (快速函数来检查客户是否拥有该单元)。 到目前为止,我一直在将所有的客户端函数放到共享的Unit类中,并在必要时添加一个this.game.isServer()检查。 例如,当单位死亡,它会调用if (!this.game.isServer()) { this.onDeathInClient(); } if (!this.game.isServer()) { this.onDeathInClient(); } 。 就function而言,这种方法迄今为止工作得相当好。 但是随着代码库的增长,这种编码风格似乎有点奇怪。 首先,客户端代码显然不是共享的,而是放在/ shared文件夹下。 其次,每个实体的客户端特定variables也在服务器实体(如unit.sprite )上实例化,并且当服务器不能实例化variables(它没有像浏览器那样的Image类)时会遇到问题。 所以我的问题是,有没有更好的方法来组织客户端代码,或者这是一个常见的方式为锁步多人游戏做事情? 我可以考虑一个可能的解决方法,但它确实有它自己的问题。 可能的解决方法(有问题) 我可以使用仅在浏览器中添加的Javascript混搭。 因此,在/ shared文件夹中的/shared/unit.js文件中,最后我会得到这段代码: if (typeof […]

碰撞检测代码结构与倾斜的瓷砖

我正在制作一个基于2D瓦片的游戏,我需要帮助进行碰撞检测。 这个问题不是关于在斜坡上给定水平位置的玩家的垂直位置,而是代码的结构。 这里是我的碰撞检测的伪代码: void Player::handleTileCollisions() { int left = //find tile that's left of player int right = //find tile that's right of player int top = //find tile that's above player int bottom = //find tile that's below player for(int x = left; x <= right; x++) { for(int y = top; y <= […]

在tilemap中表示多个tile对象

我正在构建一个等距的平铺游戏,其中地形和对象由列表的二维数组表示。 地图上的对象的深度来源于瓦片(以及每个瓦片的分类例程),对象通过遍历整个地图而被更新/绘制,并且重要的是要知道瓦片是否被占用或者不被用于交互/碰撞的目的。 现在,我想拥有比单个tile更大的对象(比如2×2或2×3对象)。 这样画他们是微不足道的,但是,有职业检测要求。 将相同的对象或虚拟对象放入数组仅仅是为了表示瓷砖被占用似乎不是一个优雅的解决scheme,但是每次请求瓷砖的占用状态时,也不会检查周围瓷砖是否有可能的大对象。 有没有更优雅的解决scheme,我忽略了?

如何在实体组件系统中实现空间分区?

我的系统在组件上工作,而不需要任何关于实体的事情。 我想实现简单的网格划分,所以每个实体将根据其当前位置被赋予一个单元格。 但是系统如何知道哪些组件要更新? 例如:CollisionSystem必须检查单元内的每个组件之间的碰撞,但CollisionComponents必须以某种方式附加到网格上,以便系统知道要testing哪个碰撞,这似乎不是一个好的解决scheme。 我该怎么办?

国际象棋游戏(国际象棋)的服务器结构

我正在做一个基于回合的游戏(国际象棋) 我已经完成了客​​户端和单人模式,所以AI在这里没有问题。 但唯一的问题是现在我想让我的项目多人游戏。 我已经完成了设置和检索高分和其他信息的部分。 现在我卡在服务器结构,因为我不知道要使用哪个服务器: 我的游戏多人游戏结构: 用户login 可以select3间客房 每个房间里面有10个层次(房间) 游戏会根据玩家的等级自动发送每个玩家到一个幕布房间 玩家将被分配到彼此并开始游戏 每个玩家都有30秒的时间进行动作,否则他们就会失去动作 最后分数将被发送到数据库 朋友提示的选项: SmartFox Google App Engine 为什么不使用上述服务器: 一些我不需要的function(性能) 我的项目是一个小项目(自学不需要准备服务器) 为了教育目的,我需要自己做 程序使用的语言: Clint-> C# 服务器 – > PHP,SQL 问题: HTTP是否足以处理500-1000个用户? 可以在Unity2D中使用WWW和WWWFORM处理这类游戏? 如果没有任何select? 谢谢

animation和逻辑结合的最佳实践

在游戏中,我经常遇到这种情况: 游戏逻辑决定了一些事情发生,当然逻辑是这样做的。 但游戏也有animation取决于逻辑。 像玩家去世 – >玩死亡animation – >重生。 但逻辑不能等待animation,所以我们必须解决这个问题。 或者把星际争霸2的攻城坦克当成变形单位,然后开始攻城animation,但逻辑是什么状态。 每个animation是否也有一个状态? 它只是一个无视所有animation的标志吗? 当我包括越来越多的animation时,它往往变得非常混乱。 希望有人能给我一个提示。

组件 – 实体系统代码生成

我真的很喜欢组件实体的方法(我目前正在使用ASH haxe,但特定的语言/框架并不重要)。 然而,问题是 – 有太多的基本类需要频繁更新。 所以我想有像组件和节点的ymlconfiguration文件,并从中生成实际的类。 有没有现有的解决scheme,利用这样的codegen,或者一些通用的codegen解决scheme,应该很容易configuration这样的任务?