游戏开发

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

5
为什么电脑游戏的大小差异如此之大?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 2年前关闭。 那里有很多PC游戏(看似)具有大致相同的图形(带有凹凸贴图,着色器等),声音复杂性和播放时间,但其中一个需要4GB的空间,而另一个需要13GB的空间。 这是为什么?为什么它们的大小相差这么大?
13 optimization  pc 

2
我应该如何检查玩家是否完成了一项成就?
我正在制作MMO游戏,而我刚到需要实现成就的地步...我该怎么做?最直接的方法是每100ms运行一次: for a in achievements for p in players if a.meetsRequirements(p) then p.completeAchievement(a) 但这只会带来更多的复杂性。例如,如何检查成就是否已经完成?玩家是否仅针对特定成就拥有自定义属性?我对任务进行了此类操作,因为它们主要是“收集100块木头”,因此玩家进行的主动任务会对此进行检查。另外,我认为必须有更好的时间来检查它,这会定期降低我的服务器的速度。

3
与外部组件管理者一起组织实体系统?
我正在为自上而下的多人2D射击游戏设计游戏引擎,我希望该引擎可以合理地重用于其他自上而下的射击游戏。目前,我正在考虑应如何设计其中的实体系统。首先,我想到了这一点: 我有一个叫做EntityManager的类。它应该实现一种称为Update的方法,以及另一个称为Draw的方法。之所以将Logic和Rendering分开是因为,如果运行独立服务器,则可以省略Draw方法。 EntityManager拥有BaseEntity类型的对象列表。每个实体都拥有一个组件列表,例如EntityModel(实体的可绘制表示),EntityNetworkInterface和EntityPhysicalBody。 EntityManager还拥有一个组件管理器列表,例如EntityRenderManager,EntityNetworkManager和EntityPhysicsManager。每个组件管理器都保留对实体组件的引用。有多种原因将此代码移出实体自己的类,而改为集体进行。例如,我使用游戏的外部物理库Box2D。在Box2D中,首先将实体和形状添加到一个世界(在本例中为EntityPhysicsManager拥有),然后添加碰撞回调(将在我的系统中分派给实体对象本身)。然后,您运行一个函数来模拟系统中的所有内容。我发现很难找到比在这样的外部组件管理器中更好的解决方案。 实体创建是这样完成的:EntityManager实现方法RegisterEntity(entityClass,factory),该方法注册如何创建该类的实体。它还实现了CreateEntity(entityClass)方法,该方法将返回BaseEntity类型的对象。 现在出现了我的问题:如何将对组件的引用注册到组件管理器?我不知道如何从工厂/关闭处引用组件管理器。

3
我应该包括多少成就,以及哪些挑战?
我知道这个问题是童话般的主观,但是我想知道是否有任何关于最佳成就是什么以及他们应该提出什么样的挑战的公开研究。这个问题直接相关的游戏是射击游戏,但是理想的答案是相当合理的。 如果成就太少,或者他们没有挑战性,我希望他们在实现目标的过程中会失败。如果人数太多,或者他们感到不合理的困难,我希望人们会很快放弃。我亲眼目睹了后者在《星际争霸2》中的发生。一个成就的部分会对你赢了几百对他们的AI对手的游戏(无聊!)

