Questions tagged «data-structure»

用于以特定方式组织数据以便可以有效使用的实体。例如数组,对象,记录,结构。

5
有没有办法使诸如MMORPG的动态世界水平扩展?
想象一下,一个拥有500多个播放器的开放世界,其数据更改速度高达20个更新/播放器/秒。上一次我在类似的MMORPG中工作时,它使用SQL,因此很笨拙,无法始终查询数据库。而是将所有播放器作为C ++对象从数据库加载到内存中并使用它们。也就是说,它是垂直缩放的。可以使该服务器水平扩展吗?是否有一个旨在同时支持该数量的更新的数据库?

3
如何实现快速,准确的2D碰撞检测?
我很清楚如何检测两个或多个2D对象是否碰撞,但是我对如何决定是否检查碰撞感兴趣。在以前的项目中,我只是让每个对象都与其他每个对象进行检查(我知道,O(n ^ 2)级的愚蠢程度),并且创建的游戏性不那么流畅。 各种论坛都赞扬四叉树,B树以及您能想到的任何其他种类的树或结构的伟大之处。 确定是否应检查碰撞的最有效结构是什么?

5
逻辑游戏的数据结构/演绎规则/线索的充足集合?
我一直在忙于开发类似于爱因斯坦的《拼图》的逻辑游戏,该逻辑游戏每次重播都会有不同的线索。 您将使用什么数据结构来处理不同的实体(宠物,房屋的颜色,国籍等),演绎规则等,以确保您提供的线索指向独特的解决方案? 我很难思考如何使演绎规则与可能的线索一起发挥作用。任何见识将不胜感激。

3
如何添加敌方AI可以听到的声音?
鉴于: 2D自上而下的游戏 切片仅存储在2D阵列中 每个瓷砖都有一个属性-阻尼(所以砖可能是-50db,空气可能是-1) 我想从中添加它,以便在点x1,y1处产生声音,并“涟漪”出来。下图显示了更好的轮廓。显然,最终目标是AI敌人可以“听到”声音-但是如果墙壁挡住了声音,声音就不会传播到最远。 红色是墙,阻尼值为50db。 我认为在第三局打勾中我的数学困惑。 实施此方法的最佳方法是什么?

3
处理破坏游戏实体的正确方法
想象一下一个游戏世界,其中始终不断地动态加载实体的负载,我可能将其表示为实体的列表,但是如何删除它们呢? 在添加时,我可能会推迟新实体,但可能需要删除容器中的任何位置。为了避免搜索元素以找到要删除的位置,我有哪些选择? 我坚称我可以将实体ID作为其在容器中的位置存储,从而创建直接删除的路径,但是会不会产生某种相互依赖的“混乱”? 我知道正确的方法是类似List.RemoveAt(whereToRemove);。但是,如果只有实体知道何时应该死去怎么办? 还是我只是缺少一些东西,而列表容器会知道对象何时被破坏并减小其自身大小?

1
形状(矩形)如何在四叉树中工作?
有人告诉我,四叉树是我的游戏的理想数据结构,但是我在理解形状在四叉树中的工作方式时遇到了麻烦。 我正在用JavaScript进行此操作,但我认为这些问题可能适用于任何语言的四叉树。 我想我最了解基本(x,y)点和点插入在四叉树中的工作原理,并且我可以在纸上做到这一点。 这是我尝试点的JSfiddle。 除了一个案例,我的分数测试按预期进行。 但是,当涉及矩形等形状时,我的困惑就开始了。当从具有形状的四叉树中检索时,它会检查形状的每个点以及它们落入哪些节点?当形状插入接受每个形状的(x,y,width,height)参数时,形状插入甚至如何工作?它是否使用起点的宽度/高度来计算其他角点,然后将其分配到适当的节点中?如果插入的形状跨越四个节点,该形状的数据是否保存到所有四个节点中? 当检索方法接受形状作为参数(x,y,width,height)时,实际上是怎么回事?是否首先查看形状要插入到哪个节点,然后检索这些节点的所有对象? 我有一个使用shape的JSfiddle,但是我对测试结果完全感到困惑。我正在收到重复的对象! 例如,红色方块等效于我输入到检索方法中的参数。我认为,由于这个红色正方形跨越了所有四个节点,因此它应该返回四叉树中的每个对象!但事实并非如此,而且我在合理化返回结果方面遇到了麻烦。目前,我还有许多其他测试已被注释掉,但是您可以取消注释并运行它们以查看更令人困惑的结果! 就像说,如果我想返回四叉树中的所有点,我该怎么做?使用形状的整个边界范围的检索方法?例如,retrieve(0,0,canvas.width,canvas.height)? 我正在使用的JavaScript QuadTree库已被其他各种来源引用,因此,我认为实际的实现是正确且信誉良好的。 我认为我的许多困惑可能源于对四叉树术语的误解。就像,为什么当“点”也具有width / height参数时,为什么用边界而不是尺寸?是约定俗成的问题还是它们的完全不同的概念? 谢谢你的时间!

