游戏开发

专业和独立游戏开发人员的问答

4
在冒险游戏中编码不同的状态
我正在计划一款冒险游戏,无法根据故事的进展状态弄清楚实现关卡行为的正确方法。 我的单人游戏拥有一个巨大的世界,玩家必须在游戏中的各个点与城镇中的人们互动。但是,根据故事的进展,会向玩家呈现不同的内容,例如,行会领导将地点从城镇广场更改为城市的各个地点;门仅在完成特定例程后的一天中的特定时间才能解锁;仅在达到特定里程碑后,才会发生不同的切换屏幕/触发事件。 我天真地想到了最初使用switch {}语句来决定NPC应该说什么或可以找到NPC的想法,并且只有在检查了全局game_state变量的条件之后,才能使任务目标可交互。但是我意识到,为了改变对象的行为,我会很快遇到很多不同的游戏状态和切换情况。该switch语句也将非常难以调试,而且我猜它可能也很难在关卡编辑器中使用。 所以我想,不是让单个对象具有多个状态,而是应该让同一个对象的多个实例具有一个状态。这样,如果我使用诸如关卡编辑器之类的工具,则可以将NPC的实例放置在他可能出现的所有不同位置,也可以将其放置在每个对话状态的实例。但这意味着在关卡周围会漂浮着许多不活跃,不可见的游戏对象,这可能会给内存带来麻烦,或者在关卡编辑器中很难看到,我不知道。 或者简单地为每个游戏状态创建一个相同但独立的级别。这感觉是最干净,没有错误的处理方式,但是感觉就像是大量的手工工作,以确保该关卡的每个版本确实彼此相同。 我所有的方法都觉得效率低下,所以回顾一下我的问题,是否有更好的或标准化的方法来实现根据故事进展状态来实现某个级别的行为? PS:我还没有关卡编辑器-考虑使用JME SDK之类的东西还是自己制作。

4
循环类依赖
有两个彼此需要的类是不好的设计吗? 我正在写一个小游戏,其中有一个GameEngine包含一些GameState对象的类。要访问几种渲染方法,这些GameState对象还需要了解GameEngine类-因此是循环依赖项。 您会称这个设计不好吗?我只是问,因为我不太确定,目前我仍然可以重构这些东西。
12 c++  architecture 

1
构建RTS的要点[关闭]
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,使其成为Game Development Stack Exchange 的主题。 去年关闭。 我想知道如果任何人有任何联系,以良好的读取或书籍中关于事情想开发一个RTS游戏时一下,我就一直在读的东西像这个和这个,但想了解更多进去。 我也有开发经验,很快想自己开始构建框架,但是如果有人有关于该过程的任何其他文章(不是关于编程的,而是关于计划的),那将是很大的帮助。
12 rts  planning 

1
如何在屏幕边缘绘制一个箭头,使其指向屏幕外的对象?
我希望执行本主题中描述的操作: http://www.allegro.cc/forums/print-thread/283220 我尝试了这里提到的各种方法。 首先,我尝试使用Carrus85描述的方法: 只需取两个三角形斜边的比率即可(与另一个三角形无关),我建议将点1和点2作为计算的距离。这将为您提供从较大三角形到角落的三角形的长宽比百分比。然后,您只需将deltax乘以该值即可得到x坐标偏移,然后将deltay乘以该值即可得到y坐标偏移。 但是我找不到一种方法来计算对象离屏幕边缘的距离。 然后,我尝试使用23yrold3yrold建议的射线投射(以前从未做过): 从屏幕中心向屏幕外对象发射光线。计算射线在矩形上的相交位置。有你的座标。 我首先计算了由两点的x和y位置差异形成的三角形的斜边。我用它沿着那条线创建了一个单位向量。我遍历该向量,直到x坐标或y坐标不在屏幕上。然后,两个当前的x和y值形成箭头的x和y。 这是我的光线投射方法的代码(用C ++和Allegro 5编写) void renderArrows(Object* i) { float x1 = i->getX() + (i->getWidth() / 2); float y1 = i->getY() + (i->getHeight() / 2); float x2 = screenCentreX; float y2 = ScreenCentreY; float dx = x2 - x1; float dy = y2 …