5
在纸牌游戏中,我将使用什么渲染技术为纸牌绘制阴影效果?
什么样的阴影算法可以用来创建像这样的阴影? 我正在制作的是类似的东西,但是都由OpenGL驱动的2D绘图API完成,因此没有Z坐标。 另外,对于手本身,我真的很想得到一种阴影效果,如下所示: 我只是不确定如何获得接近它的阴影外观。 卡的数量一定会发生变化,并且卡会扔到桌子上,所以我不能使用任何类型的光照图。 我应该研究哪种算法(除了模糊,我知道需要做些什么?) 谢谢 更新资料 我正在制作2D纸牌游戏。我想从卡上添加阴影阴影偏移,有点像: 我正在考虑的方式是: 保留与后缓冲大小相同的纹理。 绘制黑色矩形作为该纹理的临时卡片。 模糊该纹理。 用这种纹理画我的卡片。 对卡进行其他照明。 将此纹理绘制到后缓冲区。 我的问题是: 这是正确的方法吗? 有没有一种方法可以在不渲染纹理的情况下(保持位图 与后缓冲区一样大)? 是否可以安全地假定后 缓冲区大小不会超过最大纹理大小?(我的意思是,如果后缓冲区 为2000x3000,那么可以说我可以在 该大小的视频内存中创建纹理了吗? 谢谢

2
如何在射击游戏中实施聪明的敌人?
想象一下一个非常简单的射击游戏,众所周知: 您是玩家(绿色)。您的运动仅限于X轴。我们的一个或多个敌人位于屏幕的顶部,他的移动也仅限于X轴心。玩家向敌人发射子弹(黄色)。 我想为敌人实施一种AI,该AI应该真正擅长避免玩家的子弹。我的第一个想法是将屏幕分成多个独立的部分,并为其分配权重: 有两种重量:“子弹重量”(灰色)是子弹施加的危险。子弹离敌人越近,“子弹重量”(0..1,其中1是最高危险)越高。没有子弹的车道的权重为0。第二权重是“距离权重”(灰绿色)。对于每条车道,我都会增加0.2移动成本(此值现在是任意的,可以调整)。 然后,我简单地添加权重(白色)并转到权重最低的通道(红色)。但是这种方法有一个明显的缺陷,因为它很容易错过局部最小值,因为最佳的去处只是在两个传入的子弹之间(如白色箭头所示)。 所以这就是我要寻找的: 即使在没有没有施加子弹威胁的地方的情况下,也应该找到解决方法。 敌人可以通过选择最佳(或几乎最佳)解决方案来可靠地躲避子弹。 算法应该能够考虑子弹的移动速度(因为它们可能以不同的速度移动)。 调整算法的方法,以便可以应用不同级别的难度(对超级智能敌人是愚蠢的)。 算法应该允许不同的目标,因为敌人不仅想躲避子弹,还应该能够射击玩家。这意味着在躲避子弹时,应该优先选择敌人可以向玩家射击的位置。 那么您将如何解决呢?与这种类型的其他游戏相反,我只希望有几个但非常“熟练”的敌人,而不是愚蠢的敌人。


1
OpenGL / GLSL:渲染到立方体贴图?
我试图弄清楚如何将场景渲染为立方体贴图。我在这个问题上停留了一段时间,以为我会向你们寻求帮助。我是OpenGL的新手,这是我第一次使用FBO。 我目前有一个使用cubemap bmp文件的工作示例,片段着色器中的samplerCube样本类型附加到GL_TEXTURE1。我根本没有更改着色器代码。我只是改变了一个事实,即我不会调用正在加载cubemap bmp文件的函数,而是尝试使用以下代码来渲染到cubemap。 您可以在下面看到我还将纹理再次附加到GL_TEXTURE1。在设置制服时是这样的: glUniform1i(getUniLoc(myProg, "Cubemap"), 1); 它可以通过在我的片段着色器中访问它uniform samplerCube Cubemap。 我这样调用以下函数: cubeMapTexture = renderToCubeMap(150, GL_RGBA8, GL_RGBA, GL_UNSIGNED_BYTE); 现在,我意识到在下面的绘制循环中,我没有更改视图方向来向下看+ x,-x,+ y,-y,+ z,-z轴。我真的只是想在实现之前先看到一些东西。我认为我至少应该像现在的代码一样在对象上看到一些东西。 我什么也没看见,只是黑色。我将背景设为白色,但物体仍为黑色。我删除了照明和着色,仅对立方体贴图纹理进行采样,并且仍然为黑色。 我认为问题可能是设置纹理时的格式类型,即GL_RGB8,GL_RGBA,但我也尝试过: GL_RGBA,GL_RGBA GL_RGB,GL_RGB 我认为这是标准的,因为我们正在渲染附加到帧缓冲区的纹理,但是我看到了使用不同枚举值的不同示例。 我还尝试在每个要使用立方体贴图的绘制调用中绑定立方体贴图纹理: glBindTexture(GL_TEXTURE_CUBE_MAP, cubeMapTexture); 另外,我没有为大多数示例中看到的FBO创建深度缓冲区,因为我只想为我的立方体贴图使用颜色缓冲区。我实际上添加了一个,看是否是问题所在,但仍然得到了相同的结果。当我尝试时,我可能会捏造出来。 可以为我指明正确方向的任何帮助将不胜感激。 GLuint renderToCubeMap(int size, GLenum InternalFormat, GLenum Format, GLenum Type) { // color cube map GLuint textureObject; int face; …
13 opengl  glsl  cubemap 

4
如何在Minecraft风格的游戏中实现具有遮挡的基于体素的照明?
我正在使用C#和XNA。我当前的照明算法是一种递归方法。但是,这样做很昂贵,以至于每5秒计算一个8x128x8块。 还有其他照明方法会产生可变暗度阴影吗? 还是递归方法好,也许我只是做错了? 似乎递归的东西从根本上来说是昂贵的(每个块被迫遍历约25k块)。我当时正在考虑使用一种类似于光线跟踪的方法,但是我不知道这将如何工作。我尝试的另一件事是将光源存储在一个列表中,并为每个块获取到每个光源的距离,并使用该光源将其照亮到正确的水平,但随后照明将穿过墙壁。 我当前的递归代码如下。在清除并重新添加阳光和手电筒之后,从不具有零光照水平的块中的任何位置调用此方法。 world.get___at是一个可以在该块之外获取块的函数(该块位于块类内部)。Location是我自己的结构,类似于Vector3,但是使用整数而不是浮点值。light[,,]是该块的光照图。 private void recursiveLight(int x, int y, int z, byte lightLevel) { Location loc = new Location(x + chunkx * 8, y, z + chunky * 8); if (world.getBlockAt(loc).BlockData.isSolid) return; lightLevel--; if (world.getLightAt(loc) >= lightLevel || lightLevel <= 0) return; if (y < 0 || …


6
我应该考虑游戏开发的研究生学位吗?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 6年前关闭。 我相信你们一定可以帮上忙。一些大学,例如NCSU,USC,UCSC为其硕士学位,提供基于游戏和游戏开发的课程(有些称其为“计算机科学硕士”,重点是游戏开发)。我对该领域非常感兴趣,因此想尝试一下。但是由于硕士学位的成本很高,因此我也必须考虑未来的前景。我想知道在考虑职业时这是否是正确的课程。有什么意见或想法吗?有人遵循过这个职业路线吗?

4
隐藏玩家的游戏数据?
我正在开发我的第一个(C ++)游戏,并且我想使用基于组件的设计。我最近已经阅读了很多有关此内容的信息,昨天我决定将对象数据存储在外部JSON文件中,以提供更大的灵活性和访问便利性。 然后我突然意识到,将这些文件保留在游戏的目录树中将使玩家可以非常轻松地修改他们想要的任何内容。 我不担心向开发人员展示代码,因为该游戏将是开源的,但我担心经验不足的游戏玩家可能会破坏游戏或至少破坏游戏的乐趣。 我想念什么吗?隐藏游戏数据(在开源游戏中)有什么政策?让所有人都能清楚地访问所有内容是否正常? 如果没有,什么是隐藏数据的好方法?
13 c++  data 


2
DirectX11,如何管理和更新多个着色器常量缓冲区?
好吧,我很难理解常量缓冲区如何绑定到流水线阶段并进行更新。我知道DirectX11每阶段最多可以有15个着色器常量缓冲区,每个缓冲区最多可以容纳4096个常量。但是,我不明白用于与常量缓冲区交互的ID3D11Buffer COM是否只是用于填充这些缓冲区插槽的机制(或句柄),还是该对象是否实际引用了来回推送的缓冲区数据的特定实例?在GPU和CPU之间。 我认为我对该主题的困惑是导致我使用两个不同的常量缓冲区的问题的原因。 这是一些示例着色器代码。 cbuffer PerFrame : register(b0) { float4x4 view; }; cbuffer PerObject : register(b1) { float4x4 scale; float4x4 rotation; float4x4 translation; }; 我的代码的组织方式,相机将处理更新相关的每帧数据,而GameObjects将更新其自己的每对象数据。这两个类都有自己的ID3D11Buffer来执行此操作(使用集线器体系结构,因此一个GameObject类将处理世界上所有实例GameObject的呈现)。 问题是我一次只能更新一个,具体取决于插槽,并且我假设一个缓冲区被填充,而另一个缓冲区被填充为零的更新顺序。 这本质上是我的代码。这两个类使用相同的更新逻辑。 static PerObjectShaderBuffer _updatedBuffer; // PerFrameShaderBuffer if Camera class _updatedBuffer.scale = _rScale; _updatedBuffer.rotation = _rRotation; _updatedBuffer.translation = _rTranslation; pDeviceContext->UpdateSubresource(pShaderBuffer, 0 , 0, &_updatedBuffer, 0, …


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.