2
旧版游戏中的数据结构
我对编程诸如NES的Super Mario Brothers和SNES的Super Mario World之类的旧游戏进行编程时使用的数据结构感到好奇。我的理解是,这段时期的游戏是汇编形式的。程序员是否定义/使用任何数据结构? 例如:当一组硬币出现在屏幕上时,如何存储它们?程序员只是使用数组吗?也许他们有链接列表? 干杯! 编辑:我对各种方法感兴趣...不一定是通用方法。 编辑2:在我的一些游戏中,我对收藏使用了一种(可能很糟糕的)方法,并且我想知道是否有任何较旧的游戏使用了类似的方法。我喜欢执行以下操作: // statically allocated arrays (max number of coins is 4) int coinsXs[4] = {0, 0, 0, 0}; int coinsYs[4] = {0, 0, 0, 0}; // bitset that keeps track of which coins are active int coinsActive = 0; // ... // …


2
我何时应将点和大小表示为结构?
作为我简单的Ruby 2D游戏开发框架的一部分,我的游戏对象具有位置(x和y值)和大小(宽度和高度)。 class MyGameObject attr_accessor :x attr_accessor :y attr_accessor :width attr_accessor :height ... 我见过的另一种方法是将位置视为Point结构,将大小视为Size结构: Point = Struct.new(:x, :y) Size = Struct.new(:width,:height) class MyGameObject attr_accessor :position # Point instance attr_accessor :size # Size instance ... 一些框架使用前者(我认为GDX,Gosu ...)。其他人则使用后者(cocos2d-iphone)。问题是,我不清楚这两种行为的优缺点(在游戏开发中)-我不知道为什么有些框架选择了一个而不选择了另一个。 我应该考虑重大差异吗?

2
如何定义充满水的区域?
我想通过漂亮的水仿真来增强我的小游戏引擎。首先,我需要找到一种在游戏中代表水的正确方法。不幸的是,我对代表的了解不多,所以我问你。我前段时间也曾问过类似的问题。但是由于我没有明确提出问题,答案是正确的,但不是我想要的。 在某些游戏中,水只是由高度确定的。例如,零高度以下的所有物体都在水下。我在大多数游戏中都看到了这种表现。问题是我希望在户外世界中不被淹没的洞穴以及每个湖泊和海洋的水位都不同的洞穴。 水的出现的另一种更精确的表示是颗粒。每个水滴都作为点存储在世界空间中。要渲染它们,我可以使用诸如metaball之类的技术,以便它们构建单个网格。这种表示形式对于现实主义非常有用,因为我可以轻松地计算出它们之间的动态关系。令人遗憾的是,没有机器可以实时计算大量的元弹。 还有其他方法可以代表发动机中的水吗?我想拥有动态湖泊,因此无法通过静态几何图形定义水域。例如,如果玩家修改地形以加宽湖泊,则水应填充该海湾,而湖泊的总水位应略有降低。

3
为什么不能将布尔值打包并对齐到D3D常量缓冲区中?
好吧,我很难将布尔值打包并对齐到hlsl常量缓冲区中,我不确定为什么。 这是hlsl中的缓冲区 cbuffer MaterialBuffer : register(b1) { float3 materialDiffuseAlbedo; float materialSpecularExponent; float3 materialSpecularAlbedo; bool isTextured; }; 这是用c ++编写的 struct GeometryBufferPass_MaterialBuffer { XMFLOAT3 diffuse; float specularExponent; XMFLOAT3 specular; bool isTextured; }; 我试图以各种方式移动布尔并填充结构,但是没有运气。正确的方法是什么?

2
在基于二维图块的游戏中,NPC和图块应如何相互引用?
我正在为自上而下的2D游戏制作图块引擎。基本上,世界是由瓷砖网格组成的。 现在,我想例如放置可以在地图上移动的NPC。 您认为最好的是: 每个图块都有一个指向其图块上的NPC的指针或NULL指针 有一个NPC列表,并且它们具有它们所在的图块的坐标。 还有什么吗 我认为 碰撞检测速度更快,但会占用更多的内存空间,并且在地图中查找所有NPC的速度也较慢。 相反。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.