6
球物理:在球静止时平滑最终的反弹
在我的小弹跳球游戏中,我遇到了另一个问题。 我的球反弹得很好,除了最后一刻即将停止。球的运动对于主体部分来说是平滑的,但是直到最后,当球落在屏幕底部时,它会突然抽动一段时间。 我能理解为什么会这样,但是我似乎无法解决。 如有任何建议,我将不胜感激。 我的更新代码是: public void Update() { // Apply gravity if we're not already on the ground if(Position.Y < GraphicsViewport.Height - Texture.Height) { Velocity += Physics.Gravity.Force; } Velocity *= Physics.Air.Resistance; Position += Velocity; if (Position.X < 0 || Position.X > GraphicsViewport.Width - Texture.Width) { // We've hit a …
12 xna  c#  physics 

1
自由空间中的高效寻路
我在太空中有一个游戏,我想发布移动指令,这需要寻路。现在,据我了解,A *等主要适用于树,而不适用于没有寻路节点的空白空间。我有一些障碍,目前表示为固定的AABB,即没有无限的“地形”障碍。另外,我希望大多数障碍物可以合理地近似为立方体或球体。 因此,我一直在考虑应用一种更简单的寻路算法-即简单地将射线从当前位置投射到目标位置,然后可以使用空间划分相对较快地获得障碍列表。我不太确定的是如何确定有序单位在障碍物周围进行操纵的部位。 到目前为止,我一直在想的是,我将仅使用潜在的场-即,所有单元都将感觉到彼此相互排斥的强大排斥力,而向目标点施加了适度的排斥力。这还有一个优势,就是发出团体命令,我可以简单地向另一个实体订购一支中级部队。但这显然无法实现最佳解决方案。 给定我的参数,势场会达到合理的近似值,还是我需要其他解决方案?
12 c++  path-finding 

6
当资源快要用尽时,如何在工厂之间公平地分配资源?
我游戏的主要资源是mass,存储为随时间变化的浮点数。资源节点增加了质量,工厂将其排干了。例如,如果我有一个资源节点每秒产生5个质量,那么我将在5 * deltaT每个游戏步骤中获得质量。质量显示四舍五入到最接近的整数,并且增益/损耗指示器显示十分之一。 我应该如何处理质量达到零的问题?如果多个工厂试图一次建立工厂,这将产生竞争条件:工厂排在第一位,或者消耗较少资源的工厂一旦获得更多资源而获得优先权,因此建造速度比其他工厂快。 我该如何处理?我应该完全跳过这一步吗?

1
如何通过网络保持数据结构同步?
语境 在我正在开发的游戏中(一点点点击的图形冒险),游戏世界中发生的几乎所有事情都由动作管理器控制,该动作管理器的结构有点像: 因此,例如,如果检查对象的结果使角色打招呼,走了一下然后坐下,我只需生成以下代码: var actionGroup = actionManager.CreateGroup(); actionGroup.Add(new TalkAction("Guybrush", "Hello there!"); actionGroup.Add(new WalkAction("Guybrush", new Vector2(300, 300)); actionGroup.Add(new SetAnimationAction("Guybrush", "Sit")); 这将创建一个新的操作组(上图中的整行)并将其添加到管理器中。所有组的并行执行,但动作内各组链接在一起,使得第二一个只有第一个完成之后开始。当组中的最后一个动作完成时,该组将被销毁。 问题 现在,我需要在网络上复制此信息,以便在多人游戏会话中,所有玩家都可以看到同一件事。序列化各个动作不是问题。但是,在联网方面,我绝对是初学者,我有几个问题。为了简化讨论,我认为我们可以将动作管理器组件抽象为简单的: var actionManager = new List<List<string>>(); 如何继续使所有播放器之间的上述数据结构的内容保持同步? 除了核心问题之外,我还涉及其他一些问题(即,上述同一问题的所有可能含义): 如果我使用服务器/客户端体系结构(其中一个玩家同时充当服务器和客户端),并且其中一个客户端产生了一组操作,那么他应该将它们直接添加到管理器中,还是只发送请求到服务器,这又将命令每个客户端添加该组? 丢包之类的呢?游戏是确定性的,但我认为客户执行的动作顺序中的任何差异都可能导致世界状态不一致。我该如何防范此类问题? 如果我一次添加太多操作怎么办,这不会引起连接问题吗?有什么缓解的办法吗?

2
我正在寻找使用向量创建逼真的汽车运动
我已经仔细检查了如何执行此操作,并找到了此http://www.helixsoft.nl/articles/circle/sincos.htm我已经尝试了一下,但是显示的大多数功能都无法正常工作,我只是出错了因为它们不存在。我看过cos和sin函数,但不了解如何使用它们或如何使用矢量使汽车运动正常工作。我没有代码,因为我不确定该怎么办。 任何帮助表示赞赏。 编辑: 我有一些限制,必须在我的游戏中使用TL引擎,不允许添加任何形式的物理引擎。必须使用c ++编程。这是我尝试遵循我提供的链接中所做的操作后得到的示例。 if(myEngine->KeyHeld(Key_W)) { length += carSpeedIncrement; } if(myEngine->KeyHeld(Key_S)) { length -= carSpeedIncrement; } if(myEngine->KeyHeld(Key_A)) { angle -= carSpeedIncrement; } if(myEngine->KeyHeld(Key_D)) { angle += carSpeedIncrement; } carVolocityX = cos(angle); carVolocityZ = cos(angle); car->MoveX(carVolocityX * frameTime); car->MoveZ(carVolocityZ * frameTime);

4
如何确定等轴测视图Flash游戏中的绘制顺序?
这是用于Flash游戏的等轴测视图。我需要知道如何对对象进行排序,以便在绘制时无需进行z缓冲区检查。这似乎很容易,但是还有一个限制,一个场景可以有10,000+个对象,因此算法需要以小于O(n ^ 2)的速度运行。所有对象都是矩形框,场景中移动了3-4个对象。最好的方法是什么? 更新 在每个图块中只有一个对象(我的意思是对象不能彼此堆叠)。并且我们访问的对象图和对象图都有自己的位置。 更新2 看到这些数字: 首先应先绘制蓝色对象,然后绘制绿色,然后绘制红色。而在第二个中,您必须以相反的顺序绘制它们。您需要先绘制红色,然后绘制绿色,最后绘制蓝色的对象。如您所见,蓝色和红色物体的位置没有差异,它们与相机的距离都不同,依此类推。但是由于它们相对于绿色框的相对位置,您需要在两个图像之间更改其绘制顺序。这就是使这个问题变得一团糟的原因。 旁注:由于所有对象都是直角棱镜,因此在数学上可以证明至少有一个绘制顺序可以满足问题的需要。

4
用SAT查找接触点
分离轴定理(SAT)使确定最小平移向量(即可以分离两个碰撞对象的最短向量)变得简单。但是,我需要的是沿着穿透物体正在移动的向量(即接触点)将物体分开的向量。 我画了一幅画以帮助澄清。有一个框,从前面的位置移动到后面的位置。在其后位置,它与灰色多边形相交。SAT可以轻松返回MTV,这是红色矢量。我正在寻找计算蓝色向量。 我当前的解决方案在前后位置之间执行二进制搜索,直到已知蓝色矢量的长度达到某个阈值为止。它可以工作,但是这是一个非常昂贵的计算,因为需要在每个循环中重新计算形状之间的冲突。 有没有更简单和/或更有效的方法来找到接触点矢量?

2
C ++上的随机数
最近,我习惯了现代语言,其中包括一个很好的随机生成器,通常是Mersenne Twister。回到C ++之后,我必须决定使用什么。 我搜索了Mersenne Twister实现,然后发现有这么多实现:是否有一种使用更广泛,使用更广泛的实现,还是应该假设它们都一样好而选择一种?
12 c++  random 

1
我应该如何取消绑定和删除OpenAL缓冲区?
我正在使用OpenAL播放声音。我正在尝试实现即弃即用播放功能,该功能采用缓冲区ID并将其分配给我先前已分配的池中的源,并进行播放。但是,对象生存期存在问题。 在OpenGL中,删除功能可以自动解除绑定(例如纹理),或者在最终解除绑定时自动删除(例如着色器),因此通常易于管理删除。但是alDeleteBuffers,AL_INVALID_OPERATION如果缓冲区仍绑定到源,则会简单地失败。 是否有一种惯用的方式来“删除” OpenAL缓冲区,使它们可以完成播放,然后自动解除绑定,从而真正解除绑定?我是否需要将缓冲区管理更深入地绑定到源池中(例如,删除缓冲区还需要检查所有分配的源)? 同样,在结束播放时,是否有一种惯用的方式来解除绑定(但不删除)缓冲区?如果当我在寻找免费资源时,只需要查看是否附加了缓冲区,而不必费心检查源状态,那将是很好的。 (尽管使用C的方法也不错,但我使用的是C ++。假设使用GCd语言并使用终结器的方法可能不适用。)
12 openal 

4
面向对象的OpenGL
我使用OpenGL已经有一段时间了,并且阅读了大量的教程。除了它们中的许多仍在使用固定管道这一事实外,它们通常会将所有的初始化,状态更改和绘制都放在一个源文件中。对于教程的有限范围来说,这很好,但是我很难确定如何将其扩展到完整的游戏。 如何将OpenGL的使用跨文件分割?从概念上讲,我可以看到拥有一个仅将内容渲染到屏幕上的渲染类的好处,但是诸如着色器和灯光之类的东西将如何工作?我应该为灯光和着色器之类的课程设置单独的类吗?

2
C#创建一个简单的蛇游戏
我当时正在考虑使用C#创建蛇游戏,所以我脑子里有了想法,但出现了一些问题。 我该如何跟踪并输出在蛇头后面运行的块的正确位置? 如果蛇是由五个块组成,并且用户开始绕圈走,我如何在正确的位置打印蛇的身体? 另外,无论用户做什么,我如何创建一个在后台运行的动作,它将使蛇向前移动? 我的代码应具有什么结构?(代码设计结构) 这应该是一个控制台应用程序,因为它是我所熟悉的唯一框架。 我不是要查找完成的代码,因为我想真正了解它应该如何工作。
12 c# 

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.